ciocore 9.0.0b2__py2.py3-none-any.whl → 9.1.0__py2.py3-none-any.whl

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.

Potentially problematic release.


This version of ciocore might be problematic. Click here for more details.

Binary file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ciocore
3
- Version: 9.0.0b2
3
+ Version: 9.1.0
4
4
  Summary: Core functionality for Conductor's client tools
5
5
  Home-page: https://github.com/ConductorTechnologies/ciocore
6
6
  Author: conductor
@@ -34,8 +34,10 @@ conductor --help
34
34
  Get help for a specific sub command
35
35
  ```bash
36
36
  conductor downloader --help
37
- conductor uploader --help
38
- conductor software --help
37
+ conductor upload --help
38
+ conductor download --help
39
+ conductor packages --help
40
+ conductor docs --help
39
41
  ```
40
42
 
41
43
  Example API usage
@@ -50,11 +52,14 @@ See [CONTRIBUTING](CONTRIBUTING.md)
50
52
 
51
53
  ## Changelog
52
54
 
53
- ## Unreleased:
55
+ ## Version:9.1.0 -- 20 Dec 2024
54
56
 
55
- * 9.0.0-beta.1
56
- * Use the new required jwt parameters
57
- * Removing py2.7 compatibility
57
+ * Added support for new required JWT authentication parameters
58
+ * Removed Python 2.7 compatibility to focus on modern Python versions
59
+
60
+ ## Version:8.3.3 -- 04 Dec 2024
61
+
62
+ * Adds filter option for API data query
58
63
 
59
64
  ## Version:8.3.2 -- 01 Oct 2024
60
65
 
@@ -1,12 +1,12 @@
1
- ciocore/VERSION,sha256=e7b7GJz44Hd6emuQcgfrIGtfwzF3N98xAT6OKsX1sRE,12
1
+ ciocore/VERSION,sha256=oeEalLUyaZE99NMQp_coGOAHFp5-0eaircSPsG9vXjA,5
2
2
  ciocore/__init__.py,sha256=aTP7LeeosQA8BZE67gDV4jgfTK5zxmwZRjiTRu_ZWj0,646
3
- ciocore/api_client.py,sha256=XuTON9guZ8a4DMJlU2U2O3RHkimriXG20NJMNi-LGCY,32902
3
+ ciocore/api_client.py,sha256=KKL7TsYygNcfkFZDPPq1CSJsrVN_QLK4PqP44vXsCQg,33101
4
4
  ciocore/cli.py,sha256=jZ1lOKQiUcrMhsVmD9SVmPMFwHtgDF4SaoAf2-PBS54,15449
5
5
  ciocore/client_db.py,sha256=tTz3bl2xeDPPcYSDS3g3QgV_xYihJMx0Kj6OeN2klK0,12978
6
6
  ciocore/common.py,sha256=mBIS6KiYoQsjWe6aIFUGRRvCMl8BIN2kmLZ4J8icap8,14982
7
7
  ciocore/conductor_submit.py,sha256=bxvzdyNzscAOOOsqTvAYh5DQsTWyCQJNb16Mf-n_F0M,9702
8
8
  ciocore/config.py,sha256=rCL7kaFn1tYgSglN8q9Wx6SwMpoXTq0BMQGwPRVwVIg,8973
9
- ciocore/data.py,sha256=Ji0qUk8nJXBNakoHSqBiVx8O58SbZXyt273SHlEDn3U,7027
9
+ ciocore/data.py,sha256=zT3zpkSbHPHHGlLeLDTbwkB8_-Ct6zd8qQ-7U1pDCHM,7215
10
10
  ciocore/exceptions.py,sha256=4Oq-WX-qiN6kPUdBCHvvd6mtSQ0nCkDbJxWt2CNtpv8,1504
11
11
  ciocore/file_utils.py,sha256=swA7th9WhDEloW69YViRTKB-oeC9UmNdEGegfH1r-Gw,17176
12
12
  ciocore/hardware_set.py,sha256=FlRQiGCLRcSW7Oko_gzgVK8ZqJ_J92eT8e_AleAbS2E,17047
@@ -25,11 +25,11 @@ ciocore/docsite/index.html,sha256=NEK4HaX2yaetTajVtQuTmS9C5cPnkAtxgeKEj7wQ9t0,20
25
25
  ciocore/docsite/logo.png,sha256=gArgFFWdw8w985-0TkuGIgU_pW9sziEMZdqytXb5WLo,2825
26
26
  ciocore/docsite/objects.inv,sha256=XwmLactPEWWC4fAWqHNPBXGsluRxLLTrwDLQqq51ONY,775
