carbonarc 1.0.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.
carbonarc/explorer.py ADDED
@@ -0,0 +1,223 @@
1
+ import pandas as pd
2
+ from typing import Optional, Literal, Union, List, Dict, Any
3
+
4
+ from carbonarc.base.utils import timeseries_response_to_pandas
5
+ from carbonarc.base.client import BaseAPIClient
6
+ from carbonarc.base.exceptions import InvalidConfigurationError
7
+
8
+
9
+ class ExplorerAPIClient(BaseAPIClient):
10
+ """Client for interacting with the Carbon Arc Builder API."""
11
+
12
+ def __init__(
13
+ self,
14
+ token: str,
15
+ host: str = "https://platform.carbonarc.co",
16
+ version: str = "v2"
17
+ ):
18
+ """
19
+ Initialize BuilderAPIClient.
20
+
21
+ Args:
22
+ token: Authentication token for requests.
23
+ host: Base URL of the Carbon Arc API.
24
+ version: API version to use.
25
+ """
26
+ super().__init__(token=token, host=host, version=version)
27
+ self.base_framework_url = self._build_base_url("framework")
28
+
29
+ @staticmethod
30
+ def build_framework(
31
+ entities: List[Dict],
32
+ insight: int,
33
+ filters: Dict[str, Any],
34
+ aggregate: Optional[Literal["sum", "mean"]] = None
35
+ ) -> dict:
36
+ """
37
+ Build a framework payload for the API.
38
+
39
+ Args:
40
+ entities: List of entity dicts (with "carc_id" and "representation").
41
+ insight: Insight ID.
42
+ filters: Filters to apply.
43
+ aggregate: Aggregation method ("sum" or "mean").
44
+
45
+ Returns:
46
+ Framework dictionary.
47
+ """
48
+ return {
49
+ "entities": entities,
50
+ "insight": {"insight_id": insight},
51
+ "filters": filters,
52
+ "aggregate": aggregate
53
+ }
54
+
55
+ @staticmethod
56
+ def _validate_framework(framework: dict):
57
+ """
58
+ Validate a framework dictionary for required structure.
59
+
60
+ Args:
61
+ framework: Framework dictionary.
62
+
63
+ Raises:
64
+ InvalidConfigurationError: If the framework is invalid.
65
+ """
66
+ if not isinstance(framework, dict):
67
+ raise InvalidConfigurationError("Framework must be a dictionary. Use build_framework().")
68
+ if "entities" not in framework:
69
+ raise InvalidConfigurationError("Framework must have an 'entities' key.")
70
+ if not isinstance(framework["entities"], list):
71
+ raise InvalidConfigurationError("Entities must be a list.")
72
+ if not all(isinstance(entity, dict) for entity in framework["entities"]):
73
+ raise InvalidConfigurationError("Each entity must be a dictionary.")
74
+ for entity in framework["entities"]:
75
+ if "carc_id" not in entity:
76
+ raise InvalidConfigurationError("Each entity must have a 'carc_id' key.")
77
+ if "representation" not in entity:
78
+ raise InvalidConfigurationError("Each entity must have a 'representation' key.")
79
+ if not isinstance(framework["insight"], dict):
80
+ raise InvalidConfigurationError("Insight must be a dictionary.")
81
+ if "insight_id" not in framework["insight"]:
82
+ raise InvalidConfigurationError("Insight must have an 'insight_id' key.")
83
+
84
+ def collect_framework_filters(self, framework: dict) -> dict:
85
+ """
86
+ Retrieve available filters for a framework.
87
+
88
+ Args:
89
+ framework: Framework dictionary.
90
+
91
+ Returns:
92
+ Dictionary of available filters.
93
+ """
94
+ self._validate_framework(framework)
95
+ url = f"{self.base_framework_url}/filters"
96
+ return self._post(url, json=framework)
97
+
98
+ def collect_framework_filter_options(self, framework: dict, filter_key: str) -> dict:
99
+ """
100
+ Retrieve options for a specific filter in a framework.
101
+
102
+ Args:
103
+ framework: Framework dictionary.
104
+ filter_key: Filter key to retrieve options for.
105
+
106
+ Returns:
107
+ Dictionary of filter options.
108
+ """
109
+ self._validate_framework(framework)
110
+ url = f"{self.base_framework_url}/filters/{filter_key}/options"
111
+ return self._post(url, json=framework)
112
+
113
+
114
+ def collect_framework_information(self, framework: dict) -> dict:
115
+ """
116
+ Retrieve metadata for a framework.
117
+
118
+ Args:
119
+ framework: Framework dictionary.
120
+
121
+ Returns:
122
+ Dictionary of framework metadata.
123
+ """
124
+ self._validate_framework(framework)
125
+ url = f"{self.base_framework_url}/information"
126
+ return self._post(url, json=framework)
127
+
128
+ def buy_frameworks(self, order: List[dict]) -> dict:
129
+ """
130
+ Purchase one or more frameworks.
131
+
132
+ Args:
133
+ order: List of framework dictionaries to purchase.
134
+
135
+ Returns:
136
+ Dictionary with purchase information.
137
+ """
138
+ for framework in order:
139
+ self._validate_framework(framework)
140
+ url = f"{self.base_framework_url}/buy"
141
+ return self._post(url, json=order)
142
+
143
+ def get_framework_data(
144
+ self,
145
+ framework_id: str,
146
+ page: int = 1,
147
+ page_size: int = 100,
148
+ data_type: Optional[Literal["dataframe", "timeseries"]] = None,
149
+ ) -> Union[pd.DataFrame, dict]:
150
+ """
151
+ Retrieve data for a specific framework.
152
+
153
+ Args:
154
+ framework_id: Framework ID.
155
+ page: Page number (default 1).
156
+ page_size: Number of items per page (default 100).
157
+ data_type: Data type to retrieve ("dataframe" or "timeseries").
158
+
159
+ Returns:
160
+ Data as a DataFrame, dictionary, or timeseries, depending on data_type.
161
+ """
162
+ endpoint = f"{framework_id}/data"
163
+ url = f"{self.base_framework_url}/{endpoint}?page={page}&size={page_size}"
164
+ if data_type:
165
+ url += f"&type={data_type}"
166
+ if data_type == "dataframe":
167
+ return pd.DataFrame(self._get(url).get("data", {}))
168
+ elif data_type == "timeseries":
169
+ return timeseries_response_to_pandas(response=self._get(url))
170
+ else:
171
+ return self._get(url)
172
+
173
+ def stream_framework_data(
174
+ self,
175
+ framework_id: str,
176
+ page_size: int = 100,
177
+ data_type: Optional[Literal["dataframe", "timeseries"]] = None,
178
+ ):
179
+ """
180
+ Iterate over all data for a framework, yielding each page.
181
+
182
+ Args:
183
+ framework_id: Framework ID.
184
+ page_size: Number of items per page (default 100).
185
+ data_type: Data type to yield ("dataframe" or "timeseries").
186
+
187
+ Yields:
188
+ Data for each page as a DataFrame, timeseries, or dictionary.
189
+ """
190
+ page = 1
191
+ while True:
192
+ response = self.get_framework_data(
193
+ framework_id=framework_id,
194
+ page=page,
195
+ page_size=page_size,
196
+ )
197
+ if not response:
198
+ break
199
+ total_pages = response.get("pages", 0)
200
+ if page > total_pages:
201
+ break
202
+ if data_type == "dataframe":
203
+ yield pd.DataFrame(response.get("data", {}))
204
+ elif data_type == "timeseries":
205
+ yield timeseries_response_to_pandas(response=response)
206
+ else:
207
+ yield response
208
+ page += 1
209
+
210
+ def get_framework_metadata(self, framework_id: str) -> dict:
211
+ """
212
+ Retrieve metadata for a specific framework.
213
+
214
+ Args:
215
+ framework_id: Framework ID.
216
+
217
+ Returns:
218
+ Dictionary of framework metadata.
219
+ """
220
+ endpoint = f"{framework_id}/metadata"
221
+ url = f"{self.base_framework_url}/{endpoint}"
222
+ return self._get(url)
223
+
carbonarc/hub.py ADDED
@@ -0,0 +1,45 @@
1
+ from carbonarc.base.client import BaseAPIClient
2
+
3
+ class HubAPIClient(BaseAPIClient):
4
+ """
5
+ A client for interacting with the Carbon Arc Hub API.
6
+ """
7
+
8
+ def __init__(
9
+ self,
10
+ token: str,
11
+ host: str = "https://platform.carbonarc.co",
12
+ version: str = "v2"
13
+ ):
14
+ """
15
+ Initialize HubAPIClient with an authentication token and user agent.
16
+
17
+ Args:
18
+ token: The authentication token to be used for requests.
19
+ host: The base URL of the Carbon Arc API.
20
+ version: The API version to use.
21
+ """
22
+ super().__init__(token=token, host=host, version=version)
23
+
24
+ self.base_hub_url = self._build_base_url("hub")
25
+
26
+ def get_webcontent_feeds(self) -> dict:
27
+ """
28
+ Retrieve all webcontent feeds.
29
+ """
30
+ url = f"{self.base_hub_url}/webcontent"
31
+ return self._get(url)
32
+
33
+ def get_subscribed_feeds(self) -> dict:
34
+ """
35
+ Retrieve all subscribed webcontent feeds.
36
+ """
37
+ url = f"{self.base_hub_url}/webcontent/subscribed"
38
+ return self._get(url)
39
+
40
+ def get_webcontent_data(self, webcontent_name: str, page: int = 1, size: int = 100) -> dict:
41
+ """
42
+ Retrieve a webcontent feed by name.
43
+ """
44
+ url = f"{self.base_hub_url}/webcontent/{webcontent_name}?page={page}&size={size}"
45
+ return self._get(url)
carbonarc/ontology.py ADDED
@@ -0,0 +1,238 @@
1
+ from typing import Optional, List, Literal, Dict, Any, Union
2
+
3
+ from carbonarc.base.client import BaseAPIClient
4
+
5
+ class OntologyAPIClient(BaseAPIClient):
6
+ """
7
+ A client for interacting with the Carbon Arc Ontology API.
8
+ """
9
+
10
+ def __init__(
11
+ self,
12
+ token: str,
13
+ host: str = "https://platform.carbonarc.co",
14
+ version: str = "v2"
15
+ ):
16
+ """
17
+ Initialize OntologyAPIClient with an authentication token and user agent.
18
+
19
+ Args:
20
+ token: The authentication token to be used for requests.
21
+ host: The base URL of the Carbon Arc API.
22
+ version: The API version to use.
23
+ """
24
+ super().__init__(token=token, host=host, version=version)
25
+
26
+ self.base_ontology_url = self._build_base_url("ontology")
27
+
28
+ def get_entity_map(self) -> dict:
29
+ """
30
+ Retrieve the entity map.
31
+ """
32
+ url = f"{self.base_ontology_url}/entity-map"
33
+ return self._get(url)
34
+
35
+ def get_insight_map(self) -> dict:
36
+ """
37
+ Retrieve the insight map.
38
+ """
39
+ url = f"{self.base_ontology_url}/insight-map"
40
+ return self._get(url)
41
+
42
+ def get_entities(
43
+ self,
44
+ representation: Optional[List[str]] = None,
45
+ domain: Optional[Union[str, List[str]]] = None,
46
+ entity: Optional[List[Literal["brand", "company", "people", "location"]]] = None,
47
+ subject_ids: Optional[List[int]] = None,
48
+ topic_ids: Optional[List[int]] = None,
49
+ insight_types: Optional[List[Literal["metric", "event", "kpi", "marketshare", "cohort"]]] = None,
50
+ insight_id: Optional[int] = None,
51
+ version: Optional[str] = "latest",
52
+ page: int = 1,
53
+ size: int = 100,
54
+ sort_by: str = "label",
55
+ order: str = "asc"
56
+ ) -> Dict[str, Any]:
57
+ """
58
+ Retrieve entities with filtering and pagination.
59
+
60
+ Args:
61
+ entity_representation: List of entity representations to filter by.
62
+ entity_domain: Entity domain(s) to filter by.
63
+ entity: List of entity types to filter by.
64
+ subject_ids: List of subject IDs to filter by.
65
+ topic_ids: List of topic IDs to filter by.
66
+ insight_types: List of insight types to filter by.
67
+ insight_id: Insight ID to filter by.
68
+ page: Page number (default 1).
69
+ size: Number of results per page (default 100).
70
+ sort_by: Field to sort by.
71
+ order: Sort direction ("asc" or "desc").
72
+
73
+ Returns:
74
+ Dictionary containing paginated entities.
75
+ """
76
+ params = {
77
+ "page": page,
78
+ "size": size,
79
+ "sort_by": sort_by,
80
+ "order": order
81
+ }
82
+ if subject_ids:
83
+ params["subject_ids"] = subject_ids
84
+ if topic_ids:
85
+ params["topic_ids"] = topic_ids
86
+ if insight_types:
87
+ params["insight_types"] = insight_types
88
+ if insight_id:
89
+ params["insight_id"] = insight_id
90
+ if representation:
91
+ params["entity_representation"] = representation
92
+ if domain:
93
+ params["entity_domain"] = domain
94
+ if entity:
95
+ params["entity"] = entity
96
+ if version:
97
+ params["version"] = version
98
+ url = f"{self.base_ontology_url}/entities"
99
+ return self._get(url, params=params)
100
+
101
+ def get_entity_information(self, entity_id: int, representation: str) -> dict:
102
+ """
103
+ Retrieve information for a specific entity.
104
+
105
+ Args:
106
+ entity_id: Entity ID.
107
+
108
+ Returns:
109
+ Dictionary with entity information.
110
+ """
111
+ params = {"entity_representation": representation}
112
+ url = f"{self.base_ontology_url}/entities/{entity_id}"
113
+ return self._get(url, params=params)
114
+
115
+ def get_insights(
116
+ self,
117
+ subject_ids: Optional[List[int]] = None,
118
+ topic_ids: Optional[List[int]] = None,
119
+ insight_types: Optional[List[Literal["metric", "event", "kpi", "marketshare", "cohort"]]] = None,
120
+ entity_id: Optional[int] = None,
121
+ entity_representation: Optional[str] = None,
122
+ entity_domain: Optional[Union[str, List[str]]] = None,
123
+ entity: Optional[Literal["brand", "company", "people", "location"]] = None,
124
+ page: int = 1,
125
+ size: int = 100,
126
+ sort_by: str = "insight_label",
127
+ order: str = "asc"
128
+ ) -> Dict[str, Any]:
129
+ """
130
+ Retrieve insights with filtering and pagination.
131
+
132
+ Args:
133
+ subject_ids: List of subject IDs to filter by.
134
+ topic_ids: List of topic IDs to filter by.
135
+ insight_types: List of insight types to filter by.
136
+ entity_id: Entity ID to filter by.
137
+ entity_representation: Entity representation to filter by.
138
+ entity_domain: Entity domain(s) to filter by.
139
+ entity: Entity type to filter by.
140
+ page: Page number (default 1).
141
+ size: Number of results per page (default 100).
142
+ sort_by: Field to sort by.
143
+ order: Sort direction ("asc" or "desc").
144
+
145
+ Returns:
146
+ Dictionary containing paginated insights.
147
+ """
148
+ params = {
149
+ "page": page,
150
+ "size": size,
151
+ "sort_by": sort_by,
152
+ "order": order
153
+ }
154
+ if subject_ids:
155
+ params["subject_ids"] = subject_ids
156
+ if topic_ids:
157
+ params["topic_ids"] = topic_ids
158
+ if insight_types:
159
+ params["insight_types"] = insight_types
160
+ if entity_id:
161
+ params["entity_id"] = entity_id
162
+ if entity_representation:
163
+ params["entity_representation"] = entity_representation
164
+ if entity_domain:
165
+ params["entity_domain"] = entity_domain
166
+ if entity:
167
+ params["entity"] = entity
168
+ url = f"{self.base_ontology_url}/insights"
169
+ return self._get(url, params=params)
170
+
171
+ def get_insight_information(self, insight_id: int) -> dict:
172
+ """
173
+ Retrieve information for a specific insight.
174
+
175
+ Args:
176
+ insight_id: Insight ID.
177
+
178
+ Returns:
179
+ Dictionary with insight information.
180
+ """
181
+ url = f"{self.base_ontology_url}/insights/{insight_id}"
182
+ return self._get(url)
183
+
184
+ def get_insights_for_entity(self, entity_id: int) -> dict:
185
+ """
186
+ Retrieve insights for a specific entity.
187
+ """
188
+ url = f"{self.base_ontology_url}/entity/{entity_id}/insights"
189
+ return self._get(url)
190
+
191
+ def get_entities_for_insight(self, insight_id: int) -> dict:
192
+ """
193
+ Retrieve entities for a specific insight.
194
+ """
195
+ url = f"{self.base_ontology_url}/insight/{insight_id}/entities"
196
+ return self._get(url)
197
+
198
+ def get_subjects(self) -> dict:
199
+ """
200
+ Retrieve all subjects.
201
+ """
202
+ url = f"{self.base_ontology_url}/subjects"
203
+ return self._get(url)
204
+
205
+ def get_topics(self) -> dict:
206
+ """
207
+ Retrieve all topics.
208
+ """
209
+ url = f"{self.base_ontology_url}/topics"
210
+ return self._get(url)
211
+
212
+ def get_insights_for_subject(self, subject_id: int) -> dict:
213
+ """
214
+ Retrieve insights for a specific subject.
215
+ """
216
+ url = f"{self.base_ontology_url}/subject/{subject_id}/insights"
217
+ return self._get(url)
218
+
219
+ def get_insights_for_topic(self, topic_id: int) -> dict:
220
+ """
221
+ Retrieve insights for a specific topic.
222
+ """
223
+ url = f"{self.base_ontology_url}/topic/{topic_id}/insights"
224
+ return self._get(url)
225
+
226
+ def get_ontology_version(self) -> dict:
227
+ """
228
+ Retrieve the current ontology version.
229
+ """
230
+ url = f"{self.base_ontology_url}/ontology-versions"
231
+ return self._get(url)
232
+
233
+ def get_ontology_tree(self) -> dict:
234
+ """
235
+ Retrieve the ontology tree.
236
+ """
237
+ url = f"{self.base_ontology_url}/ontology-tree"
238
+ return self._get(url)
carbonarc/platform.py ADDED
@@ -0,0 +1,62 @@
1
+ from carbonarc.base.client import BaseAPIClient
2
+
3
+ class PlatformAPIClient(BaseAPIClient):
4
+ """
5
+ A client for interacting with the Carbon Arc Platform API.
6
+ """
7
+
8
+ def __init__(
9
+ self,
10
+ token: str,
11
+ host: str = "https://platform.carbonarc.co",
12
+ version: str = "v2"
13
+ ):
14
+ """
15
+ Initialize PlatformAPIClient.
16
+
17
+ Args:
18
+ token: Authentication token for requests.
19
+ host: Base URL of the Carbon Arc API.
20
+ version: API version to use.
21
+ """
22
+ super().__init__(token=token, host=host, version=version)
23
+
24
+ self.base_platform_url = self._build_base_url("clients")
25
+
26
+ def get_balance(self) -> dict:
27
+ """
28
+ Retrieve balance for the current user.
29
+ """
30
+ url = f"{self.base_platform_url}/me/balance"
31
+ return self._get(url)
32
+
33
+ def get_usage(self) -> dict:
34
+ """
35
+ Retrieve usage for the current user.
36
+ """
37
+ url = f"{self.base_platform_url}/me/usage"
38
+ return self._get(url)
39
+
40
+ def get_order_history(self) -> dict:
41
+ """
42
+ Retrieve order history.
43
+
44
+ Returns:
45
+ Dictionary of order history.
46
+ """
47
+ url = f"{self.base_platform_url}/me/orders"
48
+ return self._get(url)
49
+
50
+ def get_order_details(self, order_id: str) -> dict:
51
+ """
52
+ Retrieve details for a specific order.
53
+
54
+ Args:
55
+ order_id: ID of the order to retrieve details for.
56
+
57
+ Returns:
58
+ Dictionary of order details.
59
+ """
60
+ url = f"{self.base_platform_url}/orders/{order_id}"
61
+ return self._get(url)
62
+
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Carbon Arc
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,56 @@
1
+ Metadata-Version: 2.3
2
+ Name: carbonarc
3
+ Version: 1.0.0
4
+ Summary: Carbon Arc - Python Package
5
+ License: MIT
6
+ Author: Carbon Arc
7
+ Author-email: support@carbonarc.co
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Programming Language :: Python :: 2
10
+ Classifier: Programming Language :: Python :: 2.7
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.4
13
+ Classifier: Programming Language :: Python :: 3.5
14
+ Classifier: Programming Language :: Python :: 3.6
15
+ Classifier: Programming Language :: Python :: 3.7
16
+ Classifier: Programming Language :: Python :: 3.8
17
+ Classifier: Programming Language :: Python :: 3.9
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Requires-Dist: Click (>=8.1.7,<9.0.0)
23
+ Requires-Dist: beautifulsoup4 (>=4.12.2,<5.0.0)
24
+ Requires-Dist: pandas (>=2.2.3,<3.0.0)
25
+ Requires-Dist: requests (>=2.31.0,<3.0.0)
26
+ Project-URL: Repository, https://github.com/Carbon-Arc/carbonarc.git
27
+ Description-Content-Type: text/markdown
28
+
29
+ # Carbon Arc - Python Package
30
+
31
+ Client for [Carbon Arc](https://carbonarc.co/), an Insights Exchange Platform.
32
+
33
+ ## Usage
34
+
35
+ **Installation**
36
+
37
+ ```bash
38
+ pip install carbonarc
39
+ ```
40
+
41
+ **Quick Start**
42
+
43
+ Initialize the API client with authentication.
44
+
45
+ ```python
46
+ from carbonarc import CarbonArcClient
47
+
48
+ client = CarbonArcClient(token="<token>") # retrieve token from account
49
+ ```
50
+
51
+ ## Resources
52
+
53
+ - [Tutorials](https://github.com/Carbon-Arc/carbonarc-tutorials)
54
+ - [Docs](https://docs.carbonarc.co/)
55
+ - [App](https://app.carbonarc.co/)
56
+ - [API](https://api.carbonarc.co/)
@@ -0,0 +1,20 @@
1
+ carbonarc/__init__.py,sha256=tX_wgnLkNtQbXQLYLf_W4xVmsi4tYY4bSww5FI29LgQ,311
2
+ carbonarc/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ carbonarc/base/auth.py,sha256=LEgjCulVKe6MdkL-MemFTxl8lfA5AKHJOuNRDc00sj4,604
4
+ carbonarc/base/client.py,sha256=IeNeFTT83V6b-mPQ-7gQgbtinKG86rdnZ6_XeM_lKmQ,1335
5
+ carbonarc/base/exceptions.py,sha256=9FKbMjTl8h_8x06hMGuV9mmFcfgu_QeNMmouQJmbgi4,807
6
+ carbonarc/base/manager.py,sha256=nnNL44brXUa2LzQM_GGqIu04f1xD5AGKB4rWi9pUh60,3063
7
+ carbonarc/base/utils.py,sha256=IcEqKmusK-0fslopgNMrsoIuqG-zxhgBh8lKZ7DTkXc,1244
8
+ carbonarc/client.py,sha256=w5KdGfuQunIHJw2asfiymh0pS1Ry7WdhiTI5skSAz6g,1174
9
+ carbonarc/data.py,sha256=GicgDfX5vr8KgIZij6uBsV7pmfD1pJZREnkqR7UhQxY,19853
10
+ carbonarc/explorer.py,sha256=wO53AaWnzutucetFkQ4o412ykf1nkXX4bSeYheKhemQ,7525
11
+ carbonarc/hub.py,sha256=HoMyNssHcCQ8ht2DqYvQqZVJYjS1WkvYAV8o3VfmdHQ,1418
12
+ carbonarc/ontology.py,sha256=mkio2bymIQGctyRRTl0vKJnAJW1XmspodgyfE-0NvI0,8060
13
+ carbonarc/platform.py,sha256=y5gnZho3jnqQABYtJxXMyd_sBueCi1PaKOjB4l-MgS4,1669
14
+ carbonarc_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ carbonarc_cli/cli.py,sha256=SZzKn2x7fu-FHGvxFq6aH_Jbjky2cIji7WYMyfTV-vg,1361
16
+ carbonarc-1.0.0.dist-info/LICENSE,sha256=7AvXaWWJUZ9ppCoGEF9ncSKaBYtb5GKppfXFUoV2HxA,1067
17
+ carbonarc-1.0.0.dist-info/METADATA,sha256=HewHOdn7Nn-CMWOV1RkKHh5oVRGwAAgEKcHOuCINwkE,1686
18
+ carbonarc-1.0.0.dist-info/WHEEL,sha256=5druYqcII7zHXzX7qmN0TH895Jg3yuTtfjMgJIVBrKE,92
19
+ carbonarc-1.0.0.dist-info/entry_points.txt,sha256=_TBcw2Akk2E55i8V3DVRvLJ4dvUgVSVaqJlN3SBWIuk,51
20
+ carbonarc-1.0.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 2.1.3
3
+ Root-Is-Purelib: true
4
+ Tag: py2.py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ carbonarc=carbonarc_cli.cli:cli
3
+
File without changes