Loop the work items in the consumer robot
You decide to start by implementing a simple consumer that gets the work items produced by the producer robot but does not do anything with them yet:
Small steps!
consumer.robot
:
*** Settings ***
Documentation Inhuman Insurance, Inc. Artificial Intelligence System robot.
... Consumes traffic data work items.
Library RPA.Robocorp.WorkItems
*** Tasks ***
Consume traffic data work items
For Each Input Work Item Process traffic data
*** Keywords ***
Process traffic data
${payload}= Get Work Item Payload
- The
For Each Input Work Item
provides a convenient way for looping all the available work items. It takes a keyword as an argument. ("Hey, work item library! For each work item you find, call this keyword. Thanks!") - The
Get Work Item Payload
keyword gets the payload from the currently loaded work item. You don't have to manually loop or load the work items since theFor Each Input Work Item
keyword takes care of that automatically.
This time you run the consumer task and select one of the outputs generated by the producer robot as an input for this consumer robot.
The log shows each work item payload:
${payload} = {'traffic_data': {'country': 'VCT', 'year': 2011, 'rate': 3.69293}}
The sales system API expects only the data currently contained inside the traffic_data
property. You get the relevant data out of the payload:
consumer.robot
:
*** Settings ***
Documentation Inhuman Insurance, Inc. Artificial Intelligence System robot.
... Consumes traffic data work items.
Library RPA.Robocorp.WorkItems
*** Tasks ***
Consume traffic data work items
For Each Input Work Item Process traffic data
*** Keywords ***
Process traffic data
${payload}= Get Work Item Payload
${traffic_data}= Set Variable ${payload}[traffic_data]
Now you have the traffic data in a format that the sales system API should accept:
${traffic_data} = {'country': 'VCT', 'year': 2011, 'rate': 3.69293}
DRY - Don't Repeat Yourself - library imports and variables
To use the work item functionality, you imported the RPA.Robocorp.WorkItems
. Now you have the same library import on both the producer and the consumer robot. You also use the same work item variable name (traffic_data
) in two places.
You decide to take the shared.robot
into good use and move the library import and the work item variable name there:
shared.robot
:
*** Settings ***
Documentation Inhuman Insurance, Inc. Artificial Intelligence System robot.
... Shared settings and code.
Library RPA.Robocorp.WorkItems
*** Variables ***
${WORK_ITEM_NAME}= traffic_data
Next, you remove the RPA.Robocorp.WorkItems
library import from both the producer.robot
and the consumer.robot
and import the shared.robot
as a resource instead.
Finally, you replace the traffic_data
instances with ${WORK_ITEM_NAME}
. Very DRY!
producer.robot
:
*** Settings ***
Documentation Inhuman Insurance, Inc. Artificial Intelligence System robot.
... Produces traffic data work items.
Library Collections
Library RPA.HTTP
Library RPA.JSON
Library RPA.Tables
Resource shared.robot
*** Variables ***
${TRAFFIC_JSON_FILE_PATH}= ${OUTPUT_DIR}${/}traffic.json
# JSON data keys:
${COUNTRY_KEY}= SpatialDim
${GENDER_KEY}= Dim1
${RATE_KEY}= NumericValue
${YEAR_KEY}= TimeDim
*** Tasks ***
Produce traffic data work items
Download traffic data
${traffic_data}= Load traffic data as table
${filtered_data}= Filter and sort traffic data ${traffic_data}
${filtered_data}= Get latest data by country ${filtered_data}
${payloads}= Create work item payloads ${filtered_data}
Save work item payloads ${payloads}
*** Keywords ***
Download traffic data
Download
... https://github.com/robocorp/inhuman-insurance-inc/raw/main/RS_198.json
... ${TRAFFIC_JSON_FILE_PATH}
... overwrite=True
Load traffic data as table
${json}= Load JSON from file ${TRAFFIC_JSON_FILE_PATH}
${table}= Create Table ${json}[value]
RETURN ${table}
Filter and sort traffic data
[Arguments] ${table}
${max_rate}= Set Variable ${5.0}
${both_genders}= Set Variable BTSX
Filter Table By Column ${table} ${RATE_KEY} < ${max_rate}
Filter Table By Column ${table} ${GENDER_KEY} == ${both_genders}
Sort Table By Column ${table} ${YEAR_KEY} False
RETURN ${table}
Get latest data by country
[Arguments] ${table}
${table}= Group Table By Column ${table} ${COUNTRY_KEY}
${latest_data_by_country}= Create List
FOR ${group} IN @{table}
${first_row}= Pop Table Row ${group}
Append To List ${latest_data_by_country} ${first_row}
END
RETURN ${latest_data_by_country}
Create work item payloads
[Arguments] ${traffic_data}
${payloads}= Create List
FOR ${row} IN @{traffic_data}
${payload}=
... Create Dictionary
... country=${row}[${COUNTRY_KEY}]
... year=${row}[${YEAR_KEY}]
... rate=${row}[${RATE_KEY}]
Append To List ${payloads} ${payload}
END
RETURN ${payloads}
Save work item payloads
[Arguments] ${payloads}
FOR ${payload} IN @{payloads}
Save work item payload ${payload}
END
Save work item payload
[Arguments] ${payload}
${variables}= Create Dictionary ${WORK_ITEM_NAME}=${payload}
Create Output Work Item variables=${variables} save=True
consumer.robot
:
*** Settings ***
Documentation Inhuman Insurance, Inc. Artificial Intelligence System robot.
... Consumes traffic data work items.
Resource shared.robot
*** Tasks ***
Consume traffic data work items
For Each Input Work Item Process traffic data
*** Keywords ***
Process traffic data
${payload}= Get Work Item Payload
${traffic_data}= Set Variable ${payload}[${WORK_ITEM_NAME}]