27
27
  ciocore/docsite/sitemap.xml,sha256=M_V85zl0y2adRvzJAnoCxlZH_Hl7TLnIb1A-6l_xGmI,109
28
- ciocore/docsite/sitemap.xml.gz,sha256=kwrVA-e-YnpIkhePqDzoqyW7P-aZd0a6d9_dx9Mdv08,127
29
- ciocore/docsite/apidoc/api_client/index.html,sha256=_aLYBFhVNk2VtDAoC7vTeKisdh2BVN39VnVvlk4SlAk,188875
28
+ ciocore/docsite/sitemap.xml.gz,sha256=Y8-yQgTp14BttP0hYQecQsezVFbeBMuGGX7cygjyTKM,127
29
+ ciocore/docsite/apidoc/api_client/index.html,sha256=kkhKzA7OThkpASLveONRPNS7gGppf8Ot2rxek1lZxHc,189722
30
30
  ciocore/docsite/apidoc/apidoc/index.html,sha256=GOSvv6KZPOtgekgshRE4j7aDvJkkaiBQLwA_By9J94g,26171
31
31
  ciocore/docsite/apidoc/config/index.html,sha256=WDqy4MLR3EMp9T_2-Z9Op61rTFkvb0aTWmtjiR8sbjA,72559
32
- ciocore/docsite/apidoc/data/index.html,sha256=vjC5u7wcm2ryOW28GctA9ZG6dXgBTkMJLLomJ9Kqxo0,50850
32
+ ciocore/docsite/apidoc/data/index.html,sha256=8ldmfisgelzdWtTqGY8uebvVRcskhbv-reO3hMcIgGI,51627
33
33
  ciocore/docsite/apidoc/hardware_set/index.html,sha256=SpYg-lwuCvfLPbNIIM7aQL2jGt-NA5wlVMlIKixGwBo,123042
34
34
  ciocore/docsite/apidoc/package_environment/index.html,sha256=V6_ah3V1_4_aOwJbEcITCdwuHxe1vGtfn0maRrbflUs,69248
35
35
  ciocore/docsite/apidoc/package_tree/index.html,sha256=5_4vV8x_GmpsyWHnMP62gBaAcdzfM7L-mP7uQKh_DH4,109054
@@ -80,7 +80,7 @@ ciocore/docsite/cmdline/downloader/index.html,sha256=nygj-0GQmpD79B5AxHjwzQxOFv8
80
80
  ciocore/docsite/cmdline/packages/index.html,sha256=_kXB85PBAgrqW09OerYpxnJuyERHMbcLn6qBGRdyHwk,20923
81
81
  ciocore/docsite/cmdline/uploader/index.html,sha256=vuQ06Gys9Eoxs87PXlqnM5AgB6Ag00BlDIy6oaprjis,25123
82
82
  ciocore/docsite/how-to-guides/index.html,sha256=KifCHl2S3RfPBZhP1UXwUNWuhcXPlPPqM4Gk6rVGhjQ,20100
83
- ciocore/docsite/search/search_index.json,sha256=_jxoQQikc4cA_9YiODWM6TBSyWdgReOMtlZpSbB1fi0,189108
83
+ ciocore/docsite/search/search_index.json,sha256=LP1ck_wuTP9A_dWTyaVF8Fugg22q1O0XS6hGqg2zk0M,189860
84
84
  ciocore/docsite/stylesheets/extra.css,sha256=_Cxe9Dhg1BBi6Kqaz_iZD9z9VyqxA9vtONRjP4PVic0,354
85
85
  ciocore/docsite/stylesheets/tables.css,sha256=LE_zwGRxGcdPIy-9QiVPecOzlEBSqZb_WP5vDkFE0ZM,3235
86
86
  ciocore/downloader/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -98,16 +98,14 @@ ciocore/uploader/_uploader.py,sha256=40nzqO5DuFi4sx31VvjWxZPNkrWsWqM9jtFVxs_-o3o
98
98
  ciocore/uploader/upload_stats/__init__.py,sha256=Lg1y4zq1i0cwc6Hh2K1TAQDYymLff49W-uIo1xjcvdI,5309
99
99
  ciocore/uploader/upload_stats/stats_formats.py,sha256=giNirtObU66VALWghPFSRhg3q_vw5MvESsnXhb_I3y8,2402
100
100
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
- tests/extra_env_fixtures.py,sha256=8qvU4d8SXGKzRVNR5whVqKCQOwOVMiFVfbKBAjxa2gE,1119
102
101
  tests/instance_type_fixtures.py,sha256=uIzQduqKQVgjllMuyXaYnRC-pwqk5lnTx3NY2M5Nujo,4320
