Forráskód Böngészése

Add module to get craft prices

JoostSijm 4 éve
szülő
commit
63551833db

+ 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, Market, ResourceState, Perks
+from .api_wrapper import Profile, Storage, Market, ResourceState, Perks, Craft

+ 1 - 0
rival_regions_wrapper/api_wrapper/__init__.py

@@ -34,3 +34,4 @@ from .storage import Storage
 from .market import Market
 from .resource_state import ResourceState
 from .perks import Perks
+from .craft import Craft

+ 62 - 0
rival_regions_wrapper/api_wrapper/craft.py

@@ -0,0 +1,62 @@
+"""Profile class"""
+
+import re
+
+from bs4 import BeautifulSoup
+
+from . import MIDDLEWARE
+
+
+class Craft(object):
+    """Wrapper class for crafting"""
+
+    @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/produce/{}'.format(resource)
+        response = MIDDLEWARE.get(path)
+        soup = BeautifulSoup(response, 'html.parser')
+        resources = soup.select_one('.storage_produce_exp')
+        resource_dict = {
+            'cash': 'white',
+            'oil': 'oil',
+            'ore': 'ore',
+            'uranium': 'uranium',
+            'diamond': 'diamond',
+            'oxygen': 'oxygen',
+        }
+        resource_cost = {}
+        for name, selector in resource_dict.items():
+            element = resources.select_one('.{} .produce_discount'.format(selector))
+            if element:
+                resource_cost[name] = int(
+                    re.sub(r'-|\.', '', element.text)
+                )
+        craft = {
+            'market_price': int(re.sub(r'\.|\s\$', '', soup.select('.small .imp')[1].text)),
+            'resources': resource_cost
+        }
+        return craft

+ 20 - 1
tests/test_rival_regions_wrapper.py

@@ -4,7 +4,7 @@ from datetime import datetime
 
 import pytest
 
-from rival_regions_wrapper.api_wrapper import Profile, Storage, Market, ResourceState, Perks
+from rival_regions_wrapper.api_wrapper import Profile, Storage, Market, ResourceState, Perks, Craft
 
 
 @pytest.fixture
@@ -110,3 +110,22 @@ def test_perks_info(perks_keys):
     assert isinstance(response['endurance'], int), "endurance should be an int"
     assert isinstance(response['upgrade_date'], datetime), "upgrade_date should be a date"
     assert isinstance(response['upgrade_perk'], int), "upgrade_perk should be an int"
+
+@pytest.fixture
+def craft_keys():
+    """Standard keys for craft"""
+    return ['market_price', 'resources']
+
+@pytest.mark.vcr()
+def test_craft_info(craft_keys):
+    """Test an API call to get craft info"""
+    item = 'bombers'
+    response = Craft.info(item)
+
+    assert isinstance(response, dict), "The response should be a dict"
+    assert isinstance(response['market_price'], int), "The market_price should be an int"
+    assert isinstance(response['resources'], dict), "The resources should be a dict"
+    assert isinstance(response['resources']['cash'], int), "The cash should be an int"
+    assert isinstance(response['resources']['oil'], int), "The oil should be an int"
+    assert isinstance(response['resources']['ore'], int), "The ore should be an int"
+    assert isinstance(response['resources']['diamond'], int), "The diamond should be an int"