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 the For 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}
    Create Output Work Item
    Set Work Item Variable    ${WORK_ITEM_NAME}    ${payload}
    Save Work Item

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}]