103
102
  tests/package_fixtures.py,sha256=od7ZHofG8ubpQ3PqlUsrcHBcbmD3qVWih9eiIg1WtSQ,5361
104
- tests/project_fixtures.py,sha256=iBm_th_JtAw76vlNu7Jjhh9tLH4oOaNi-MgtPzCV7yQ,138
105
103
  tests/test_api_client.py,sha256=isntMDs3QTyTWdghBa_LbFAiC7ydZD1RWb655oEZo24,14452
106
104
  tests/test_base_downloader.py,sha256=SS7tWKv2ZZhpUDk4UCg1TkrNrpntjSewgzLl1mEubSE,3603
107
105
  tests/test_cli.py,sha256=_WTs2SWlEgd6wtg1hmOBlFnbWVdFLvqp0KqNhy-y2e8,5532
108
106
  tests/test_common.py,sha256=5N9xeeGVuwN4kcjIg30eBliUD8PePzCNNLuLipGuTgk,410
109
- tests/test_config.py,sha256=iiMPwoVA9C3vvGGR6_gKKMbYkSxheNLdljeOA-iPrJU,13295
110
- tests/test_data.py,sha256=u9XS4xOXugKNwuHBuQl3TxjZi7zybs6X9yq40r6XbzY,5388
107
+ tests/test_config.py,sha256=ahDLB6yVX8pA-B1qvxEpcJ1Wf1HS499rEg7lloeyxfk,11526
108
+ tests/test_data.py,sha256=o320GdvOJ2TouWtuA8jcs8Cr_gQWlQ6KxWVSWtmARlY,7614
111
109
  tests/test_downloader.py,sha256=hceljsjnuvk5Vk5X4mHgavIEcpbv8ylPwpz7rTwJ-aE,4721
112
110
  tests/test_hardware_set.py,sha256=hW7A_suyYdU7WkB7qoHSBPLxaAP2CKqI0i_ULfO5GeY,4408
113
111
  tests/test_imports_2and3.py,sha256=ehqpRYPVY7djBcb8OT_cnh86iCJJ9wuMWnfSR9RHxmY,507
@@ -120,8 +118,8 @@ tests/test_uploader.py,sha256=JGp6GEyqRXRtbQSb-IW-cCX_BzNotWdCbnJnLwZvpUM,2869
120
118
  tests/test_validator.py,sha256=2fY66ayNc08PGyj2vTI-V_1yeCWJDngkj2zkUM5TTCI,1526
121
119
  tests/mocks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
120
  tests/mocks/glob.py,sha256=J2MH7nqi6NJOHuGdVWxhfeBd700_Ckj6cLh_8jSNkfg,215
123
- ciocore-9.0.0b2.dist-info/METADATA,sha256=7bbe60ozciKLWntbeZqWmTh_jtrOAPpmoiLN4s-p6Io,18918
124
- ciocore-9.0.0b2.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109
125
- ciocore-9.0.0b2.dist-info/entry_points.txt,sha256=cCqcALMYbC4d8545V9w0Zysfg9MVuKWhzDQ2er4UfGE,47
126
- ciocore-9.0.0b2.dist-info/top_level.txt,sha256=SvlM5JlqULzAz00JZWfiUhfjhqDzYzSWssA87zdJl0o,14
127
- ciocore-9.0.0b2.dist-info/RECORD,,
121
+ ciocore-9.1.0.dist-info/METADATA,sha256=3w70xvtZ8bsQUIZRoZ2uECYlDQLPOjW-kUr1oYTQ3GA,19101
122
+ ciocore-9.1.0.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109
123
+ ciocore-9.1.0.dist-info/entry_points.txt,sha256=cCqcALMYbC4d8545V9w0Zysfg9MVuKWhzDQ2er4UfGE,47
124
+ ciocore-9.1.0.dist-info/top_level.txt,sha256=SvlM5JlqULzAz00JZWfiUhfjhqDzYzSWssA87zdJl0o,14
125
+ ciocore-9.1.0.dist-info/RECORD,,
tests/test_config.py CHANGED
@@ -8,7 +8,18 @@ import logging
8
8
 
9
9
  from unittest import mock
10
10
 
