A Task to Retrieve URL Content

There have been several times that I have found that it would be useful if my todo list would react to another site. For example, if a business is temporary closed for a pandemic, I would like a todo item activated when it is open again. Another use case is moving the task of watering plants to a later date when it is likely to rain.

The method PRScheduledTaskExamples>>reportCheck:thenRetrieveLink:using:onPageAt: implements this for Scheduled Tasks, steps are:

  1. The report check to determine if it should proceed by returning true or false. It accepts the report page as an argument.
  2. Retrieve the contents of the URL, handle any connection errors by displaying in the report page
  3. Pass the URL contents to the using-block. This should return a string to be displayed on the report page

This code should be loaded into a newer version of Pharo 8, using older version (like from this problem) had image crashes retrieving https URLs.

Testing - Reading this page:

  1. Create a ToDo List with two tasks:
    1. One task is Use My Subscription to The Business - Repeats every 5 days
    2. Second is Check the Business
      • it repeats every 10 minutes and has a report child with empty text
      • The check task has the contents: (PRScheduledTaskExamples newForKernelNamed: 'pier') reportCheck: [ :page | '*Aug*' match: page contents ] thenRetrieveLink: 'http://www.myborden.com/pier/john-c-borden/updates/todo-retrieves-url' using: [ :string | ('*temporary closed for a pandemic*' match: string) ifTrue: [ (PRPathLookup start: (PRKernel instanceNamed: 'pier') root path: '/Todo/Use My Subscription to The Business') hideFromMenus: true. 'the business is still closed' ] ifFalse: [ (PRPathLookup start: (PRKernel instanceNamed: 'pier') root path: '/Todo/Use My Subscription to The Business') hideFromMenus: false. (PRPathLookup start: (PRKernel instanceNamed: 'pier') root path: '/Todo/Check the Business') deautomate. 'Open for business' ] ] onPageAt: '/Todo/Check the Business/report'.
      • Automate this task by running in the image: (PRPathLookup start: (PRKernel instanceNamed: 'pier') root path: '/Todo/Check the Business') automate.
      • inspect: TaskScheduler allInstances anyOne to ensure that this is running
  2. Wait 10 minutes, the report page should display that the check failed, but it lists the date (testing this in August)
  3. Wait 10 minutes more, check the page again. The 'Use My Subscription' should be hidden, the 'Check' should report that the business is closed
  4. Update the page at the URL, change the spelling of the checked words
  5. Wait 10 minutes
  6. The Subscription tasks should be visible again
  7. Check again: TaskScheduler allInstances anyOne inspect - The check business task should not be present

Design Choices

Fetching the contents of a URL is quite time-consuming, and introduces additional dependencies on other systems. For tasks like monitoring another site, this is the intention so the check block can simply be: [ :ignore | true ] and the check won't fail. Other examples like the plant watering example can check the state of the other tasks. Using the report page (like the testing example) allow it to implement a state-machine.

Code changed for this includes:

  • Adding PRToDoTask>>deautomate
  • Modify PRToDo>>tasks to only return tasks which are not hidden from the menus
  • For some reason, JQAjax>>callback: still had a call to #fixCallbackTemps, this has been removed from Pharo 8
Posted by John Borden at 28 August 2020, 2:07 am link