From 8907b9f85f352c912da6b8b80fc420a77b6dfb2e Mon Sep 17 00:00:00 2001 From: John Freeman Date: Wed, 4 Mar 2020 13:44:18 -0600 Subject: [PATCH 1/7] Add Python demo --- python/README.md | 10 ++++++++++ python/main.py | 35 +++++++++++++++++++++++++++++++++++ python/pyproject.toml | 16 ++++++++++++++++ python/python-demo.png | Bin 0 -> 36856 bytes 4 files changed, 61 insertions(+) create mode 100644 python/README.md create mode 100644 python/main.py create mode 100644 python/pyproject.toml create mode 100644 python/python-demo.png diff --git a/python/README.md b/python/README.md new file mode 100644 index 0000000..261fd9b --- /dev/null +++ b/python/README.md @@ -0,0 +1,10 @@ +# Python Demo + +![screenshot of demo in terminal](./python-demo.png) + +Demonstrates [xpring-py](https://github.com/thejohnfreeman/xpring-py). + +``` +$ poetry install +$ poetry run python main.py +``` diff --git a/python/main.py b/python/main.py new file mode 100644 index 0000000..c038c02 --- /dev/null +++ b/python/main.py @@ -0,0 +1,35 @@ +import time + +import xpring + + +url = '3.14.64.116:50051' +seed = 'ss9unxUg8VgvDjWrogKGVDiRRz97n' +recipient = 'rNJDvXkaBRwJYdeEcx9pchE2SecMkH3FLz' +amount = '10' + +print(f'Using rippled node located at: {url}') +client = xpring.Client.from_url(url) + +wallet = xpring.Wallet.from_seed(seed) +address = wallet.address + +print(f'Retrieving balance for {address}') +balance = client.get_balance(address) +print(f'Balance was {balance} drops!') + +print('Sending:') +print(f'- Drops: {amount}') +print(f'- To: {recipient}') +print(f'- From: {address}') +signed_transaction = client.send(wallet, recipient, amount) +client.submit(signed_transaction) + +txid = signed_transaction['hash'] +print('Hash for transaction:') +print(txid) + +time.sleep(5) +transaction_status = client.get_transaction_status(txid) +print('Result for transaction is:') +print(transaction_status.name) diff --git a/python/pyproject.toml b/python/pyproject.toml new file mode 100644 index 0000000..9c6e993 --- /dev/null +++ b/python/pyproject.toml @@ -0,0 +1,16 @@ +[tool.poetry] +name = "xpring-demo" +version = "1.0.0" +description = "Demonstration of xpring-py" +authors = ["Xpring Engineering"] +license = "MIT" + +[tool.poetry.dependencies] +python = "^3.6" +xpring = {version = "^0.4.3", extras = ["py"]} + +[tool.poetry.dev-dependencies] + +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" diff --git a/python/python-demo.png b/python/python-demo.png new file mode 100644 index 0000000000000000000000000000000000000000..95ddd6dcc29622a6102ed9e3f06f7f51399c1889 GIT binary patch literal 36856 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 z�{DK(LybKvnm~?(*I&FyZN}tmL}IbtDFu9W;5P1$iNQmA<2-ix>C8M@x^vH#k?m zOPz`Cy>S_ni79BX^7KxT`6xAv5fKqe%PTASLwET2Zlyf+v!vs!v{__>j1idNv1o}k zONp%TR8)w*Fy2R6v<3-Rs(E?INU5rGV`NAVjrV=T*f2)&^ljoDumyDwS2v$r3GW(ASpnrJ%MTy zaE27Ofio#Z0jP&MFFexy8l};S_~)<=o}y*VPPSUvf(k6pdQOa2n~qX${VfcF`u@1s zC@0~IYVj2=t|E7_!o58QChZE?LtA@v;Nr4cjJ+BeRab<&1MEmZY%D{O)Sk^)SCcxtFUDi%kh(Cbb4yd$&#H?2!+;O7}_7#}pz&MBn zMmR}#atm-VYA^l13=kcHLV-$FPe