11
- APIKEY = '{"auth_provider_x509_cert_url": "https://www.exampleapis.com/oauth2/v1/certs", "auth_uri": "https://accounts.example.com/o/oauth2/auth", "client_email": "account-5641301770895360@eloquent-vector-104019.iam.gserviceaccount.com", "client_id": "106815243682887997903", "client_x509_cert_url": "https://www.exampleapis.com/robot/v1/metadata/x509/account-5641301770895360%40eloquent-vector-104019.iam.gserviceaccount.com", "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDcadqRWyd7VpYN\n804fEn07qlqNXU0ihz6g2dfbj9gzZDhHGVCI5QvPFskAQcV91k8cDdFu380m+sh1\nz9wlcdaM/lksRV/DRJiV76qrqyrNi0gSekZUuYhSsyMWUGvG4aSbf5BzVf1j8W4I\nUArH+ht5pgdSjowNc4zQIqmMH2XY+Ntr+NysBBfIv1PI6GoHFgDYOTSzsvz0qFYS\nWuonYGTjzNz4CY9Yh5ki8iq0/ijKzpUWeRUkpK9uF7WBoxrj3EyFFHejtfhVX2l0\n2KxrIF0kkmy5nmxVUck76FqdQ6vyvaHudREd3z/08hgdYogemQUTKFE/0LQmKuBV\nIJipPvORAgMBAAECggEAZvPMozN8LBikC00XstzMgRePp1MqydN5NeG6+TPlrQ+F\nV/RjkSXHT8oZRdTy3dXB6t0rc4n2xdvC0YCvGBBlwkK1vT+EPO2oBfTF99yCKDME\nDZlui3mDyvkgjPYweVuBKx65Bp5mNo4ZMqnMd18EAVxDM9UgZtIPtlJSdoBd7qtk\nyCGr03l+SV0krmvPV+KS9vyDOg/7Km5gMhTMaIveNyS1pG6AmZ0ggQA5djg/P2iF\nxGwYdvfADY5cBzg0OG5ELv9hvyA4CKN6RLfYv3JJS2gbNaMknjmsjaM/p0LtE2HL\n+uFPL0ZjoMwV3BlEFQIHwhNWS63H43ISBa1/2XvGPwKBgQDw4a4kQ9+Ce3edWonz\n3Fm/3no+HrMSVjbv28qphAHMFrSUdbMejQm4QSbNeOW1pEcVvW21u8tYagrJEsaU\ns4DulFXRep36teVDWpc1FrNowWEPPVeC8CO74VfssK1h2Itqis8JPbzXOcNtSH9+\nAg1EvrB9XnyEvJuM6GOGo3juTwKBgQDqP058+H3iSZe6al4P6Ib3g/82nr2dHeN5\n4xxGu1fzTMNX5lopbNji6tQcsMoMVPdOvCQy5c0PEUbvo7mxfZ8fOZwgBjIcXbYg\nzIJkPTSv7nxSE5M5lW5juzLkdq2k5k0qt9ByWuWEA3PSn/DEANa5888phSCoJSw/\nPjpwHhZoHwKBgQDCoQbMxI6e5lYCrToT8PIPhpptAO8dnM2sxoGcsE2ncp0b63H7\n+GdnGjVZBhtMxdyt4y33DjLCUIRAbUxIsDU4EGC67oEhJsGEx3iva5Uwyjc7UgwY\nfyHQV8ZsN2EQUyBqyJd6VwjzOff+n/prfQrthcoisiqYMbDZjJeGHSXEHwKBgAo4\nBsmG4Z78jOTx/PZ+s1ya4ohUdnsjMahAkxw20ghoIeF0yBwkhnWnvucdg0L0dfF2\nXbHmuoJcw5ZyswgeLdHj5n6zJn58TBS0Nz/+N40xPzUpa3PIpA8vvHGhB8Q408b4\nS9yhQH/40pWuqocybiugijoKd7k+HecIZO49MccLAoGBAPDScJHSxKPW6wJKjxDC\nXXWWQ2flbwv4Sja487QV/trWMSRnHJHnCVHqv/F7ThPaoHM+MJSzrJ7wr/CJhk0H\noEt+0Rn6qPd/A36bSjTfXMFLXWi75ovek+IJGKxr7B46jrcS/oe1XIIOlV1+OvOY\nVoO6vgYkPhpMkth2hyZ/luea\n-----END PRIVATE KEY-----\n", "private_key_id": "3dfe3bdc40d4dc431d283bf22feb113c9b622dd3", "project_id": "eloquent-vector-104019", "token_uri": "https://oauth2.exampleapis.com/token", "type": "service_account"}'
11
+ MOCK_API_KEY = '''{
12
+ "type": "service_account",
13
+ "project_id": "mock-project",
14
+ "private_key_id": "mock-key-id",
15
+ "private_key": "-----BEGIN PRIVATE KEY-----\\nMOCKKEY\\n-----END PRIVATE KEY-----\\n",
16
+ "client_email": "mock@example.com",
17
+ "client_id": "123456789",
18
+ "auth_uri": "https://accounts.example.com/oauth2/auth",
19
+ "token_uri": "https://oauth2.example.com/token",
20
+ "auth_provider_x509_cert_url": "https://www.example.com/oauth2/v1/certs",
21
+ "client_x509_cert_url": "https://www.example.com/robot/v1/metadata/x509/mock%40example.com"
22
+ }'''
12
23
 
