gmcli 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gmcli-0.0.1/PKG-INFO +22 -0
- gmcli-0.0.1/README.md +12 -0
- gmcli-0.0.1/gmcli/__init__.py +1 -0
- gmcli-0.0.1/gmcli/main.py +45 -0
- gmcli-0.0.1/gmcli/models/GaijinMarket.py +213 -0
- gmcli-0.0.1/gmcli/models/Item.py +20 -0
- gmcli-0.0.1/gmcli/models/Receipt.py +5 -0
- gmcli-0.0.1/gmcli/models/User.py +65 -0
- gmcli-0.0.1/gmcli/models/__init__.py +4 -0
- gmcli-0.0.1/gmcli.egg-info/PKG-INFO +22 -0
- gmcli-0.0.1/gmcli.egg-info/SOURCES.txt +15 -0
- gmcli-0.0.1/gmcli.egg-info/dependency_links.txt +1 -0
- gmcli-0.0.1/gmcli.egg-info/entry_points.txt +2 -0
- gmcli-0.0.1/gmcli.egg-info/requires.txt +2 -0
- gmcli-0.0.1/gmcli.egg-info/top_level.txt +1 -0
- gmcli-0.0.1/setup.cfg +4 -0
- gmcli-0.0.1/setup.py +19 -0
gmcli-0.0.1/PKG-INFO
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: gmcli
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: CLI to interact with the Gaijin Market.
|
|
5
|
+
Home-page: https://github.com/JowiAoun/Gaijin-Market-CLI
|
|
6
|
+
Author: Jowi Aoun
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: click
|
|
9
|
+
Requires-Dist: python-dotenv
|
|
10
|
+
|
|
11
|
+
# Gaijin-Market-CLI
|
|
12
|
+
CLI tool for Gaijin Market.
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
Setup:
|
|
16
|
+
1. Execute `python -m venv venv`
|
|
17
|
+
2. Execute `venv\Scripts\activate` on Windows, or `source venv/bin/activate` on Unix/MacOS
|
|
18
|
+
3. Install the requirements with `pip install -r requirements.txt`
|
|
19
|
+
|
|
20
|
+
Run:
|
|
21
|
+
1. ~~Use keyword 'gmcli' in terminal to show all commands.~~
|
|
22
|
+
2. Execute `python main.py`
|
gmcli-0.0.1/README.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Gaijin-Market-CLI
|
|
2
|
+
CLI tool for Gaijin Market.
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
Setup:
|
|
6
|
+
1. Execute `python -m venv venv`
|
|
7
|
+
2. Execute `venv\Scripts\activate` on Windows, or `source venv/bin/activate` on Unix/MacOS
|
|
8
|
+
3. Install the requirements with `pip install -r requirements.txt`
|
|
9
|
+
|
|
10
|
+
Run:
|
|
11
|
+
1. ~~Use keyword 'gmcli' in terminal to show all commands.~~
|
|
12
|
+
2. Execute `python main.py`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .main import main
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from .models.User import User
|
|
2
|
+
import json
|
|
3
|
+
import click
|
|
4
|
+
|
|
5
|
+
settings = json.load(open('./gmcli/settings.json', 'r'))
|
|
6
|
+
try:
|
|
7
|
+
user = User(settings)
|
|
8
|
+
except ValueError as err:
|
|
9
|
+
click.echo("Error: could not retrieve Gaijin Market token.\nPlease provide a token with the command 'gmcli set-token -t ey...'")
|
|
10
|
+
exit(1)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@click.group()
|
|
14
|
+
def main():
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
@main.command()
|
|
18
|
+
@click.option("--embed", "-e", is_flag=True, default=False, show_default=True, type=bool, help="Embed balance in the form: 'Balance: $1.23'")
|
|
19
|
+
def balance(embed: bool):
|
|
20
|
+
"""
|
|
21
|
+
Prints the balance in the form: '1.23'
|
|
22
|
+
"""
|
|
23
|
+
if embed:
|
|
24
|
+
click.echo(f"Balance: ${user.get_balance()}")
|
|
25
|
+
else:
|
|
26
|
+
click.echo(user.get_balance())
|
|
27
|
+
|
|
28
|
+
@main.command()
|
|
29
|
+
def inventory():
|
|
30
|
+
click.echo("Here's the inventory: ...")
|
|
31
|
+
|
|
32
|
+
@main.command()
|
|
33
|
+
@click.option("--token", "-t", default=None, type=str, help="New token to use for market interactions")
|
|
34
|
+
def set_token(new_token: str | None):
|
|
35
|
+
if new_token is None:
|
|
36
|
+
click.echo("Error: could not set token. Please provide a valid Gaijin Market token.")
|
|
37
|
+
return
|
|
38
|
+
|
|
39
|
+
settings['token'] = new_token
|
|
40
|
+
with open('./gmcli/settings.json', 'w') as f:
|
|
41
|
+
json.dump(settings, f)
|
|
42
|
+
click.echo("New token has been set")
|
|
43
|
+
|
|
44
|
+
if __name__ == "__main__":
|
|
45
|
+
main()
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import math
|
|
2
|
+
from http import client
|
|
3
|
+
import json
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from .Receipt import Receipt
|
|
6
|
+
|
|
7
|
+
class GaijinMarket:
|
|
8
|
+
def __init__(self, token: str):
|
|
9
|
+
self.token: str = token
|
|
10
|
+
self.conn_market: client.HTTPSConnection = client.HTTPSConnection("market-proxy.gaijin.net")
|
|
11
|
+
self.conn_wallet: client.HTTPSConnection = client.HTTPSConnection("wallet.gaijin.net")
|
|
12
|
+
|
|
13
|
+
def get_balance(self) -> float:
|
|
14
|
+
headers = {'Authorization': f'BEARER {self.token}'}
|
|
15
|
+
self.conn_wallet.request("GET", "/GetBalance", '', headers)
|
|
16
|
+
res = self.conn_wallet.getresponse()
|
|
17
|
+
data = json.loads(res.read())
|
|
18
|
+
|
|
19
|
+
if data["status"] != "OK":
|
|
20
|
+
print(f"ERROR: could not get balance.\nStatus: {data['status']}")
|
|
21
|
+
return -1
|
|
22
|
+
else:
|
|
23
|
+
return float(data["balance"]) / 10000
|
|
24
|
+
|
|
25
|
+
def get_open_orders(self) -> list[tuple]:
|
|
26
|
+
payload = f"action=cln_get_user_open_orders&token={self.token}&appid=1165"
|
|
27
|
+
headers = {'content-type': 'application/x-www-form-urlencoded; charset=UTF-8'}
|
|
28
|
+
self.conn_market.request("POST", "/web", payload, headers)
|
|
29
|
+
res = self.conn_market.getresponse()
|
|
30
|
+
data = json.loads(res.read())
|
|
31
|
+
|
|
32
|
+
open_orders = []
|
|
33
|
+
|
|
34
|
+
if not data['response']['success']:
|
|
35
|
+
print("ERROR: Could not make request for open orders.")
|
|
36
|
+
return []
|
|
37
|
+
|
|
38
|
+
for item in data['response']:
|
|
39
|
+
try:
|
|
40
|
+
open_orders.append((int(item['txId']), int(item['id']), int(item['pairId']), item['market'], item['type'],
|
|
41
|
+
round(int(item['localPrice']) / 10000, 2), int(item['amount']), item['time']))
|
|
42
|
+
except Exception as err:
|
|
43
|
+
print(f"ERROR: Could not get item in open orders with ID: {item['id']}")
|
|
44
|
+
print(err)
|
|
45
|
+
|
|
46
|
+
return open_orders
|
|
47
|
+
|
|
48
|
+
def get_inventory(self) -> dict:
|
|
49
|
+
"""
|
|
50
|
+
Returns a dictionary in key-value form,
|
|
51
|
+
where the 'item_id' is the static ID of the item,
|
|
52
|
+
and 'class_id' is the ID given to the item while in the inventory.
|
|
53
|
+
The 'class_id' changes after transactions are done with it.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
payload = f"action=GetContextContents&token={self.token}&appid=1067&contextid=1"
|
|
57
|
+
headers = {'content-type': 'application/x-www-form-urlencoded; charset=UTF-8'}
|
|
58
|
+
self.conn_market.request("POST", "/assetAPI", payload, headers)
|
|
59
|
+
_res = self.conn_market.getresponse()
|
|
60
|
+
res = json.loads(_res.read())
|
|
61
|
+
|
|
62
|
+
data = {}
|
|
63
|
+
for item in res["result"]["assets"]:
|
|
64
|
+
class_value = item["class"][0]["value"]
|
|
65
|
+
if class_value in data:
|
|
66
|
+
data[class_value].append(int(item["id"]))
|
|
67
|
+
else:
|
|
68
|
+
data[class_value] = int(item["id"])
|
|
69
|
+
|
|
70
|
+
if not res["result"]["success"]:
|
|
71
|
+
print(f"ERROR: could not get inventory IDs.\nStatus: {data['result']['success']}")
|
|
72
|
+
return {}
|
|
73
|
+
|
|
74
|
+
return data
|
|
75
|
+
|
|
76
|
+
def get_item_variable(self, hash_name: str) -> tuple:
|
|
77
|
+
"""
|
|
78
|
+
Gets variable data for a single item by its hash name.
|
|
79
|
+
Returns a tuple with data organized like so:
|
|
80
|
+
(price_buy_list, price_sell_list, quantity_buy, quantity_sell, profit, roi, timestamp).
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
payload = f"action=cln_books_brief&token={self.token}&appid=1067&market_name={hash_name}"
|
|
84
|
+
headers = {'accept': 'application/json, text/javascript, */*; q=0.01',
|
|
85
|
+
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8'}
|
|
86
|
+
self.conn_market.request("POST", "/web", payload, headers)
|
|
87
|
+
res = self.conn_market.getresponse()
|
|
88
|
+
data = json.loads(res.read())
|
|
89
|
+
|
|
90
|
+
if not data['response']['success']:
|
|
91
|
+
print(f"ERROR: Could not get item variable data for hash name: {hash_name}")
|
|
92
|
+
return ()
|
|
93
|
+
|
|
94
|
+
try:
|
|
95
|
+
price_buy_list = data['response']['BUY']
|
|
96
|
+
price_sell_list = data['response']['SELL']
|
|
97
|
+
quantity_buy = data['response']['depth']['BUY']
|
|
98
|
+
quantity_sell = data['response']['depth']['SELL']
|
|
99
|
+
profit = round((0.85 * price_sell_list[0][0] / 10000) - price_buy_list[0][0] / 10000, 2)
|
|
100
|
+
roi = int((profit / price_buy_list[0][0] / 10000) * 100)
|
|
101
|
+
timestamp = int(datetime.now().timestamp())
|
|
102
|
+
return price_buy_list, price_sell_list, quantity_buy, quantity_sell, profit, roi, timestamp
|
|
103
|
+
|
|
104
|
+
except:
|
|
105
|
+
print(f"ERROR: Could not get item variable data for hash name: {hash_name}")
|
|
106
|
+
return ()
|
|
107
|
+
|
|
108
|
+
def get_items_static(self, count: int) -> list[tuple]:
|
|
109
|
+
"""
|
|
110
|
+
Returns a list of tuples containing static data in the order:
|
|
111
|
+
(asset_id, name, hash_name).
|
|
112
|
+
"""
|
|
113
|
+
|
|
114
|
+
data = []
|
|
115
|
+
num_requests = math.ceil(count / 100)
|
|
116
|
+
skip = 0
|
|
117
|
+
|
|
118
|
+
for _ in range(num_requests):
|
|
119
|
+
curr_count = min(100, count)
|
|
120
|
+
|
|
121
|
+
payload = f"action=cln_market_search&token={self.token}&appid=1165&skip={skip}&count={curr_count}&text=&language=en_US&options=any_sell_orders&appid_filter=1067"
|
|
122
|
+
headers = {'content-type': "application/x-www-form-urlencoded; charset=UTF-8"}
|
|
123
|
+
self.conn_market.request("GET", "/web", payload, headers)
|
|
124
|
+
res = self.conn_market.getresponse()
|
|
125
|
+
data = json.loads(res.read())
|
|
126
|
+
|
|
127
|
+
if data['response']['error'] == "LIMIT_IS_EXCEEDED":
|
|
128
|
+
break
|
|
129
|
+
elif not data['response']['success']:
|
|
130
|
+
continue
|
|
131
|
+
|
|
132
|
+
for j in range(count):
|
|
133
|
+
try:
|
|
134
|
+
asset_id = int(data['response']['assets'][j]["asset_class"][0]["value"])
|
|
135
|
+
name = data['response']['assets'][j]['name']
|
|
136
|
+
hash_name = data['response']['assets'][j]['hash_name']
|
|
137
|
+
data.append((asset_id, name, hash_name))
|
|
138
|
+
|
|
139
|
+
except Exception as err:
|
|
140
|
+
print(f"ERROR: could not get market id: {asset_id} at loop index UNKNOWN")
|
|
141
|
+
print(err)
|
|
142
|
+
continue
|
|
143
|
+
|
|
144
|
+
skip = curr_count
|
|
145
|
+
count -= curr_count
|
|
146
|
+
|
|
147
|
+
return data
|
|
148
|
+
|
|
149
|
+
def get_items_variable(self, count: int) -> list[tuple]:
|
|
150
|
+
"""
|
|
151
|
+
Gets variable data for a single item by its hash name.
|
|
152
|
+
Returns a tuple with data organized like so:
|
|
153
|
+
(price_buy_list, price_sell_list, quantity_buy, quantity_sell, profit, roi, timestamp).
|
|
154
|
+
"""
|
|
155
|
+
|
|
156
|
+
data = []
|
|
157
|
+
skip = 0
|
|
158
|
+
num_requests = math.ceil(count / 100)
|
|
159
|
+
timestamp = int(datetime.now().timestamp())
|
|
160
|
+
|
|
161
|
+
for _ in range(num_requests):
|
|
162
|
+
curr_count = min(100, count)
|
|
163
|
+
|
|
164
|
+
payload = f"action=cln_market_search&token={self.token}&appid=1165&skip={skip}&count={curr_count}&text=&language=en_US&options=any_sell_orders&appid_filter=1067"
|
|
165
|
+
headers = {'content-type': "application/x-www-form-urlencoded; charset=UTF-8"}
|
|
166
|
+
self.conn_market.request("GET", "/web", payload, headers)
|
|
167
|
+
res = self.conn_market.getresponse()
|
|
168
|
+
data = json.loads(res.read())
|
|
169
|
+
|
|
170
|
+
if data['response']['error'] == "LIMIT_IS_EXCEEDED":
|
|
171
|
+
break
|
|
172
|
+
elif not data['response']['success']:
|
|
173
|
+
continue
|
|
174
|
+
|
|
175
|
+
for j in range(count):
|
|
176
|
+
try:
|
|
177
|
+
asset_id = int(data['response']['assets'][j]["asset_class"][0]["value"])
|
|
178
|
+
price_buy = data['response']['assets'][j]['buy_price'] / 100000000
|
|
179
|
+
price_sell = data['response']['assets'][j]['price'] / 100000000
|
|
180
|
+
quantity_buy = data['response']['assets'][j]['depth']
|
|
181
|
+
quantity_sell = data['response']['assets'][j]['buy_depth']
|
|
182
|
+
profit = round((0.85 * price_sell) - price_buy, 2)
|
|
183
|
+
roi = int((profit / price_buy) * 100)
|
|
184
|
+
data.append((asset_id, price_buy, price_sell, quantity_buy, quantity_sell, profit, roi, timestamp))
|
|
185
|
+
|
|
186
|
+
except Exception as err:
|
|
187
|
+
print(f"ERROR: could not get market id: {asset_id} at loop index UNKNOWN")
|
|
188
|
+
print(err)
|
|
189
|
+
continue
|
|
190
|
+
|
|
191
|
+
skip += curr_count
|
|
192
|
+
count -= curr_count
|
|
193
|
+
|
|
194
|
+
return data
|
|
195
|
+
|
|
196
|
+
def cancel_order(self, receipt: Receipt) -> bool:
|
|
197
|
+
timestamp = datetime.now().timestamp()
|
|
198
|
+
payload = f"action=cancel_order&token={self.token}&appid=1165&transactid={receipt.transact_id}&reqstamp={timestamp}&pairId={receipt.pair_id}&orderId={receipt.order_id}"
|
|
199
|
+
headers = {'accept': 'application/json, text/javascript, */*; q=0.01', 'accept-language': 'en-CA,en;q=0.8',
|
|
200
|
+
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8'}
|
|
201
|
+
self.conn_market.request("POST", "/market", payload, headers)
|
|
202
|
+
res = self.conn_market.getresponse()
|
|
203
|
+
data = json.loads(res.read())
|
|
204
|
+
|
|
205
|
+
if not data["response"]["success"]:
|
|
206
|
+
return False
|
|
207
|
+
else:
|
|
208
|
+
return True
|
|
209
|
+
|
|
210
|
+
def close_connection(self):
|
|
211
|
+
self.token = None
|
|
212
|
+
self.conn_wallet.close()
|
|
213
|
+
self.conn_market.close()
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
|
|
3
|
+
class Item:
|
|
4
|
+
"""
|
|
5
|
+
Class representing an item from the Gaijin market.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
def __init__(self, asset_id, name, hash_name, price_buy=None, price_sell=None,
|
|
9
|
+
quantity_buy=None, quantity_sell=None, tags=None) -> None:
|
|
10
|
+
self.asset_id: int = asset_id
|
|
11
|
+
self.name: str = name
|
|
12
|
+
self.hash_name: str = hash_name
|
|
13
|
+
self.price_buy: float = price_buy
|
|
14
|
+
self.price_sell: float = price_sell
|
|
15
|
+
self.quantity_buy: int = quantity_buy
|
|
16
|
+
self.quantity_sell: int = quantity_sell
|
|
17
|
+
self.tags: dict = tags
|
|
18
|
+
self.profit: float = (0.85 * price_sell) - price_buy
|
|
19
|
+
self.roi: int = (self.profit / price_buy) * 100
|
|
20
|
+
self.timestamp: int = int(datetime.now().timestamp())
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
from .GaijinMarket import GaijinMarket
|
|
2
|
+
from .Receipt import Receipt
|
|
3
|
+
from .Item import Item
|
|
4
|
+
|
|
5
|
+
class User:
|
|
6
|
+
def __init__(self, settings: dict):
|
|
7
|
+
self.token: str | None = settings.get('token', None)
|
|
8
|
+
|
|
9
|
+
if self.token in [None, ""]:
|
|
10
|
+
raise ValueError("NO TOKEN PROVIDED")
|
|
11
|
+
|
|
12
|
+
self.id: int = -1
|
|
13
|
+
self.balance: float = -1
|
|
14
|
+
self.inventory: list[Item] = []
|
|
15
|
+
self.receipts: list[Receipt] = []
|
|
16
|
+
self.settings: dict = settings
|
|
17
|
+
self.market: GaijinMarket = GaijinMarket(self.token)
|
|
18
|
+
|
|
19
|
+
def get_balance(self) -> float:
|
|
20
|
+
"""
|
|
21
|
+
Gets the balance of the user. If successful, returns a float.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
return self.market.get_balance()
|
|
25
|
+
|
|
26
|
+
def get_open_orders(self) -> list[tuple]:
|
|
27
|
+
"""
|
|
28
|
+
Gets current open orders. Returns a list of tuples with data organized like so:
|
|
29
|
+
(transact_id, order_id, pair_id, hash_name, type, price, amount, timestamp)
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
return self.market.get_open_orders()
|
|
33
|
+
|
|
34
|
+
def create_order(self):
|
|
35
|
+
"""
|
|
36
|
+
Creates an order for an item.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def cancel_order(self, receipt: Receipt) -> bool:
|
|
40
|
+
"""
|
|
41
|
+
Cancels the user's open order using the item's receipt.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
return self.market.cancel_order(receipt)
|
|
45
|
+
|
|
46
|
+
def cancel_orders(self, receipts: list[Receipt]) -> bool:
|
|
47
|
+
"""
|
|
48
|
+
Cancels the selected user's open order using the items receipts.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
for receipt in receipts:
|
|
52
|
+
if not self.cancel_order(receipt):
|
|
53
|
+
return False
|
|
54
|
+
|
|
55
|
+
return True
|
|
56
|
+
|
|
57
|
+
def cancel_orders_all(self):
|
|
58
|
+
for receipt in self.receipts:
|
|
59
|
+
if not self.cancel_order(receipt):
|
|
60
|
+
return False
|
|
61
|
+
|
|
62
|
+
return True
|
|
63
|
+
|
|
64
|
+
def set_token(self, token: str):
|
|
65
|
+
self.token = token
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: gmcli
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: CLI to interact with the Gaijin Market.
|
|
5
|
+
Home-page: https://github.com/JowiAoun/Gaijin-Market-CLI
|
|
6
|
+
Author: Jowi Aoun
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: click
|
|
9
|
+
Requires-Dist: python-dotenv
|
|
10
|
+
|
|
11
|
+
# Gaijin-Market-CLI
|
|
12
|
+
CLI tool for Gaijin Market.
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
Setup:
|
|
16
|
+
1. Execute `python -m venv venv`
|
|
17
|
+
2. Execute `venv\Scripts\activate` on Windows, or `source venv/bin/activate` on Unix/MacOS
|
|
18
|
+
3. Install the requirements with `pip install -r requirements.txt`
|
|
19
|
+
|
|
20
|
+
Run:
|
|
21
|
+
1. ~~Use keyword 'gmcli' in terminal to show all commands.~~
|
|
22
|
+
2. Execute `python main.py`
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
setup.py
|
|
3
|
+
gmcli/__init__.py
|
|
4
|
+
gmcli/main.py
|
|
5
|
+
gmcli.egg-info/PKG-INFO
|
|
6
|
+
gmcli.egg-info/SOURCES.txt
|
|
7
|
+
gmcli.egg-info/dependency_links.txt
|
|
8
|
+
gmcli.egg-info/entry_points.txt
|
|
9
|
+
gmcli.egg-info/requires.txt
|
|
10
|
+
gmcli.egg-info/top_level.txt
|
|
11
|
+
gmcli/models/GaijinMarket.py
|
|
12
|
+
gmcli/models/Item.py
|
|
13
|
+
gmcli/models/Receipt.py
|
|
14
|
+
gmcli/models/User.py
|
|
15
|
+
gmcli/models/__init__.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
gmcli
|
gmcli-0.0.1/setup.cfg
ADDED
gmcli-0.0.1/setup.py
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# --- Imports
|
|
2
|
+
from setuptools import setup, find_packages
|
|
3
|
+
|
|
4
|
+
# --- Setup
|
|
5
|
+
setup(
|
|
6
|
+
name="gmcli",
|
|
7
|
+
version="0.0.1",
|
|
8
|
+
description="CLI to interact with the Gaijin Market.",
|
|
9
|
+
long_description=open('README.md').read(),
|
|
10
|
+
long_description_content_type='text/markdown',
|
|
11
|
+
url="https://github.com/JowiAoun/Gaijin-Market-CLI",
|
|
12
|
+
author="Jowi Aoun",
|
|
13
|
+
packages=find_packages(),
|
|
14
|
+
install_requires=['click', 'python-dotenv'],
|
|
15
|
+
entry_points='''
|
|
16
|
+
[console_scripts]
|
|
17
|
+
gmcli=gmcli.main:main
|
|
18
|
+
''',
|
|
19
|
+
)
|