k9a;zQzvLr?;+DOuSV( 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�)<&HDyYH%=*m9)?!(*5@RvLRL~T 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 literal 0 HcmV?d00001 From 3342b22605a290e2dee87ca6febe1c7499c2572b Mon Sep 17 00:00:00 2001 From: John Freeman Date: Thu, 5 Mar 2020 11:06:38 -0600 Subject: [PATCH 2/7] Fix style --- python/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/main.py b/python/main.py index c038c02..39bdd29 100644 --- a/python/main.py +++ b/python/main.py @@ -2,7 +2,6 @@ import xpring - url = '3.14.64.116:50051' seed = 'ss9unxUg8VgvDjWrogKGVDiRRz97n' recipient = 'rNJDvXkaBRwJYdeEcx9pchE2SecMkH3FLz' From 2699efcc9a963420c4fc0fb608b189c2f834921a Mon Sep 17 00:00:00 2001 From: John Freeman Date: Thu, 5 Mar 2020 11:06:59 -0600 Subject: [PATCH 3/7] Add CircleCI step for Python demo --- .circleci/config.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5763bd0..6f90c01 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,6 +11,10 @@ jobs: name: "Install tooling" command: brew install swiftlint maven + - run: + name: "Install Poetry" + command: curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python + - run: name: "Run Node SDK Demo" command: cd node && npm i && node src/index-xrp.js @@ -34,3 +38,7 @@ jobs: - run: name: "Run Java ILP SDK Demo" command: cd java && mvn package && mvn exec:java@ilp + + - run: + name: "Run Python SDK Demo" + command: cd python && poetry install && poetry run python main.py From 26aab38660b3f5c3e9b999a855fcf996dca7568a Mon Sep 17 00:00:00 2001 From: John Freeman Date: Thu, 5 Mar 2020 11:10:40 -0600 Subject: [PATCH 4/7] Add Python demo to README --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f109acc..d4f5a36 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ # Xpring-SDK-Demo Demos for each library in [Xpring SDK](http://github.com/xpring-sdk): -- [JavaScript / Xpring-JS](http://github.com/xpring-eng/xpring-js): `node/` -- [Java / Xpring4J](http://github.com/xpring-eng/xpring4j): `java/` -- [Swift / XpringKit](http://github.com/xpring-eng/xpringkit): `swift/` +- JavaScript / [Xpring-JS](http://github.com/xpring-eng/xpring-js): [`node/`](./node) +- Java / [Xpring4J](http://github.com/xpring-eng/xpring4j): [`java/`](/.java) +- Swift / [XpringKit](http://github.com/xpring-eng/xpringkit): [`swift/`](./swift) +- Python / [xpring-py](https://github.com/thejohnfreeman/xpring-py): [`python/`](./python) Build instructions included in each folder. From fb317d19450602a512ce2179d6609b8866f95a76 Mon Sep 17 00:00:00 2001 From: John Freeman Date: Wed, 11 Mar 2020 12:03:39 -0500 Subject: [PATCH 5/7] Update RPC server URL --- python/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/main.py b/python/main.py index 39bdd29..00c3359 100644 --- a/python/main.py +++ b/python/main.py @@ -2,7 +2,7 @@ import xpring -url = '3.14.64.116:50051' +url = 'test.xrp.xpring.io:50051' seed = 'ss9unxUg8VgvDjWrogKGVDiRRz97n' recipient = 'rNJDvXkaBRwJYdeEcx9pchE2SecMkH3FLz' amount = '10' From b0a798c9a31140cc34cddbbb2cf4315d399d9e28 Mon Sep 17 00:00:00 2001 From: John Freeman Date: Tue, 12 May 2020 11:11:59 -0500 Subject: [PATCH 6/7] Install gmp on MacOS for xpring-py --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6f90c01..2d60eab 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,7 +9,7 @@ jobs: - run: name: "Install tooling" - command: brew install swiftlint maven + command: brew install swiftlint maven gmp - run: name: "Install Poetry" From 739d7d1fc4e31c2ab0ab3d141c407bef73d70078 Mon Sep 17 00:00:00 2001 From: John Freeman Date: Tue, 12 May 2020 11:12:47 -0500 Subject: [PATCH 7/7] Update xpring-py to 0.5.0 --- python/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/pyproject.toml b/python/pyproject.toml index 9c6e993..a544b76 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -7,7 +7,7 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.6" -xpring = {version = "^0.4.3", extras = ["py"]} +xpring = {version = "^0.5.0", extras = ["py"]} [tool.poetry.dev-dependencies]