13
24
  PY3 = sys.version_info >= (3, 0)
14
25
  BUILTIN_OPEN = "builtins.open" if PY3 else "__builtin__.open"
@@ -264,7 +275,7 @@ class ApiKeyFromVariableTest(unittest.TestCase):
264
275
  self.down()
265
276
 
266
277
  def test_returns_dict_if_key_is_b64encoded(self):
267
- key = APIKEY
278
+ key = MOCK_API_KEY
268
279
  if sys.version_info < (3, 0):
269
280
  self.up(env={"CONDUCTOR_API_KEY": base64.b64encode(key)})
270
281
  else:
@@ -299,7 +310,7 @@ class ApiKeyFromFileTest(unittest.TestCase):
299
310
  self.assertEqual(result, None)
300
311
  self.down()
301
312
 
302
- @mock.patch(BUILTIN_OPEN, new_callable=mock.mock_open, read_data=APIKEY, create=True)
313
+ @mock.patch(BUILTIN_OPEN, new_callable=mock.mock_open, read_data=MOCK_API_KEY, create=True)
303
314
  def test_open_called_with_api_key_path(self, mock_file_open):
304
315
  self.up(env={"CONDUCTOR_API_KEY_PATH": "path/to/api_key"})
305
316
  config.Config.get_api_key_from_file()
@@ -313,7 +324,7 @@ class ApiKeyFromFileTest(unittest.TestCase):
313
324
  config.Config.get_api_key_from_file()
314
325
  self.down()
315
326
 
316
- @mock.patch(BUILTIN_OPEN, new_callable=mock.mock_open, read_data=APIKEY, create=True)
327
+ @mock.patch(BUILTIN_OPEN, new_callable=mock.mock_open, read_data=MOCK_API_KEY, create=True)
317
328
  def test_returns_dict_if_key_is_valid_json(self, mock_file_open):
318
329
  self.up(env={"CONDUCTOR_API_KEY_PATH": "path/to/api_key"})
319
330
  result = config.Config.get_api_key_from_file()
tests/test_data.py CHANGED
@@ -1,160 +1,173 @@
1
- """ test data
2
-
3
- isort:skip_file
4
- """
5
-
6
1
  import unittest
2
+ from unittest.mock import patch
3
+ from ciocore import data as coredata
7
4
 
8
- from unittest import mock
9
-
10
- from ciocore import data
11
-
12
-
13
- from project_fixtures import PROJECTS
14
- from package_fixtures import SOFTWARE_DATA
15
- from instance_type_fixtures import LIN_INSTANCE_TYPES, ALL_INSTANCE_TYPES
16
-
17
- class TestDataAllInstanceTypes(unittest.TestCase):
5
+ class TestCoreData(unittest.TestCase):
18
6
  def setUp(self):
