ciocore 5.1.1__py2.py3-none-any.whl → 10.0.0b3__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.
Files changed (126) hide show
  1. ciocore/VERSION +1 -1
  2. ciocore/__init__.py +23 -1
  3. ciocore/api_client.py +655 -160
  4. ciocore/auth/__init__.py +5 -3
  5. ciocore/cli.py +501 -0
  6. ciocore/common.py +15 -13
  7. ciocore/conductor_submit.py +77 -60
  8. ciocore/config.py +127 -13
  9. ciocore/data.py +162 -77
  10. ciocore/docsite/404.html +746 -0
  11. ciocore/docsite/apidoc/api_client/index.html +3605 -0
  12. ciocore/docsite/apidoc/apidoc/index.html +909 -0
  13. ciocore/docsite/apidoc/config/index.html +1652 -0
  14. ciocore/docsite/apidoc/data/index.html +1553 -0
  15. ciocore/docsite/apidoc/hardware_set/index.html +2460 -0
  16. ciocore/docsite/apidoc/package_environment/index.html +1507 -0
  17. ciocore/docsite/apidoc/package_tree/index.html +2386 -0
  18. ciocore/docsite/assets/_mkdocstrings.css +16 -0
  19. ciocore/docsite/assets/images/favicon.png +0 -0
  20. ciocore/docsite/assets/javascripts/bundle.471ce7a9.min.js +29 -0
  21. ciocore/docsite/assets/javascripts/bundle.471ce7a9.min.js.map +7 -0
  22. ciocore/docsite/assets/javascripts/lunr/min/lunr.ar.min.js +1 -0
  23. ciocore/docsite/assets/javascripts/lunr/min/lunr.da.min.js +18 -0
  24. ciocore/docsite/assets/javascripts/lunr/min/lunr.de.min.js +18 -0
  25. ciocore/docsite/assets/javascripts/lunr/min/lunr.du.min.js +18 -0
  26. ciocore/docsite/assets/javascripts/lunr/min/lunr.el.min.js +1 -0
  27. ciocore/docsite/assets/javascripts/lunr/min/lunr.es.min.js +18 -0
  28. ciocore/docsite/assets/javascripts/lunr/min/lunr.fi.min.js +18 -0
  29. ciocore/docsite/assets/javascripts/lunr/min/lunr.fr.min.js +18 -0
  30. ciocore/docsite/assets/javascripts/lunr/min/lunr.he.min.js +1 -0
  31. ciocore/docsite/assets/javascripts/lunr/min/lunr.hi.min.js +1 -0
  32. ciocore/docsite/assets/javascripts/lunr/min/lunr.hu.min.js +18 -0
  33. ciocore/docsite/assets/javascripts/lunr/min/lunr.hy.min.js +1 -0
  34. ciocore/docsite/assets/javascripts/lunr/min/lunr.it.min.js +18 -0
  35. ciocore/docsite/assets/javascripts/lunr/min/lunr.ja.min.js +1 -0
  36. ciocore/docsite/assets/javascripts/lunr/min/lunr.jp.min.js +1 -0
  37. ciocore/docsite/assets/javascripts/lunr/min/lunr.kn.min.js +1 -0
  38. ciocore/docsite/assets/javascripts/lunr/min/lunr.ko.min.js +1 -0
  39. ciocore/docsite/assets/javascripts/lunr/min/lunr.multi.min.js +1 -0
  40. ciocore/docsite/assets/javascripts/lunr/min/lunr.nl.min.js +18 -0
  41. ciocore/docsite/assets/javascripts/lunr/min/lunr.no.min.js +18 -0
  42. ciocore/docsite/assets/javascripts/lunr/min/lunr.pt.min.js +18 -0
  43. ciocore/docsite/assets/javascripts/lunr/min/lunr.ro.min.js +18 -0
  44. ciocore/docsite/assets/javascripts/lunr/min/lunr.ru.min.js +18 -0
  45. ciocore/docsite/assets/javascripts/lunr/min/lunr.sa.min.js +1 -0
  46. ciocore/docsite/assets/javascripts/lunr/min/lunr.stemmer.support.min.js +1 -0
  47. ciocore/docsite/assets/javascripts/lunr/min/lunr.sv.min.js +18 -0
  48. ciocore/docsite/assets/javascripts/lunr/min/lunr.ta.min.js +1 -0
  49. ciocore/docsite/assets/javascripts/lunr/min/lunr.te.min.js +1 -0
  50. ciocore/docsite/assets/javascripts/lunr/min/lunr.th.min.js +1 -0
  51. ciocore/docsite/assets/javascripts/lunr/min/lunr.tr.min.js +18 -0
  52. ciocore/docsite/assets/javascripts/lunr/min/lunr.vi.min.js +1 -0
  53. ciocore/docsite/assets/javascripts/lunr/min/lunr.zh.min.js +1 -0
  54. ciocore/docsite/assets/javascripts/lunr/tinyseg.js +206 -0
  55. ciocore/docsite/assets/javascripts/lunr/wordcut.js +6708 -0
  56. ciocore/docsite/assets/javascripts/workers/search.b8dbb3d2.min.js +42 -0
  57. ciocore/docsite/assets/javascripts/workers/search.b8dbb3d2.min.js.map +7 -0
  58. ciocore/docsite/assets/stylesheets/main.3cba04c6.min.css +1 -0
  59. ciocore/docsite/assets/stylesheets/main.3cba04c6.min.css.map +1 -0
  60. ciocore/docsite/assets/stylesheets/palette.06af60db.min.css +1 -0
  61. ciocore/docsite/assets/stylesheets/palette.06af60db.min.css.map +1 -0
  62. ciocore/docsite/cmdline/docs/index.html +871 -0
  63. ciocore/docsite/cmdline/downloader/index.html +934 -0
  64. ciocore/docsite/cmdline/packages/index.html +878 -0
  65. ciocore/docsite/cmdline/uploader/index.html +995 -0
  66. ciocore/docsite/how-to-guides/index.html +869 -0
  67. ciocore/docsite/index.html +895 -0
  68. ciocore/docsite/logo.png +0 -0
  69. ciocore/docsite/objects.inv +0 -0
  70. ciocore/docsite/search/search_index.json +1 -0
  71. ciocore/docsite/sitemap.xml +3 -0
  72. ciocore/docsite/sitemap.xml.gz +0 -0
  73. ciocore/docsite/stylesheets/extra.css +26 -0
  74. ciocore/docsite/stylesheets/tables.css +167 -0
  75. ciocore/downloader/base_downloader.py +644 -0
  76. ciocore/downloader/download_runner_base.py +47 -0
  77. ciocore/downloader/job_downloader.py +119 -0
  78. ciocore/{downloader.py → downloader/legacy_downloader.py} +12 -9
  79. ciocore/downloader/log.py +73 -0
  80. ciocore/downloader/logging_download_runner.py +87 -0
  81. ciocore/downloader/perpetual_downloader.py +63 -0
  82. ciocore/downloader/registry.py +97 -0
  83. ciocore/downloader/reporter.py +135 -0
  84. ciocore/exceptions.py +8 -2
  85. ciocore/file_utils.py +51 -50
  86. ciocore/hardware_set.py +449 -0
  87. ciocore/loggeria.py +89 -20
  88. ciocore/package_environment.py +110 -48
  89. ciocore/package_query.py +182 -0
  90. ciocore/package_tree.py +319 -258
  91. ciocore/retry.py +0 -0
  92. ciocore/uploader/_uploader.py +547 -364
  93. ciocore/uploader/thread_queue_job.py +176 -0
  94. ciocore/uploader/upload_stats/__init__.py +3 -4
  95. ciocore/uploader/upload_stats/stats_formats.py +10 -4
  96. ciocore/validator.py +34 -2
  97. ciocore/worker.py +174 -151
  98. ciocore-10.0.0b3.dist-info/METADATA +928 -0
  99. ciocore-10.0.0b3.dist-info/RECORD +128 -0
  100. {ciocore-5.1.1.dist-info → ciocore-10.0.0b3.dist-info}/WHEEL +1 -1
  101. ciocore-10.0.0b3.dist-info/entry_points.txt +2 -0
  102. tests/instance_type_fixtures.py +175 -0
  103. tests/package_fixtures.py +205 -0
  104. tests/test_api_client.py +297 -12
  105. tests/test_base_downloader.py +104 -0
  106. tests/test_cli.py +149 -0
  107. tests/test_common.py +1 -7
  108. tests/test_config.py +40 -18
  109. tests/test_data.py +162 -173
  110. tests/test_downloader.py +118 -0
  111. tests/test_hardware_set.py +139 -0
  112. tests/test_job_downloader.py +213 -0
  113. tests/test_package_query.py +38 -0
  114. tests/test_package_tree.py +91 -291
  115. tests/test_submit.py +44 -18
  116. tests/test_uploader.py +1 -4
  117. ciocore/__about__.py +0 -10
  118. ciocore/cli/conductor.py +0 -191
  119. ciocore/compat.py +0 -15
  120. ciocore-5.1.1.data/scripts/conductor +0 -19
  121. ciocore-5.1.1.data/scripts/conductor.bat +0 -13
  122. ciocore-5.1.1.dist-info/METADATA +0 -408
  123. ciocore-5.1.1.dist-info/RECORD +0 -47
  124. tests/mocks/api_client_mock.py +0 -51
  125. /ciocore/{cli → downloader}/__init__.py +0 -0
  126. {ciocore-5.1.1.dist-info → ciocore-10.0.0b3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1507 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+
10
+ <meta name="author" content="Conductor Developers">
11
+
12
+
13
+
14
+ <link rel="prev" href="../package_tree/">
15
+
16
+
17
+ <link rel="next" href="../../how-to-guides/">
18
+
19
+
20
+ <link rel="icon" href="../../assets/images/favicon.png">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.32">
22
+
23
+
24
+
25
+ <title>ciocore.package_environment - Conductor Core</title>
26
+
27
+
28
+
29
+ <link rel="stylesheet" href="../../assets/stylesheets/main.3cba04c6.min.css">
30
+
31
+
32
+ <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
46
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Raleway:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
47
+ <style>:root{--md-text-font:"Raleway";--md-code-font:"Roboto Mono"}</style>
48
+
49
+
50
+
51
+ <link rel="stylesheet" href="../../assets/_mkdocstrings.css">
52
+
53
+ <link rel="stylesheet" href="../../stylesheets/extra.css">
54
+
55
+ <link rel="stylesheet" href="../../stylesheets/tables.css">
56
+
57
+ <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
58
+
59
+
60
+
61
+
62
+
63
+
64
+ </head>
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+ <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom">
75
+
76
+
77
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
78
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
79
+ <label class="md-overlay" for="__drawer"></label>
80
+ <div data-md-component="skip">
81
+
82
+
83
+ <a href="#ciocorepackage_environment" class="md-skip">
84
+ Skip to content
85
+ </a>
86
+
87
+ </div>
88
+ <div data-md-component="announce">
89
+
90
+ </div>
91
+
92
+
93
+
94
+
95
+
96
+
97
+ <header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
98
+ <nav class="md-header__inner md-grid" aria-label="Header">
99
+ <a href="https://www.conductortech.com" title="Conductor Core" class="md-header__button md-logo" aria-label="Conductor Core" data-md-component="logo">
100
+
101
+ <img src="../../logo.png" alt="logo">
102
+
103
+ </a>
104
+ <label class="md-header__button md-icon" for="__drawer">
105
+
106
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
107
+ </label>
108
+ <div class="md-header__title" data-md-component="header-title">
109
+ <div class="md-header__ellipsis">
110
+ <div class="md-header__topic">
111
+ <span class="md-ellipsis">
112
+ Conductor Core
113
+ </span>
114
+ </div>
115
+ <div class="md-header__topic" data-md-component="header-topic">
116
+ <span class="md-ellipsis">
117
+
118
+ ciocore.package_environment
119
+
120
+ </span>
121
+ </div>
122
+ </div>
123
+ </div>
124
+
125
+
126
+ <form class="md-header__option" data-md-component="palette">
127
+
128
+
129
+
130
+
131
+ <input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
132
+
133
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
134
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg>
135
+ </label>
136
+
137
+
138
+
139
+
140
+
141
+ <input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
142
+
143
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
144
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg>
145
+ </label>
146
+
147
+
148
+ </form>
149
+
150
+
151
+
152
+ <script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
153
+
154
+
155
+
156
+ <label class="md-header__button md-icon" for="__search">
157
+
158
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
159
+ </label>
160
+ <div class="md-search" data-md-component="search" role="dialog">
161
+ <label class="md-search__overlay" for="__search"></label>
162
+ <div class="md-search__inner" role="search">
163
+ <form class="md-search__form" name="search">
164
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
165
+ <label class="md-search__icon md-icon" for="__search">
166
+
167
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
168
+
169
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
170
+ </label>
171
+ <nav class="md-search__options" aria-label="Search">
172
+
173
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
174
+
175
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
176
+ </button>
177
+ </nav>
178
+
179
+ </form>
180
+ <div class="md-search__output">
181
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
182
+ <div class="md-search-result" data-md-component="search-result">
183
+ <div class="md-search-result__meta">
184
+ Initializing search
185
+ </div>
186
+ <ol class="md-search-result__list" role="presentation"></ol>
187
+ </div>
188
+ </div>
189
+ </div>
190
+ </div>
191
+ </div>
192
+
193
+
194
+ </nav>
195
+
196
+
197
+
198
+ <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
199
+ <div class="md-grid">
200
+ <ul class="md-tabs__list">
201
+
202
+
203
+
204
+
205
+
206
+ <li class="md-tabs__item">
207
+ <a href="../.." class="md-tabs__link">
208
+
209
+
210
+
211
+
212
+ Overview
213
+
214
+ </a>
215
+ </li>
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+ <li class="md-tabs__item">
226
+ <a href="../../cmdline/uploader/" class="md-tabs__link">
227
+
228
+
229
+ CLI
230
+
231
+ </a>
232
+ </li>
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+
241
+
242
+
243
+
244
+
245
+ <li class="md-tabs__item md-tabs__item--active">
246
+ <a href="../apidoc/" class="md-tabs__link">
247
+
248
+
249
+ API
250
+
251
+ </a>
252
+ </li>
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+ <li class="md-tabs__item">
262
+ <a href="../../how-to-guides/" class="md-tabs__link">
263
+
264
+
265
+
266
+
267
+ How to
268
+
269
+ </a>
270
+ </li>
271
+
272
+
273
+
274
+ </ul>
275
+ </div>
276
+ </nav>
277
+
278
+
279
+ </header>
280
+
281
+ <div class="md-container" data-md-component="container">
282
+
283
+
284
+
285
+
286
+ <main class="md-main" data-md-component="main">
287
+ <div class="md-main__inner md-grid">
288
+
289
+
290
+
291
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
292
+ <div class="md-sidebar__scrollwrap">
293
+ <div class="md-sidebar__inner">
294
+
295
+
296
+
297
+
298
+
299
+
300
+ <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
301
+ <label class="md-nav__title" for="__drawer">
302
+ <a href="https://www.conductortech.com" title="Conductor Core" class="md-nav__button md-logo" aria-label="Conductor Core" data-md-component="logo">
303
+
304
+ <img src="../../logo.png" alt="logo">
305
+
306
+ </a>
307
+ Conductor Core
308
+ </label>
309
+
310
+ <ul class="md-nav__list" data-md-scrollfix>
311
+
312
+
313
+
314
+
315
+
316
+
317
+
318
+ <li class="md-nav__item">
319
+ <a href="../.." class="md-nav__link">
320
+
321
+
322
+ <span class="md-ellipsis">
323
+ Overview
324
+ </span>
325
+
326
+
327
+ </a>
328
+ </li>
329
+
330
+
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+
340
+
341
+
342
+
343
+
344
+
345
+ <li class="md-nav__item md-nav__item--nested">
346
+
347
+
348
+
349
+
350
+
351
+ <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
352
+
353
+
354
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
355
+
356
+
357
+ <span class="md-ellipsis">
358
+ CLI
359
+ </span>
360
+
361
+
362
+ <span class="md-nav__icon md-icon"></span>
363
+ </label>
364
+
365
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
366
+ <label class="md-nav__title" for="__nav_2">
367
+ <span class="md-nav__icon md-icon"></span>
368
+ CLI
369
+ </label>
370
+ <ul class="md-nav__list" data-md-scrollfix>
371
+
372
+
373
+
374
+
375
+
376
+
377
+
378
+ <li class="md-nav__item">
379
+ <a href="../../cmdline/uploader/" class="md-nav__link">
380
+
381
+
382
+ <span class="md-ellipsis">
383
+ Uploader
384
+ </span>
385
+
386
+
387
+ </a>
388
+ </li>
389
+
390
+
391
+
392
+
393
+
394
+
395
+
396
+
397
+
398
+
399
+ <li class="md-nav__item">
400
+ <a href="../../cmdline/downloader/" class="md-nav__link">
401
+
402
+
403
+ <span class="md-ellipsis">
404
+ Downloader
405
+ </span>
406
+
407
+
408
+ </a>
409
+ </li>
410
+
411
+
412
+
413
+
414
+
415
+
416
+
417
+
418
+
419
+
420
+ <li class="md-nav__item">
421
+ <a href="../../cmdline/packages/" class="md-nav__link">
422
+
423
+
424
+ <span class="md-ellipsis">
425
+ Packages
426
+ </span>
427
+
428
+
429
+ </a>
430
+ </li>
431
+
432
+
433
+
434
+
435
+
436
+
437
+
438
+
439
+
440
+
441
+ <li class="md-nav__item">
442
+ <a href="../../cmdline/docs/" class="md-nav__link">
443
+
444
+
445
+ <span class="md-ellipsis">
446
+ Docs
447
+ </span>
448
+
449
+
450
+ </a>
451
+ </li>
452
+
453
+
454
+
455
+
456
+ </ul>
457
+ </nav>
458
+
459
+ </li>
460
+
461
+
462
+
463
+
464
+
465
+
466
+
467
+
468
+
469
+
470
+
471
+
472
+
473
+
474
+
475
+
476
+
477
+
478
+
479
+
480
+
481
+ <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
482
+
483
+
484
+
485
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
486
+
487
+
488
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
489
+
490
+
491
+ <span class="md-ellipsis">
492
+ API
493
+ </span>
494
+
495
+
496
+ <span class="md-nav__icon md-icon"></span>
497
+ </label>
498
+
499
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
500
+ <label class="md-nav__title" for="__nav_3">
501
+ <span class="md-nav__icon md-icon"></span>
502
+ API
503
+ </label>
504
+ <ul class="md-nav__list" data-md-scrollfix>
505
+
506
+
507
+
508
+
509
+
510
+
511
+
512
+ <li class="md-nav__item">
513
+ <a href="../apidoc/" class="md-nav__link">
514
+
515
+
516
+ <span class="md-ellipsis">
517
+ Api Overview
518
+ </span>
519
+
520
+
521
+ </a>
522
+ </li>
523
+
524
+
525
+
526
+
527
+
528
+
529
+
530
+
531
+
532
+
533
+ <li class="md-nav__item">
534
+ <a href="../api_client/" class="md-nav__link">
535
+
536
+
537
+ <span class="md-ellipsis">
538
+ ciocore.api_client
539
+ </span>
540
+
541
+
542
+ </a>
543
+ </li>
544
+
545
+
546
+
547
+
548
+
549
+
550
+
551
+
552
+
553
+
554
+ <li class="md-nav__item">
555
+ <a href="../config/" class="md-nav__link">
556
+
557
+
558
+ <span class="md-ellipsis">
559
+ ciocore.config
560
+ </span>
561
+
562
+
563
+ </a>
564
+ </li>
565
+
566
+
567
+
568
+
569
+
570
+
571
+
572
+
573
+
574
+
575
+ <li class="md-nav__item">
576
+ <a href="../data/" class="md-nav__link">
577
+
578
+
579
+ <span class="md-ellipsis">
580
+ ciocore.data
581
+ </span>
582
+
583
+
584
+ </a>
585
+ </li>
586
+
587
+
588
+
589
+
590
+
591
+
592
+
593
+
594
+
595
+
596
+ <li class="md-nav__item">
597
+ <a href="../hardware_set/" class="md-nav__link">
598
+
599
+
600
+ <span class="md-ellipsis">
601
+ ciocore.hardware_set
602
+ </span>
603
+
604
+
605
+ </a>
606
+ </li>
607
+
608
+
609
+
610
+
611
+
612
+
613
+
614
+
615
+
616
+
617
+ <li class="md-nav__item">
618
+ <a href="../package_tree/" class="md-nav__link">
619
+
620
+
621
+ <span class="md-ellipsis">
622
+ ciocore.package_tree
623
+ </span>
624
+
625
+
626
+ </a>
627
+ </li>
628
+
629
+
630
+
631
+
632
+
633
+
634
+
635
+
636
+
637
+
638
+
639
+
640
+ <li class="md-nav__item md-nav__item--active">
641
+
642
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
643
+
644
+
645
+
646
+
647
+
648
+ <label class="md-nav__link md-nav__link--active" for="__toc">
649
+
650
+
651
+ <span class="md-ellipsis">
652
+ ciocore.package_environment
653
+ </span>
654
+
655
+
656
+ <span class="md-nav__icon md-icon"></span>
657
+ </label>
658
+
659
+ <a href="./" class="md-nav__link md-nav__link--active">
660
+
661
+
662
+ <span class="md-ellipsis">
663
+ ciocore.package_environment
664
+ </span>
665
+
666
+
667
+ </a>
668
+
669
+
670
+
671
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
672
+
673
+
674
+
675
+
676
+
677
+
678
+ <label class="md-nav__title" for="__toc">
679
+ <span class="md-nav__icon md-icon"></span>
680
+ Table of contents
681
+ </label>
682
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
683
+
684
+ <li class="md-nav__item">
685
+ <a href="#ciocore.package_environment" class="md-nav__link">
686
+ <span class="md-ellipsis">
687
+ ciocore.package_environment
688
+ </span>
689
+ </a>
690
+
691
+ </li>
692
+
693
+ <li class="md-nav__item">
694
+ <a href="#ciocore.package_environment.PackageEnvironment" class="md-nav__link">
695
+ <span class="md-ellipsis">
696
+ PackageEnvironment
697
+ </span>
698
+ </a>
699
+
700
+ <nav class="md-nav" aria-label="PackageEnvironment">
701
+ <ul class="md-nav__list">
702
+
703
+ <li class="md-nav__item">
704
+ <a href="#ciocore.package_environment.PackageEnvironment.__init__" class="md-nav__link">
705
+ <span class="md-ellipsis">
706
+ __init__()
707
+ </span>
708
+ </a>
709
+
710
+ </li>
711
+
712
+ <li class="md-nav__item">
713
+ <a href="#ciocore.package_environment.PackageEnvironment.extend" class="md-nav__link">
714
+ <span class="md-ellipsis">
715
+ extend()
716
+ </span>
717
+ </a>
718
+
719
+ </li>
720
+
721
+ <li class="md-nav__item">
722
+ <a href="#ciocore.package_environment.PackageEnvironment.__iter__" class="md-nav__link">
723
+ <span class="md-ellipsis">
724
+ __iter__()
725
+ </span>
726
+ </a>
727
+
728
+ </li>
729
+
730
+ <li class="md-nav__item">
731
+ <a href="#ciocore.package_environment.PackageEnvironment.__getitem__" class="md-nav__link">
732
+ <span class="md-ellipsis">
733
+ __getitem__()
734
+ </span>
735
+ </a>
736
+
737
+ </li>
738
+
739
+ </ul>
740
+ </nav>
741
+
742
+ </li>
743
+
744
+ </ul>
745
+
746
+ </nav>
747
+
748
+ </li>
749
+
750
+
751
+
752
+
753
+ </ul>
754
+ </nav>
755
+
756
+ </li>
757
+
758
+
759
+
760
+
761
+
762
+
763
+
764
+
765
+
766
+ <li class="md-nav__item">
767
+ <a href="../../how-to-guides/" class="md-nav__link">
768
+
769
+
770
+ <span class="md-ellipsis">
771
+ How to
772
+ </span>
773
+
774
+
775
+ </a>
776
+ </li>
777
+
778
+
779
+
780
+ </ul>
781
+ </nav>
782
+ </div>
783
+ </div>
784
+ </div>
785
+
786
+
787
+
788
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
789
+ <div class="md-sidebar__scrollwrap">
790
+ <div class="md-sidebar__inner">
791
+
792
+
793
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
794
+
795
+
796
+
797
+
798
+
799
+
800
+ <label class="md-nav__title" for="__toc">
801
+ <span class="md-nav__icon md-icon"></span>
802
+ Table of contents
803
+ </label>
804
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
805
+
806
+ <li class="md-nav__item">
807
+ <a href="#ciocore.package_environment" class="md-nav__link">
808
+ <span class="md-ellipsis">
809
+ ciocore.package_environment
810
+ </span>
811
+ </a>
812
+
813
+ </li>
814
+
815
+ <li class="md-nav__item">
816
+ <a href="#ciocore.package_environment.PackageEnvironment" class="md-nav__link">
817
+ <span class="md-ellipsis">
818
+ PackageEnvironment
819
+ </span>
820
+ </a>
821
+
822
+ <nav class="md-nav" aria-label="PackageEnvironment">
823
+ <ul class="md-nav__list">
824
+
825
+ <li class="md-nav__item">
826
+ <a href="#ciocore.package_environment.PackageEnvironment.__init__" class="md-nav__link">
827
+ <span class="md-ellipsis">
828
+ __init__()
829
+ </span>
830
+ </a>
831
+
832
+ </li>
833
+
834
+ <li class="md-nav__item">
835
+ <a href="#ciocore.package_environment.PackageEnvironment.extend" class="md-nav__link">
836
+ <span class="md-ellipsis">
837
+ extend()
838
+ </span>
839
+ </a>
840
+
841
+ </li>
842
+
843
+ <li class="md-nav__item">
844
+ <a href="#ciocore.package_environment.PackageEnvironment.__iter__" class="md-nav__link">
845
+ <span class="md-ellipsis">
846
+ __iter__()
847
+ </span>
848
+ </a>
849
+
850
+ </li>
851
+
852
+ <li class="md-nav__item">
853
+ <a href="#ciocore.package_environment.PackageEnvironment.__getitem__" class="md-nav__link">
854
+ <span class="md-ellipsis">
855
+ __getitem__()
856
+ </span>
857
+ </a>
858
+
859
+ </li>
860
+
861
+ </ul>
862
+ </nav>
863
+
864
+ </li>
865
+
866
+ </ul>
867
+
868
+ </nav>
869
+ </div>
870
+ </div>
871
+ </div>
872
+
873
+
874
+
875
+ <div class="md-content" data-md-component="content">
876
+ <article class="md-content__inner md-typeset">
877
+
878
+
879
+
880
+
881
+ <h1 id="ciocorepackage_environment">ciocore.package_environment</h1>
882
+
883
+
884
+ <div class="doc doc-object doc-module">
885
+
886
+ <a id="ciocore.package_environment"></a>
887
+ <div class="doc doc-contents first">
888
+
889
+ <p>Manage environment variables for both Windows and Linux render nodes.</p>
890
+
891
+
892
+
893
+ <div class="doc doc-children">
894
+
895
+
896
+
897
+
898
+
899
+
900
+
901
+ <div class="doc doc-object doc-class">
902
+
903
+
904
+
905
+ <h2 id="ciocore.package_environment.PackageEnvironment" class="doc doc-heading">
906
+ <code>
907
+ PackageEnvironment </code>
908
+
909
+
910
+
911
+ </h2>
912
+
913
+ <div class="doc doc-contents ">
914
+
915
+
916
+ <details class="quote">
917
+ <summary>Source code in <code>ciocore/package_environment.py</code></summary>
918
+ <div class="highlight"><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">PackageEnvironment</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
919
+
920
+
921
+ <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">env_list</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">platform</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
922
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
923
+ <span class="sd"> Encapsulate a list of environment variables.</span>
924
+
925
+ <span class="sd"> Typically, one would initialize a PackageEnvironment with a package, and then modify by adding more packages or lists of variables. Extra variables can be added by the customer, or programmatically such as during asset scraping.</span>
926
+
927
+ <span class="sd"> Args:</span>
928
+ <span class="sd"> env_list (object|list): An object that provides a list of dictionaries with properties: `name`, `value`, and `merge_policy`.</span>
929
+ <span class="sd"> platform (str): If the env_list is a regular list, then this is required.</span>
930
+
931
+ <span class="sd"> Args are delegated to [extend()](/package_environment/#ciocore.package_environment.PackageEnvironment.extend).</span>
932
+ <span class="sd"> &quot;&quot;&quot;</span>
933
+ <span class="bp">self</span><span class="o">.</span><span class="n">platform</span> <span class="o">=</span> <span class="kc">None</span>
934
+ <span class="bp">self</span><span class="o">.</span><span class="n">_env</span> <span class="o">=</span> <span class="p">{}</span>
935
+
936
+ <span class="bp">self</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">env_list</span><span class="p">,</span> <span class="n">platform</span><span class="p">)</span>
937
+
938
+
939
+ <span class="k">def</span><span class="w"> </span><span class="nf">extend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">env_list</span><span class="p">,</span> <span class="n">platform</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
940
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
941
+ <span class="sd"> Extend the Package environment with the given variable specifications.</span>
942
+
943
+ <span class="sd"> Args:</span>
944
+ <span class="sd"> env_list (object|list): Either:</span>
945
+ <span class="sd"> * A list of dictionaries with properties: `name`, `value`, and `merge_policy`.</span>
946
+ <span class="sd"> * An object with an `environment` key that contains a list of the dictionaries described above. The latter is the structure of a package. Therefore we can initialize or extend a PackageEnvironment with a package.</span>
947
+ <span class="sd"> platform (str): Defaults to `None`. If env_list is a package, then the platform is taken from the package and the `platform` keyword is ignored. If env_list is a list, then if this is the first add, a platform should be specified, otherwise it will default to linux.</span>
948
+
949
+ <span class="sd"> The first time data is added to a PackageEnvironment, the platform is set in stone. Subsequent `adds` that try to change the platform are considered an error.</span>
950
+
951
+ <span class="sd"> Each variable to be added specifies a merge_policy: `append`, `prepend`, or `exclusive` `append` and `prepend` can be thought of as lists= types. Once an individual variable has been initialized as a list, it can&#39;t be changed to `exclusive`. This means:</span>
952
+
953
+ <span class="sd"> 1. It&#39;s not possible to overwrite variables that have been added as `append` or `prepend`.</span>
954
+ <span class="sd"> 2. Exclusive variables are always overwritten by subsequent adds.</span>
955
+
956
+ <span class="sd"> Raises:</span>
957
+ <span class="sd"> ValueError: Either an attempt to change the platform once initialized, or an invalid merge policy.</span>
958
+
959
+
960
+ <span class="sd"> Example:</span>
961
+ <span class="sd"> &gt;&gt;&gt; from ciocore import api_client, package_tree, package_environment</span>
962
+ <span class="sd"> &gt;&gt;&gt; packages = api_client.request_software_packages()</span>
963
+ <span class="sd"> &gt;&gt;&gt; pt = package_tree.PackageTree(packages, product=&quot;cinema4d&quot;)</span>
964
+ <span class="sd"> &gt;&gt;&gt; one_dcc_name = pt.supported_host_names()[0]</span>
965
+ <span class="sd"> cinema4d 21.209.RB305619 linux</span>
966
+
967
+ <span class="sd"> &gt;&gt;&gt; pkg = pt.find_by_name(one_dcc_name)</span>
968
+ <span class="sd"> &gt;&gt;&gt; pe = package_environment.PackageEnvironment(pkg)</span>
969
+ <span class="sd"> &gt;&gt;&gt; print(dict(pe))</span>
970
+ <span class="sd"> {</span>
971
+ <span class="sd"> &quot;PATH&quot;: &quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin&quot;,</span>
972
+ <span class="sd"> &quot;g_licenseServerRLM&quot;: &quot;conductor-rlm:6112&quot;,</span>
973
+ <span class="sd"> &quot;LD_LIBRARY_PATH&quot;: &quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/lib64:/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/python/libs/linux64/python.linux64.framework/lib64:/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/embree.module/libs/linux64&quot;,</span>
974
+ <span class="sd"> &quot;PYTHONPATH&quot;: &quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/python/libs/linux64/python.linux64.framework/lib64/python2.7/lib-dynload&quot;,</span>
975
+ <span class="sd"> }</span>
976
+
977
+ <span class="sd"> &gt;&gt;&gt; extra_env = [</span>
978
+ <span class="sd"> {&quot;name&quot;:&quot;PATH&quot;, &quot;value&quot;: &quot;/my/custom/scripts&quot;, &quot;merge_policy&quot;:&quot;append&quot;},</span>
979
+ <span class="sd"> {&quot;name&quot;:&quot;DEBUG_MODE&quot;, &quot;value&quot;: &quot;1&quot;, &quot;merge_policy&quot;:&quot;exclusive&quot;}</span>
980
+ <span class="sd"> ]</span>
981
+ <span class="sd"> &gt;&gt;&gt; pe.extend(extra_env)</span>
982
+ <span class="sd"> &gt;&gt;&gt; print(dict(pe))</span>
983
+ <span class="sd"> {</span>
984
+ <span class="sd"> &quot;PATH&quot;: &quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin:/my/custom/scripts&quot;,</span>
985
+ <span class="sd"> &quot;g_licenseServerRLM&quot;: &quot;conductor-rlm:6112&quot;,</span>
986
+ <span class="sd"> &quot;LD_LIBRARY_PATH&quot;: &quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/lib64:/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/python/libs/linux64/python.linux64.framework/lib64:/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/embree.module/libs/linux64&quot;,</span>
987
+ <span class="sd"> &quot;PYTHONPATH&quot;: &quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/python/libs/linux64/python.linux64.framework/lib64/python2.7/lib-dynload&quot;,</span>
988
+ <span class="sd"> &quot;DEBUG_MODE&quot;: &quot;1&quot;,</span>
989
+ <span class="sd"> }</span>
990
+ <span class="sd"> &quot;&quot;&quot;</span>
991
+
992
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">env_list</span><span class="p">:</span>
993
+ <span class="k">return</span>
994
+
995
+ <span class="k">try</span><span class="p">:</span>
996
+ <span class="n">others</span> <span class="o">=</span> <span class="n">env_list</span><span class="p">[</span><span class="s2">&quot;environment&quot;</span><span class="p">]</span>
997
+ <span class="n">requested_platform</span> <span class="o">=</span> <span class="n">env_list</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;platform&quot;</span><span class="p">)</span>
998
+ <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
999
+ <span class="n">others</span> <span class="o">=</span> <span class="n">env_list</span>
1000
+ <span class="n">requested_platform</span> <span class="o">=</span> <span class="n">platform</span>
1001
+
1002
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">platform</span><span class="p">:</span>
1003
+ <span class="bp">self</span><span class="o">.</span><span class="n">platform</span> <span class="o">=</span> <span class="n">requested_platform</span> <span class="ow">or</span> <span class="s2">&quot;linux&quot;</span>
1004
+ <span class="k">elif</span> <span class="n">requested_platform</span> <span class="ow">and</span> <span class="n">requested_platform</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">platform</span><span class="p">:</span>
1005
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Can&#39;t change platform once initialized.&quot;</span><span class="p">)</span>
1006
+
1007
+ <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">others</span><span class="p">:</span>
1008
+ <span class="n">name</span> <span class="o">=</span> <span class="n">var</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
1009
+ <span class="n">value</span> <span class="o">=</span> <span class="n">var</span><span class="p">[</span><span class="s2">&quot;value&quot;</span><span class="p">]</span>
1010
+ <span class="n">policy</span> <span class="o">=</span> <span class="n">var</span><span class="p">[</span><span class="s2">&quot;merge_policy&quot;</span><span class="p">]</span>
1011
+ <span class="k">if</span> <span class="n">policy</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;append&quot;</span><span class="p">,</span> <span class="s2">&quot;prepend&quot;</span><span class="p">,</span> <span class="s2">&quot;exclusive&quot;</span><span class="p">]:</span>
1012
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unexpected merge policy: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">policy</span><span class="p">)</span>
1013
+
1014
+ <span class="k">if</span> <span class="n">policy</span> <span class="o">==</span> <span class="s2">&quot;append&quot;</span><span class="p">:</span>
1015
+ <span class="bp">self</span><span class="o">.</span><span class="n">_append</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
1016
+ <span class="k">elif</span> <span class="n">policy</span> <span class="o">==</span> <span class="s2">&quot;prepend&quot;</span><span class="p">:</span>
1017
+ <span class="bp">self</span><span class="o">.</span><span class="n">_prepend</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
1018
+ <span class="k">else</span><span class="p">:</span>
1019
+ <span class="bp">self</span><span class="o">.</span><span class="n">_set</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
1020
+
1021
+
1022
+ <span class="k">def</span><span class="w"> </span><span class="nf">_set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
1023
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Set the value of an exclusive variable.</span>
1024
+
1025
+ <span class="sd"> Can be overwritten by subsequent adds.</span>
1026
+
1027
+ <span class="sd"> It is an error if the variable has already been declared with policy=append.</span>
1028
+ <span class="sd"> &quot;&quot;&quot;</span>
1029
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="p">[</span><span class="n">name</span><span class="p">],</span> <span class="nb">list</span><span class="p">):</span>
1030
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
1031
+ <span class="s2">&quot;Can&#39;t change merge policy for &#39;</span><span class="si">{}</span><span class="s2">&#39; from &#39;append&#39; to &#39;exclusive&#39;.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
1032
+ <span class="p">)</span>
1033
+ <span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
1034
+
1035
+ <span class="k">def</span><span class="w"> </span><span class="nf">_append</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
1036
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Set the value of an append variable.</span>
1037
+
1038
+ <span class="sd"> Can be appended to with subsequent adds.</span>
1039
+
1040
+ <span class="sd"> It is an error if the variable has already been declared with policy=exclusive.</span>
1041
+ <span class="sd"> &quot;&quot;&quot;</span>
1042
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
1043
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="p">[</span><span class="n">name</span><span class="p">],</span> <span class="nb">list</span><span class="p">):</span>
1044
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
1045
+ <span class="s2">&quot;Can&#39;t change merge policy for &#39;</span><span class="si">{}</span><span class="s2">&#39; from &#39;exclusive&#39; to &#39;append&#39;.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
1046
+ <span class="p">)</span>
1047
+ <span class="k">else</span><span class="p">:</span>
1048
+ <span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
1049
+ <span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
1050
+
1051
+ <span class="k">def</span><span class="w"> </span><span class="nf">_prepend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
1052
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Set the value of an append/prepend variable.</span>
1053
+
1054
+ <span class="sd"> Can be appended to with subsequent adds.</span>
1055
+
1056
+ <span class="sd"> It is an error if the variable has already been declared with policy=exclusive.</span>
1057
+ <span class="sd"> &quot;&quot;&quot;</span>
1058
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
1059
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="p">[</span><span class="n">name</span><span class="p">],</span> <span class="nb">list</span><span class="p">):</span>
1060
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
1061
+ <span class="s2">&quot;Can&#39;t change merge policy for &#39;</span><span class="si">{}</span><span class="s2">&#39; from &#39;exclusive&#39; to &#39;prepend&#39;.&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
1062
+ <span class="p">)</span>
1063
+ <span class="k">else</span><span class="p">:</span>
1064
+ <span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
1065
+ <span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
1066
+
1067
+ <span class="k">def</span><span class="w"> </span><span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1068
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Cast the object as a dict.&quot;&quot;&quot;</span>
1069
+ <span class="n">sep</span> <span class="o">=</span> <span class="s2">&quot;;&quot;</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">platform</span> <span class="o">==</span> <span class="s2">&quot;windows&quot;</span> <span class="k">else</span> <span class="s2">&quot;:&quot;</span>
1070
+ <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="p">:</span>
1071
+ <span class="n">var</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
1072
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">var</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
1073
+ <span class="k">yield</span> <span class="n">key</span><span class="p">,</span> <span class="n">sep</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>
1074
+ <span class="k">else</span><span class="p">:</span>
1075
+ <span class="k">yield</span> <span class="n">key</span><span class="p">,</span> <span class="n">var</span>
1076
+
1077
+ <span class="k">def</span><span class="w"> </span><span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
1078
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Allow access by key.&quot;&quot;&quot;</span>
1079
+ <span class="n">sep</span> <span class="o">=</span> <span class="s2">&quot;;&quot;</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">platform</span> <span class="o">==</span> <span class="s2">&quot;windows&quot;</span> <span class="k">else</span> <span class="s2">&quot;:&quot;</span>
1080
+ <span class="n">var</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
1081
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">var</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
1082
+ <span class="k">return</span> <span class="n">sep</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>
1083
+ <span class="k">return</span> <span class="n">var</span>
1084
+ </code></pre></div>
1085
+ </details>
1086
+
1087
+
1088
+
1089
+ <div class="doc doc-children">
1090
+
1091
+
1092
+
1093
+
1094
+
1095
+
1096
+
1097
+
1098
+
1099
+ <div class="doc doc-object doc-method">
1100
+
1101
+
1102
+
1103
+ <h3 id="ciocore.package_environment.PackageEnvironment.__init__" class="doc doc-heading">
1104
+ <code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">env_list</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">platform</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
1105
+
1106
+ <span class="doc doc-properties">
1107
+ <small class="doc doc-property doc-property-special"><code>special</code></small>
1108
+ </span>
1109
+
1110
+ </h3>
1111
+
1112
+ <div class="doc doc-contents ">
1113
+
1114
+ <p>Encapsulate a list of environment variables.</p>
1115
+ <p>Typically, one would initialize a PackageEnvironment with a package, and then modify by adding more packages or lists of variables. Extra variables can be added by the customer, or programmatically such as during asset scraping.</p>
1116
+
1117
+ <p><strong>Parameters:</strong></p>
1118
+ <table>
1119
+ <thead>
1120
+ <tr>
1121
+ <th>Name</th>
1122
+ <th>Type</th>
1123
+ <th>Description</th>
1124
+ <th>Default</th>
1125
+ </tr>
1126
+ </thead>
1127
+ <tbody>
1128
+ <tr>
1129
+ <td><code>env_list</code></td>
1130
+ <td><code>object|list</code></td>
1131
+ <td><p>An object that provides a list of dictionaries with properties: <code>name</code>, <code>value</code>, and <code>merge_policy</code>.</p></td>
1132
+ <td><code>None</code></td>
1133
+ </tr>
1134
+ <tr>
1135
+ <td><code>platform</code></td>
1136
+ <td><code>str</code></td>
1137
+ <td><p>If the env_list is a regular list, then this is required.</p></td>
1138
+ <td><code>None</code></td>
1139
+ </tr>
1140
+ </tbody>
1141
+ </table> <p>Args are delegated to <a href="/package_environment/#ciocore.package_environment.PackageEnvironment.extend">extend()</a>.</p>
1142
+
1143
+ <details class="quote">
1144
+ <summary>Source code in <code>ciocore/package_environment.py</code></summary>
1145
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">env_list</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">platform</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
1146
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
1147
+ <span class="sd"> Encapsulate a list of environment variables.</span>
1148
+
1149
+ <span class="sd"> Typically, one would initialize a PackageEnvironment with a package, and then modify by adding more packages or lists of variables. Extra variables can be added by the customer, or programmatically such as during asset scraping.</span>
1150
+
1151
+ <span class="sd"> Args:</span>
1152
+ <span class="sd"> env_list (object|list): An object that provides a list of dictionaries with properties: `name`, `value`, and `merge_policy`.</span>
1153
+ <span class="sd"> platform (str): If the env_list is a regular list, then this is required.</span>
1154
+
1155
+ <span class="sd"> Args are delegated to [extend()](/package_environment/#ciocore.package_environment.PackageEnvironment.extend).</span>
1156
+ <span class="sd"> &quot;&quot;&quot;</span>
1157
+ <span class="bp">self</span><span class="o">.</span><span class="n">platform</span> <span class="o">=</span> <span class="kc">None</span>
1158
+ <span class="bp">self</span><span class="o">.</span><span class="n">_env</span> <span class="o">=</span> <span class="p">{}</span>
1159
+
1160
+ <span class="bp">self</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">env_list</span><span class="p">,</span> <span class="n">platform</span><span class="p">)</span>
1161
+ </code></pre></div>
1162
+ </details>
1163
+ </div>
1164
+
1165
+ </div>
1166
+
1167
+
1168
+
1169
+ <div class="doc doc-object doc-method">
1170
+
1171
+
1172
+
1173
+ <h3 id="ciocore.package_environment.PackageEnvironment.extend" class="doc doc-heading">
1174
+ <code class="highlight language-python"><span class="n">extend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">env_list</span><span class="p">,</span> <span class="n">platform</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
1175
+
1176
+
1177
+ </h3>
1178
+
1179
+ <div class="doc doc-contents ">
1180
+
1181
+ <p>Extend the Package environment with the given variable specifications.</p>
1182
+
1183
+ <p><strong>Parameters:</strong></p>
1184
+ <table>
1185
+ <thead>
1186
+ <tr>
1187
+ <th>Name</th>
1188
+ <th>Type</th>
1189
+ <th>Description</th>
1190
+ <th>Default</th>
1191
+ </tr>
1192
+ </thead>
1193
+ <tbody>
1194
+ <tr>
1195
+ <td><code>env_list</code></td>
1196
+ <td><code>object|list</code></td>
1197
+ <td><ul>
1198
+ <li>A list of dictionaries with properties: <code>name</code>, <code>value</code>, and <code>merge_policy</code>.</li>
1199
+ <li>An object with an <code>environment</code> key that contains a list of the dictionaries described above. The latter is the structure of a package. Therefore we can initialize or extend a PackageEnvironment with a package.</li>
1200
+ </ul></td>
1201
+ <td><em>required</em></td>
1202
+ </tr>
1203
+ <tr>
1204
+ <td><code>platform</code></td>
1205
+ <td><code>str</code></td>
1206
+ <td><p>Defaults to <code>None</code>. If env_list is a package, then the platform is taken from the package and the <code>platform</code> keyword is ignored. If env_list is a list, then if this is the first add, a platform should be specified, otherwise it will default to linux.</p></td>
1207
+ <td><code>None</code></td>
1208
+ </tr>
1209
+ </tbody>
1210
+ </table> <p>The first time data is added to a PackageEnvironment, the platform is set in stone. Subsequent <code>adds</code> that try to change the platform are considered an error.</p>
1211
+ <p>Each variable to be added specifies a merge_policy: <code>append</code>, <code>prepend</code>, or <code>exclusive</code> <code>append</code> and <code>prepend</code> can be thought of as lists= types. Once an individual variable has been initialized as a list, it can't be changed to <code>exclusive</code>. This means:</p>
1212
+ <ol>
1213
+ <li>It's not possible to overwrite variables that have been added as <code>append</code> or <code>prepend</code>.</li>
1214
+ <li>Exclusive variables are always overwritten by subsequent adds.</li>
1215
+ </ol>
1216
+
1217
+ <p><strong>Exceptions:</strong></p>
1218
+ <table>
1219
+ <thead>
1220
+ <tr>
1221
+ <th>Type</th>
1222
+ <th>Description</th>
1223
+ </tr>
1224
+ </thead>
1225
+ <tbody>
1226
+ <tr>
1227
+ <td><code>ValueError</code></td>
1228
+ <td><p>Either an attempt to change the platform once initialized, or an invalid merge policy.</p></td>
1229
+ </tr>
1230
+ </tbody>
1231
+ </table>
1232
+ <p><strong>Examples:</strong></p>
1233
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span><span class="w"> </span><span class="nn">ciocore</span><span class="w"> </span><span class="kn">import</span> <span class="n">api_client</span><span class="p">,</span> <span class="n">package_tree</span><span class="p">,</span> <span class="n">package_environment</span>
1234
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">packages</span> <span class="o">=</span> <span class="n">api_client</span><span class="o">.</span><span class="n">request_software_packages</span><span class="p">()</span>
1235
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">pt</span> <span class="o">=</span> <span class="n">package_tree</span><span class="o">.</span><span class="n">PackageTree</span><span class="p">(</span><span class="n">packages</span><span class="p">,</span> <span class="n">product</span><span class="o">=</span><span class="s2">&quot;cinema4d&quot;</span><span class="p">)</span>
1236
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">one_dcc_name</span> <span class="o">=</span> <span class="n">pt</span><span class="o">.</span><span class="n">supported_host_names</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
1237
+ <span class="n">cinema4d</span> <span class="mf">21.209</span><span class="o">.</span><span class="n">RB305619</span> <span class="n">linux</span>
1238
+ </code></pre></div>
1239
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="n">pkg</span> <span class="o">=</span> <span class="n">pt</span><span class="o">.</span><span class="n">find_by_name</span><span class="p">(</span><span class="n">one_dcc_name</span><span class="p">)</span>
1240
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">pe</span> <span class="o">=</span> <span class="n">package_environment</span><span class="o">.</span><span class="n">PackageEnvironment</span><span class="p">(</span><span class="n">pkg</span><span class="p">)</span>
1241
+ <span class="o">&gt;&gt;&gt;</span> <span class="nb">print</span><span class="p">(</span><span class="nb">dict</span><span class="p">(</span><span class="n">pe</span><span class="p">))</span>
1242
+ <span class="p">{</span>
1243
+ <span class="s2">&quot;PATH&quot;</span><span class="p">:</span> <span class="s2">&quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin&quot;</span><span class="p">,</span>
1244
+ <span class="s2">&quot;g_licenseServerRLM&quot;</span><span class="p">:</span> <span class="s2">&quot;conductor-rlm:6112&quot;</span><span class="p">,</span>
1245
+ <span class="s2">&quot;LD_LIBRARY_PATH&quot;</span><span class="p">:</span> <span class="s2">&quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/lib64:/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/python/libs/linux64/python.linux64.framework/lib64:/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/embree.module/libs/linux64&quot;</span><span class="p">,</span>
1246
+ <span class="s2">&quot;PYTHONPATH&quot;</span><span class="p">:</span> <span class="s2">&quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/python/libs/linux64/python.linux64.framework/lib64/python2.7/lib-dynload&quot;</span><span class="p">,</span>
1247
+ <span class="p">}</span>
1248
+ </code></pre></div>
1249
+ <div class="highlight"><pre><span></span><code><span class="o">&gt;&gt;&gt;</span> <span class="n">extra_env</span> <span class="o">=</span> <span class="p">[</span>
1250
+ <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;PATH&quot;</span><span class="p">,</span> <span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="s2">&quot;/my/custom/scripts&quot;</span><span class="p">,</span> <span class="s2">&quot;merge_policy&quot;</span><span class="p">:</span><span class="s2">&quot;append&quot;</span><span class="p">},</span>
1251
+ <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span><span class="s2">&quot;DEBUG_MODE&quot;</span><span class="p">,</span> <span class="s2">&quot;value&quot;</span><span class="p">:</span> <span class="s2">&quot;1&quot;</span><span class="p">,</span> <span class="s2">&quot;merge_policy&quot;</span><span class="p">:</span><span class="s2">&quot;exclusive&quot;</span><span class="p">}</span>
1252
+ <span class="p">]</span>
1253
+ <span class="o">&gt;&gt;&gt;</span> <span class="n">pe</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">extra_env</span><span class="p">)</span>
1254
+ <span class="o">&gt;&gt;&gt;</span> <span class="nb">print</span><span class="p">(</span><span class="nb">dict</span><span class="p">(</span><span class="n">pe</span><span class="p">))</span>
1255
+ <span class="p">{</span>
1256
+ <span class="s2">&quot;PATH&quot;</span><span class="p">:</span> <span class="s2">&quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin:/my/custom/scripts&quot;</span><span class="p">,</span>
1257
+ <span class="s2">&quot;g_licenseServerRLM&quot;</span><span class="p">:</span> <span class="s2">&quot;conductor-rlm:6112&quot;</span><span class="p">,</span>
1258
+ <span class="s2">&quot;LD_LIBRARY_PATH&quot;</span><span class="p">:</span> <span class="s2">&quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/lib64:/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/python/libs/linux64/python.linux64.framework/lib64:/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/embree.module/libs/linux64&quot;</span><span class="p">,</span>
1259
+ <span class="s2">&quot;PYTHONPATH&quot;</span><span class="p">:</span> <span class="s2">&quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/python/libs/linux64/python.linux64.framework/lib64/python2.7/lib-dynload&quot;</span><span class="p">,</span>
1260
+ <span class="s2">&quot;DEBUG_MODE&quot;</span><span class="p">:</span> <span class="s2">&quot;1&quot;</span><span class="p">,</span>
1261
+ <span class="p">}</span>
1262
+ </code></pre></div>
1263
+
1264
+ <details class="quote">
1265
+ <summary>Source code in <code>ciocore/package_environment.py</code></summary>
1266
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">extend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">env_list</span><span class="p">,</span> <span class="n">platform</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
1267
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
1268
+ <span class="sd"> Extend the Package environment with the given variable specifications.</span>
1269
+
1270
+ <span class="sd"> Args:</span>
1271
+ <span class="sd"> env_list (object|list): Either:</span>
1272
+ <span class="sd"> * A list of dictionaries with properties: `name`, `value`, and `merge_policy`.</span>
1273
+ <span class="sd"> * An object with an `environment` key that contains a list of the dictionaries described above. The latter is the structure of a package. Therefore we can initialize or extend a PackageEnvironment with a package.</span>
1274
+ <span class="sd"> platform (str): Defaults to `None`. If env_list is a package, then the platform is taken from the package and the `platform` keyword is ignored. If env_list is a list, then if this is the first add, a platform should be specified, otherwise it will default to linux.</span>
1275
+
1276
+ <span class="sd"> The first time data is added to a PackageEnvironment, the platform is set in stone. Subsequent `adds` that try to change the platform are considered an error.</span>
1277
+
1278
+ <span class="sd"> Each variable to be added specifies a merge_policy: `append`, `prepend`, or `exclusive` `append` and `prepend` can be thought of as lists= types. Once an individual variable has been initialized as a list, it can&#39;t be changed to `exclusive`. This means:</span>
1279
+
1280
+ <span class="sd"> 1. It&#39;s not possible to overwrite variables that have been added as `append` or `prepend`.</span>
1281
+ <span class="sd"> 2. Exclusive variables are always overwritten by subsequent adds.</span>
1282
+
1283
+ <span class="sd"> Raises:</span>
1284
+ <span class="sd"> ValueError: Either an attempt to change the platform once initialized, or an invalid merge policy.</span>
1285
+
1286
+
1287
+ <span class="sd"> Example:</span>
1288
+ <span class="sd"> &gt;&gt;&gt; from ciocore import api_client, package_tree, package_environment</span>
1289
+ <span class="sd"> &gt;&gt;&gt; packages = api_client.request_software_packages()</span>
1290
+ <span class="sd"> &gt;&gt;&gt; pt = package_tree.PackageTree(packages, product=&quot;cinema4d&quot;)</span>
1291
+ <span class="sd"> &gt;&gt;&gt; one_dcc_name = pt.supported_host_names()[0]</span>
1292
+ <span class="sd"> cinema4d 21.209.RB305619 linux</span>
1293
+
1294
+ <span class="sd"> &gt;&gt;&gt; pkg = pt.find_by_name(one_dcc_name)</span>
1295
+ <span class="sd"> &gt;&gt;&gt; pe = package_environment.PackageEnvironment(pkg)</span>
1296
+ <span class="sd"> &gt;&gt;&gt; print(dict(pe))</span>
1297
+ <span class="sd"> {</span>
1298
+ <span class="sd"> &quot;PATH&quot;: &quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin&quot;,</span>
1299
+ <span class="sd"> &quot;g_licenseServerRLM&quot;: &quot;conductor-rlm:6112&quot;,</span>
1300
+ <span class="sd"> &quot;LD_LIBRARY_PATH&quot;: &quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/lib64:/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/python/libs/linux64/python.linux64.framework/lib64:/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/embree.module/libs/linux64&quot;,</span>
1301
+ <span class="sd"> &quot;PYTHONPATH&quot;: &quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/python/libs/linux64/python.linux64.framework/lib64/python2.7/lib-dynload&quot;,</span>
1302
+ <span class="sd"> }</span>
1303
+
1304
+ <span class="sd"> &gt;&gt;&gt; extra_env = [</span>
1305
+ <span class="sd"> {&quot;name&quot;:&quot;PATH&quot;, &quot;value&quot;: &quot;/my/custom/scripts&quot;, &quot;merge_policy&quot;:&quot;append&quot;},</span>
1306
+ <span class="sd"> {&quot;name&quot;:&quot;DEBUG_MODE&quot;, &quot;value&quot;: &quot;1&quot;, &quot;merge_policy&quot;:&quot;exclusive&quot;}</span>
1307
+ <span class="sd"> ]</span>
1308
+ <span class="sd"> &gt;&gt;&gt; pe.extend(extra_env)</span>
1309
+ <span class="sd"> &gt;&gt;&gt; print(dict(pe))</span>
1310
+ <span class="sd"> {</span>
1311
+ <span class="sd"> &quot;PATH&quot;: &quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin:/my/custom/scripts&quot;,</span>
1312
+ <span class="sd"> &quot;g_licenseServerRLM&quot;: &quot;conductor-rlm:6112&quot;,</span>
1313
+ <span class="sd"> &quot;LD_LIBRARY_PATH&quot;: &quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/lib64:/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/python/libs/linux64/python.linux64.framework/lib64:/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/embree.module/libs/linux64&quot;,</span>
1314
+ <span class="sd"> &quot;PYTHONPATH&quot;: &quot;/opt/maxon/cinema4d/21/cinema4d21.209vRB305619/bin/resource/modules/python/libs/linux64/python.linux64.framework/lib64/python2.7/lib-dynload&quot;,</span>
1315
+ <span class="sd"> &quot;DEBUG_MODE&quot;: &quot;1&quot;,</span>
1316
+ <span class="sd"> }</span>
1317
+ <span class="sd"> &quot;&quot;&quot;</span>
1318
+
1319
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">env_list</span><span class="p">:</span>
1320
+ <span class="k">return</span>
1321
+
1322
+ <span class="k">try</span><span class="p">:</span>
1323
+ <span class="n">others</span> <span class="o">=</span> <span class="n">env_list</span><span class="p">[</span><span class="s2">&quot;environment&quot;</span><span class="p">]</span>
1324
+ <span class="n">requested_platform</span> <span class="o">=</span> <span class="n">env_list</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;platform&quot;</span><span class="p">)</span>
1325
+ <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
1326
+ <span class="n">others</span> <span class="o">=</span> <span class="n">env_list</span>
1327
+ <span class="n">requested_platform</span> <span class="o">=</span> <span class="n">platform</span>
1328
+
1329
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">platform</span><span class="p">:</span>
1330
+ <span class="bp">self</span><span class="o">.</span><span class="n">platform</span> <span class="o">=</span> <span class="n">requested_platform</span> <span class="ow">or</span> <span class="s2">&quot;linux&quot;</span>
1331
+ <span class="k">elif</span> <span class="n">requested_platform</span> <span class="ow">and</span> <span class="n">requested_platform</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">platform</span><span class="p">:</span>
1332
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Can&#39;t change platform once initialized.&quot;</span><span class="p">)</span>
1333
+
1334
+ <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">others</span><span class="p">:</span>
1335
+ <span class="n">name</span> <span class="o">=</span> <span class="n">var</span><span class="p">[</span><span class="s2">&quot;name&quot;</span><span class="p">]</span>
1336
+ <span class="n">value</span> <span class="o">=</span> <span class="n">var</span><span class="p">[</span><span class="s2">&quot;value&quot;</span><span class="p">]</span>
1337
+ <span class="n">policy</span> <span class="o">=</span> <span class="n">var</span><span class="p">[</span><span class="s2">&quot;merge_policy&quot;</span><span class="p">]</span>
1338
+ <span class="k">if</span> <span class="n">policy</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;append&quot;</span><span class="p">,</span> <span class="s2">&quot;prepend&quot;</span><span class="p">,</span> <span class="s2">&quot;exclusive&quot;</span><span class="p">]:</span>
1339
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unexpected merge policy: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">policy</span><span class="p">)</span>
1340
+
1341
+ <span class="k">if</span> <span class="n">policy</span> <span class="o">==</span> <span class="s2">&quot;append&quot;</span><span class="p">:</span>
1342
+ <span class="bp">self</span><span class="o">.</span><span class="n">_append</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
1343
+ <span class="k">elif</span> <span class="n">policy</span> <span class="o">==</span> <span class="s2">&quot;prepend&quot;</span><span class="p">:</span>
1344
+ <span class="bp">self</span><span class="o">.</span><span class="n">_prepend</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
1345
+ <span class="k">else</span><span class="p">:</span>
1346
+ <span class="bp">self</span><span class="o">.</span><span class="n">_set</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
1347
+ </code></pre></div>
1348
+ </details>
1349
+ </div>
1350
+
1351
+ </div>
1352
+
1353
+
1354
+
1355
+ <div class="doc doc-object doc-method">
1356
+
1357
+
1358
+
1359
+ <h3 id="ciocore.package_environment.PackageEnvironment.__iter__" class="doc doc-heading">
1360
+ <code class="highlight language-python"><span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></code>
1361
+
1362
+ <span class="doc doc-properties">
1363
+ <small class="doc doc-property doc-property-special"><code>special</code></small>
1364
+ </span>
1365
+
1366
+ </h3>
1367
+
1368
+ <div class="doc doc-contents ">
1369
+
1370
+ <p>Cast the object as a dict.</p>
1371
+
1372
+ <details class="quote">
1373
+ <summary>Source code in <code>ciocore/package_environment.py</code></summary>
1374
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
1375
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Cast the object as a dict.&quot;&quot;&quot;</span>
1376
+ <span class="n">sep</span> <span class="o">=</span> <span class="s2">&quot;;&quot;</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">platform</span> <span class="o">==</span> <span class="s2">&quot;windows&quot;</span> <span class="k">else</span> <span class="s2">&quot;:&quot;</span>
1377
+ <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="p">:</span>
1378
+ <span class="n">var</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
1379
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">var</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
1380
+ <span class="k">yield</span> <span class="n">key</span><span class="p">,</span> <span class="n">sep</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>
1381
+ <span class="k">else</span><span class="p">:</span>
1382
+ <span class="k">yield</span> <span class="n">key</span><span class="p">,</span> <span class="n">var</span>
1383
+ </code></pre></div>
1384
+ </details>
1385
+ </div>
1386
+
1387
+ </div>
1388
+
1389
+
1390
+
1391
+ <div class="doc doc-object doc-method">
1392
+
1393
+
1394
+
1395
+ <h3 id="ciocore.package_environment.PackageEnvironment.__getitem__" class="doc doc-heading">
1396
+ <code class="highlight language-python"><span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span></code>
1397
+
1398
+ <span class="doc doc-properties">
1399
+ <small class="doc doc-property doc-property-special"><code>special</code></small>
1400
+ </span>
1401
+
1402
+ </h3>
1403
+
1404
+ <div class="doc doc-contents ">
1405
+
1406
+ <p>Allow access by key.</p>
1407
+
1408
+ <details class="quote">
1409
+ <summary>Source code in <code>ciocore/package_environment.py</code></summary>
1410
+ <div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
1411
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Allow access by key.&quot;&quot;&quot;</span>
1412
+ <span class="n">sep</span> <span class="o">=</span> <span class="s2">&quot;;&quot;</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">platform</span> <span class="o">==</span> <span class="s2">&quot;windows&quot;</span> <span class="k">else</span> <span class="s2">&quot;:&quot;</span>
1413
+ <span class="n">var</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_env</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
1414
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">var</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
1415
+ <span class="k">return</span> <span class="n">sep</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>
1416
+ <span class="k">return</span> <span class="n">var</span>
1417
+ </code></pre></div>
1418
+ </details>
1419
+ </div>
1420
+
1421
+ </div>
1422
+
1423
+
1424
+
1425
+
1426
+
1427
+ </div>
1428
+
1429
+ </div>
1430
+
1431
+ </div>
1432
+
1433
+
1434
+
1435
+
1436
+
1437
+
1438
+
1439
+ </div>
1440
+
1441
+ </div>
1442
+
1443
+ </div>
1444
+
1445
+
1446
+
1447
+
1448
+
1449
+
1450
+
1451
+
1452
+
1453
+
1454
+
1455
+
1456
+
1457
+ </article>
1458
+ </div>
1459
+
1460
+
1461
+ <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1462
+ </div>
1463
+
1464
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
1465
+
1466
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
1467
+ Back to top
1468
+ </button>
1469
+
1470
+ </main>
1471
+
1472
+ <footer class="md-footer">
1473
+
1474
+ <div class="md-footer-meta md-typeset">
1475
+ <div class="md-footer-meta__inner md-grid">
1476
+ <div class="md-copyright">
1477
+
1478
+ <div class="md-copyright__highlight">
1479
+ Copyright &copy; 2023, CoreWeave.
1480
+ </div>
1481
+
1482
+
1483
+ Made with
1484
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1485
+ Material for MkDocs
1486
+ </a>
1487
+
1488
+ </div>
1489
+
1490
+ </div>
1491
+ </div>
1492
+ </footer>
1493
+
1494
+ </div>
1495
+ <div class="md-dialog" data-md-component="dialog">
1496
+ <div class="md-dialog__inner md-typeset"></div>
1497
+ </div>
1498
+
1499
+
1500
+ <script id="__config" type="application/json">{"base": "../..", "features": ["navigation.expand", "navigation.instant", "navigation.tabs", "navigation.tabs.sticky", "navigation.tracking", "navigation.top"], "search": "../../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
1501
+
1502
+
1503
+ <script src="../../assets/javascripts/bundle.471ce7a9.min.js"></script>
1504
+
1505
+
1506
+ </body>
1507
+ </html>