Pārlūkot izejas kodu

Add market function

JoostSijm 4 gadi atpakaļ
vecāks
revīzija
66dada7c71

+ 1 - 1
rival_regions_wrapper/__init__.py

@@ -8,4 +8,4 @@ of some Rival Regions functionalities.
 
 from .authentication_handler import AuthenticationHandler
 from .middleware import LocalAuthentication, RemoteAuthentication
-from .api_wrapper import Profile, Storage
+from .api_wrapper import Profile, Storage, Market

+ 3 - 2
rival_regions_wrapper/api_wrapper/__init__.py

@@ -26,8 +26,9 @@ if None in (USERNAME, PASSWORD, LOGIN_METHOD):
     )
 
 # api
-# MIDDLEWARE = RemoteAuthentication(API_URL, AUTHORIZATION)
-MIDDLEWARE = LocalAuthentication(USERNAME,PASSWORD,LOGIN_METHOD)
+MIDDLEWARE = RemoteAuthentication(API_URL, AUTHORIZATION)
+# MIDDLEWARE = LocalAuthentication(USERNAME,PASSWORD,LOGIN_METHOD)
 
 from .profile import Profile
 from .storage import Storage
+from .market import Market

+ 54 - 0
rival_regions_wrapper/api_wrapper/market.py

@@ -0,0 +1,54 @@
+"""Profile class"""
+
+import re
+
+from bs4 import BeautifulSoup
+
+from . import MIDDLEWARE
+
+
+class Market(object):
+    """Wrapper class for profile"""
+
+    @staticmethod
+    def info(resource):
+        """Get profile"""
+        keys = {
+            'oil': 3,
+            'ore': 4,
+            'uranium': 11,
+            'diamonds': 15,
+            'liquid_oxygen': 21,
+            'helium-3': 24,
+            'rivalium': 26,
+            'antirad': 13,
+            'energy_drink': 17,
+            'spacerockets': 20,
+            'lss': 25,
+            'tanks': 2,
+            'aircrafts': 1,
+            'missiles': 14,
+            'bombers': 16,
+            'battleships': 18,
+            'laser_drones': 27,
+            'moon_tanks': 22,
+            'space_stations': 23
+        }
+        if isinstance(resource, str) and resource in keys:
+            resource = keys[resource]
+        path = 'storage/listed/{}'.format(resource)
+        response = MIDDLEWARE.get(path)
+        soup = BeautifulSoup(response, 'html.parser')
+
+        offers_tree = soup.find_all(class_='list_link')
+        offers = []
+        for offer_tree in offers_tree:
+            offers.append({
+                'player_id': int(
+                    re.sub(r'^.*\/', '', offer_tree.select_one('.results_date')['action'])
+                ),
+                'player_name': offer_tree.select_one('.results_date').string,
+                'price': int(float(offer_tree.select('.list_level')[1]['rat'])*100),
+                'amount': int(offer_tree.select_one('.list_level.imp.small')['rat']),
+            })
+        return offers

+ 6 - 3
rival_regions_wrapper/api_wrapper/storage.py

@@ -39,8 +39,11 @@ class Storage(object):
         }
         storage = {}
         for key, item_id in keys.items():
-            storage[key] = int(soup.find('span', {'urlbar' : item_id}).text.replace('.', ''))
-            storage['{}_max'.format(key)] = int(soup.find('span', {'urlbar' : item_id})['maxstore'])
+            storage[key] = int(
+                soup.find('span', {'urlbar' : item_id}).text.replace('.', '')
+            )
+            storage['{}_max'.format(key)] = int(
+                soup.find('span', {'urlbar' : item_id})['maxstore']
+            )
 
-        print(storage)
         return storage

+ 21 - 1
tests/test_rival_regions_wrapper.py

@@ -2,7 +2,7 @@
 
 import pytest
 
-from rival_regions_wrapper.api_wrapper import Profile, Storage
+from rival_regions_wrapper.api_wrapper import Profile, Storage, Market
 
 
 @pytest.fixture
@@ -47,3 +47,23 @@ def test_storage_info(storage_keys):
 
     assert isinstance(response, dict), "The response should be a dict"
     assert set(storage_keys).issubset(response.keys()), "All keys should be in the response"
+
+@pytest.fixture
+def market_keys():
+    """Standard keys for storage"""
+    return ['player_id', 'player_name', 'price', 'amount']
+
+@pytest.mark.vcr()
+def test_market_info(market_keys):
+    """Test an API call to get market info"""
+    resource = 'oil'
+    response = Market.info(resource)
+
+    assert isinstance(response, list), "The response should be a list"
+    if response:
+        assert isinstance(response[0], dict), "The first element should be a dict"
+        assert set(market_keys).issubset(response[0].keys()), "All keys should be in the response"
+        assert isinstance(response[0]['player_id'], int), "The player_id should be a int"
+        assert isinstance(response[0]['player_name'], str), "The player_name should be a int"
+        assert isinstance(response[0]['price'], int), "The price should be a int"
+        assert isinstance(response[0]['amount'], int), "The price should be a int"