19
- self.default_cache = {
20
- "projects": PROJECTS,
21
- "instance_types": ALL_INSTANCE_TYPES,
22
- "packages": SOFTWARE_DATA,
7
+ """Set up test fixtures before each test method."""
8
+ self.mock_api_responses = {
9
+ 'projects': ['ProjectA', 'ProjectB'],
10
+ 'instance_types': [
11
+ {'operating_system': 'windows', 'name': 'win_machine', 'cores': 1, 'memory': '1024'},
12
+ {'operating_system': 'linux', 'name': 'linux_machine', 'cores': 1, 'memory': '1024'}
13
+ ],
14
+ 'software': [ # Added package_id to each package
15
+ {
16
+ 'name': 'maya-io',
17
+ 'version': '2022',
18
+ 'platform': 'windows',
19
+ 'product': 'maya-io',
20
+ 'package_id': '123456789'
21
+ },
22
+ {
23
+ 'name': 'maya-io',
24
+ 'version': '2022',
25
+ 'platform': 'linux',
26
+ 'product': 'maya-io',
27
+ 'package_id': '123456780'
28
+ },
29
+ {
30
+ 'name': 'nuke',
31
+ 'version': '13.0',
32
+ 'platform': 'linux',
33
+ 'product': 'nuke',
34
+ 'package_id': '123456781'
35
+ }
36
+ ],
37
+ 'extra_env': ['PATH=/custom/path', 'LICENSE_SERVER=1234']
23
38
  }
24
-
25
- # self.get_data_patcher = mock.patch.object(DataCache, "get_data", return_value=self.default_cache)
26
-
27
- # self.account_id_patcher = mock.patch(
28
- # "ciocore.data.get_account_id", return_value="1234"
29
- # )
30
-
31
- # self.mock_get_data = self.get_data_patcher.start()
32
- # self.mock_account_id = self.account_id_patcher.start()
33
-
34
- data.__data__ = {}
35
- data.__products__ = None
39
+ # Clear data before each test
40
+ coredata.clear()
36
41
 
37
42
  def tearDown(self):
38
- # self.get_data_patcher.stop()
39
- # self.account_id_patcher.stop()
40
- pass
41
-
42
- # def override_default_cache(self, **kwargs):
43
- # return_val = {}
44
- # return_val.update(self.default_cache)
45
- # return_val.update(kwargs)
46
- # self.mock_get_data.return_value = return_val
47
-
48
- # def test_smoke(self):
49
- # self.assertEqual(1, 1)
50
-
51
- # def test_init_empty_projects_global(self):
52
- # data.init()
53
- # self.assertEqual(data.products(), [])
54
-
55
- # def test_init_stores_all_args(self):
56
- # data.init("a", "b", "c")
57
- # self.assertEqual(data.products(), ["a", "b", "c"])
58
-
59
- # def test_data_raises_if_not_initialized(self):
60
- # with self.assertRaises(ValueError):
61
- # data.data()
62
-
63
- # def test_valid(self):
64
- # self.assertEqual(data.valid(), False)
65
- # data.init()
66
- # data.data()
67
- # self.assertEqual(data.valid(), True)
68
-
69
- # def test_clear(self):
70
- # data.init()
71
- # data.data()
72
- # self.assertEqual(data.valid(), True)
73
- # data.clear()
74
- # self.assertEqual(data.valid(), False)
75
-
76
- # def test_does_not_refresh_if_not_force(self):
77
- # data.init()
78
- # p1 = data.data()["projects"]
79
- # self.assertEqual(len(p1), 4)
80
- # # merge the default cache with a new projects list containing only two projects
81
- # # self.override_default_cache(projects=["a", "b"])
82
- # p2 = data.data()["projects"]
83
- # self.assertEqual(p2, p1)
84
-
85
- # def test_does_refresh_if_force_all(self):
86
- # data.init()
87
- # p1 = data.data()["projects"]
88
- # self.assertEqual(len(p1), 4)
89
- # # self.override_default_cache(projects=["a", "b"])
90
- # p2 = data.data(force=True)["projects"]
91
- # self.assertNotEqual(p2, p1)
92
- # self.assertEqual(len(p2), 2)
93
-
94
- # def test_get_data_for_one_product(self):
95
- # data.init("c4d")
96
- # # inst = data.data()["instance_types"]
97
- # sw = data.data()["software"]
98
- # self.assertEqual(len(sw.supported_host_names()), 2)
99
-
100
- # def test_several_products(self):
101
- # data.init("c4d", "maya")
102
- # sw = data.data()["software"]
103
- # self.assertEqual(len(sw.supported_host_names()), 5)
104
-
105
- # def test_one_product_can_be_a_plugin(self):
106
- # data.init("redshift")
107
- # sw = data.data()["software"]
108
- # self.assertEqual(len(sw.supported_host_names()), 4)
109
-
110
- # def test_several_products_ignore_plugins(self):
111
- # data.init("redshift", "c4d")
112
- # sw = data.data()["software"]
113
- # self.assertEqual(len(sw.supported_host_names()), 2)
114
-
115
- # def test_linux_only_instance_types(self):
116
- # # self.override_default_cache(instance_types=LIN_INSTANCE_TYPES)
117
- # data.init()
118
- # h = data.data()["instance_types"]
119
- # self.assertEqual(len(h.instance_types.keys()), 4)
120
-
121
- # def test_linux_only_packages_when_linux_only_instance_types(self):
122
- # # self.override_default_cache(instance_types=LIN_INSTANCE_TYPES)
123
- # data.init("c4d")
124
- # sw = data.data()["software"]
125
- # self.assertEqual(len(sw.supported_host_names()), 1)
126
-
127
- # def test_platforms_method_only_linux(self):
128
- # self.override_default_cache(instance_types=LIN_INSTANCE_TYPES)/
129
- # data.init("c4d")
130
- # data.data()
131
- # self.assertEqual({"linux"}, data.platforms())
132
-
133
- # def test_many_products(self):
134
- # self.override_default_cache(instance_types=LIN_INSTANCE_TYPES)
135
- # data.init("c4d", "maya")
136
- # sw = data.data()["software"]
137
- # self.assertEqual(len(sw.supported_host_names()), 4)
138
-
139
- # def test_product_keyword_translates_to_single_arg(self):
140
- # data.init(product="c4d")
141
- # sw = data.data()["software"]
142
- # self.assertEqual(len(sw.supported_host_names()), 2)
143
-
144
- # def test_product_keyword_all_translates_to_all_products(self):
145
- # data.init(product="all")
146
- # sw = data.data()["software"]
147
- # self.assertEqual(len(sw.supported_host_names()), 11)
148
-
149
- # def test_data_raises_if_both_products_and_kwarg_given(self):
150
- # with self.assertRaises(ValueError):
151
- # data.init("maya", product="c4d")
152
-
153
- # def test_data_raises_if_products_and_kwarg_given(self):
154
- # with self.assertRaises(ValueError):
155
- # data.init("maya", product="c4d")
156
-
157
- class TestDataSmoke(unittest.TestCase):
158
-
159
- def test_smoke(self):
160
- self.assertTrue(True)
43
+ """Clean up after each test method."""
44
+ coredata.clear()
45
+
46
+ def test_init_with_single_product(self):
47
+ """Test initializing with a single product"""
48
+ coredata.init("maya-io")
49
+ self.assertEqual(coredata.products(), ["maya-io"])
50
+ self.assertEqual(coredata.platforms(), set(["windows", "linux"]))
51
+
52
+ def test_init_with_multiple_products(self):
53
+ """Test initializing with multiple products"""
54
+ coredata.init("maya-io", "nuke")
55
+ self.assertEqual(coredata.products(), ["maya-io", "nuke"])
56
+
57
+ def test_init_with_deprecated_product(self):
58
+ """Test initializing with deprecated product kwarg"""
59
+ coredata.init(product="maya-io")
60
+ self.assertEqual(coredata.products(), ["maya-io"])
61
+
62
+ def test_init_with_all_products(self):
63
+ """Test initializing with 'all' products"""
64
+ coredata.init(product="all")
65
+ self.assertEqual(coredata.products(), [])
66
+
67
+ def test_init_conflict_raises_error(self):
68
+ """Test that using both products arg and product kwarg raises error"""
69
+ with self.assertRaises(ValueError):
70
+ coredata.init("maya-io", product="nuke")
71
+
72
+ def test_data_requires_init(self):
73
+ """Test that data() raises error if not initialized"""
74
+ with self.assertRaises(ValueError):
75
+ coredata.data()
76
+
77
+ @patch('ciocore.data.api_client')
78
+ def test_data_fetching(self, mock_client):
79
+ """Test fetching data through the data() function"""
80
+ # Setup mock responses
81
+ mock_client.request_projects.return_value = self.mock_api_responses['projects']
82
+ mock_client.request_instance_types.return_value = self.mock_api_responses['instance_types']
83
+ mock_client.request_software_packages.return_value = self.mock_api_responses['software']
84
+ mock_client.request_extra_environment.return_value = self.mock_api_responses['extra_env']
85
+
86
+ coredata.init("maya-io")
87
+ result = coredata.data()
88
+
89
+ self.assertIn("projects", result)
90
+ self.assertIn("instance_types", result)
91
+ self.assertIn("software", result)
92
+ self.assertIn("extra_environment", result)
93
+
94
+ self.assertEqual(result["projects"], self.mock_api_responses["projects"])
95
+ self.assertIsInstance(result["instance_types"], coredata.HardwareSet)
96
+ self.assertIsInstance(result["software"], coredata.PackageTree)
97
+
98
+ @patch('ciocore.data.api_client')
99
+ def test_force_refresh(self, mock_client):
100
+ """Test forcing data refresh"""
101
+ # Setup mock responses
102
+ mock_client.request_projects.return_value = self.mock_api_responses['projects']
103
+ mock_client.request_instance_types.return_value = self.mock_api_responses['instance_types']
104
+ mock_client.request_software_packages.return_value = self.mock_api_responses['software']
105
+ mock_client.request_extra_environment.return_value = self.mock_api_responses['extra_env']
106
+
107
+ coredata.init("maya-io")
108
+ first_data = coredata.data()
109
+
110
+ # Second call without force should not make new API calls
111
+ mock_client.request_projects.reset_mock()
112
+ second_data = coredata.data()
113
+ mock_client.request_projects.assert_not_called()
114
+
115
+ # Call with force=True should make new API calls
116
+ third_data = coredata.data(force=True)
117
+ mock_client.request_projects.assert_called_once()
118
+
119
+ def test_valid_state(self):
120
+ """Test valid() function behavior"""
121
+ self.assertFalse(coredata.valid()) # Should be invalid before initialization
122
+
123
+ coredata.init("maya-io")
124
+ self.assertFalse(coredata.valid()) # Should be invalid before data is fetched
125
+
126
+ with patch('ciocore.data.api_client') as mock_client:
127
+ # Setup mock responses
128
+ mock_client.request_projects.return_value = self.mock_api_responses['projects']
129
+ mock_client.request_instance_types.return_value = self.mock_api_responses['instance_types']
130
+ mock_client.request_software_packages.return_value = self.mock_api_responses['software']
131
+ mock_client.request_extra_environment.return_value = self.mock_api_responses['extra_env']
132
+
133
+ coredata.data() # Fetch data
134
+ self.assertTrue(coredata.valid()) # Should be valid after data is fetched
135
+
136
+ coredata.clear()
137
+ self.assertFalse(coredata.valid()) # Should be invalid after clear
138
+
139
+ @patch('ciocore.data.api_client')
140
+ def test_platforms_filtering(self, mock_client):
141
+ """Test platform filtering based on instance types and software"""
142
+ # Setup mock responses
143
+ mock_client.request_projects.return_value = self.mock_api_responses['projects']
144
+ mock_client.request_instance_types.return_value = self.mock_api_responses['instance_types']
145
+ mock_client.request_software_packages.return_value = self.mock_api_responses['software']
146
+ mock_client.request_extra_environment.return_value = self.mock_api_responses['extra_env']
147
+
148
+ coredata.init("nuke") # nuke only supports linux
149
+ coredata.data()
150
+
151
+ # Should only have linux instance types since nuke only supports linux
152
+ self.assertEqual(coredata.platforms(), {"linux"})
153
+
154
+ @patch('ciocore.data.api_client')
155
+ def test_instances_filter(self, mock_client):
156
+ """Testing that instance_types is passed correctly to api_client"""
157
+ # Set up mock response
158
+ mock_client.request_instance_types.return_value = self.mock_api_responses['instance_types']
159
+ coredata.init("maya-io")
160
+
161
+ # Test with no filter
162
+ coredata.data()
163
+ mock_client.request_instance_types.assert_called_with(filter_param="")
164
+
165
+ # Test with filter and force=True
166
+ mock_client.request_instance_types.reset_mock()
167
+
168
+ instances_filter = "gpu.gpu_count=gte:1:int"
169
+ coredata.data(force=True, instances_filter=instances_filter)
170
+ mock_client.request_instance_types.assert_called_with(filter_param=instances_filter)
171
+
172
+ if __name__ == '__main__':
173
+ unittest.main()
@@ -1,57 +0,0 @@
1
-
2
-
3
- EXTRA_ENV = [
4
- {
5
- "account_id": "6649535867387904",
6
- "env": [],
7
- },
8
- {
9
- "account_id": "5767615549800448",
10
- "env": [
11
- {
12
- "merge_policy": "prepend",
13
- "name": "test",
14
- "value": "test"
15
- }
16
- ],
17
- },
18
- {
19
- "account_id": "6649535867387904",
20
- "env": [],
21
- },
22
- {
23
- "account_id": "5669544198668288",
24
- "env": [
25
- {
26
- "merge_policy": "append",
27
- "name": "PATH",
28
- "value": "/path/to/scripts"
29
- },
30
- {
31
- "merge_policy": "exclusive",
32
- "name": "RENDER_LOCATION",
33
- "value": "cloud"
34
- },
35
- {
36
- "merge_policy": "exclusive",
37
- "name": "VARIABLE_USED_IN_SCRIPTS",
38
- "value": "true"
39
- },
40
- {
41
- "merge_policy": "exclusive",
42
- "name": "testvar",
43
- "value": "somevalue"
44
- }
45
- ],
46
- },
47
- {
48
- "account_id": "6649535867387904",
49
- "env": [
50
- {
51
- "merge_policy": "exclusive",
52
- "name": "JMEYER",
53
- "value": "JMEYER_ENV_VALUE"
54
- }
55
- ],
56
- }
57
- ]
tests/project_fixtures.py DELETED
@@ -1,8 +0,0 @@
1
-
2
-
3
- PROJECTS = [
4
- "Deadpool",
5
- "Harry Potter & the chamber of secrets",
6
- "Captain Corelli's Mandolin",
7
- "Gone with the Wind",
8
- ]