tokenika / eosfactory

Python-based EOS smart-contract development & testing framework
http://eosfactory.io/
Other
243 stars 62 forks source link

Support for dictionaries to supply action data #38

Closed andresberrios closed 6 years ago

andresberrios commented 6 years ago

I don't see why the action data should be specified as a JSON string. It would be much nicer to write if the data parameters for pushing actions would be python dicts that simply get converted to JSON internally before sending to cleos. Of course directly writing JSON strings would still be supported.

What do you think?

jakub-zarembinski commented 6 years ago

Thank you for your message - it has prompted us to improve our code.

The problem is that EOSIO has a specific requirement regarding the JSON standard: in EOSIO the order of parameters does matter (even though they are named). Hence, using Python dicts becomes problematic, as JSON does not care about ordering.

But we agree with your suggestion: our current implementation is a bit awkward.

So we'll be changing it in the coming release.

Instead of the current syntax looking like this:

account_tic_tac_toe.push_action(
    "create", 
    '{"challenger":"' + str(account_alice) 
        +'", "host":"' + str(account_carol) + '"}',
    account_carol)

... we'll be introducing something like this:

account_tic_tac_toe.push_action(
    "create", 
    '''{
        "challenger": "account_alice",
        "host": "account_carol"
    }''',
    account_carol)

EDIT: It turns out we've made a mistake - EOSIO does NOT require ordering of parameters, as I suggested above, so applying Python dicts actually makes perfect sense. Thanks for the tip!

This allows us to achieve a much cleaner syntax, for example:

account_tic_tac_toe.push_action(
  "move", 
  {
    "challenger": account_alice,                 
    "host": account_carol,
    "by": account_carol, 
    "row": 0, "column": 0 
  },
  account_carol)