summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-05-31 04:56:40 +0000
committerCoprDistGit <infra@openeuler.org>2023-05-31 04:56:40 +0000
commita99924b3c8346af697c3f78e80f728b543aa54cb (patch)
treec06ddcebc02ae06b15f87f45dce49b2c2465c5f2
parentc0c6b1f9bfcce448bf5544d2395ee49ca263a71f (diff)
automatic import of python-amberflo-metering-python
-rw-r--r--.gitignore1
-rw-r--r--python-amberflo-metering-python.spec927
-rw-r--r--sources1
3 files changed, 929 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..e655e2a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/amberflo-metering-python-3.1.0.tar.gz
diff --git a/python-amberflo-metering-python.spec b/python-amberflo-metering-python.spec
new file mode 100644
index 0000000..27926ff
--- /dev/null
+++ b/python-amberflo-metering-python.spec
@@ -0,0 +1,927 @@
+%global _empty_manifest_terminate_build 0
+Name: python-amberflo-metering-python
+Version: 3.1.0
+Release: 1
+Summary: Integrate Amberflo into any Python 3 application.
+License: MIT License
+URL: https://github.com/amberflo/metering-python
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/d7/86/dc769203f3611b0988683725c5dac12fd104b8de17a1189c8b4589bc7366/amberflo-metering-python-3.1.0.tar.gz
+BuildArch: noarch
+
+Requires: python3-requests
+Requires: python3-backoff
+Requires: python3-boto3
+
+%description
+# amberflo-metering-python
+
+<p>
+ <a href="https://github.com/amberflo/metering-python/actions">
+ <img alt="CI Status" src="https://github.com/amberflo/metering-python/actions/workflows/tests.yml/badge.svg?branch=main">
+ </a>
+ <a href="https://pypi.org/project/amberflo-metering-python/">
+ <img alt="PyPI" src="https://img.shields.io/pypi/v/amberflo-metering-python">
+ </a>
+</p>
+
+[Amberflo](https://amberflo.io) is the simplest way to integrate metering into your application.
+
+This is the official Python 3 client that wraps the [Amberflo REST API](https://docs.amberflo.io/docs).
+
+## :heavy_check_mark: Features
+
+- Add and update customers
+- Assign and update product plans to customers
+- List invoices of a customer
+- Get a new customer portal session for a customer
+- Add and list prepaid orders to customers
+- Send meter events
+ - In asynchronous batches for high throughput (with optional flush on demand)
+ - Or synchronously
+ - Using the Amberflo API or the Amberflo supplied AWS S3 bucket
+- Query usage
+- Fine grained logging control
+
+## :rocket: Quick Start
+
+1. [Sign up for free](https://ui.amberflo.io/) and get an API key.
+
+2. Install the SDK
+
+```
+pip install amberflo-metering-python
+```
+
+3. Create a customer
+
+```python
+import os
+from metering.customer import CustomerApiClient, create_customer_payload
+
+client = CustomerApiClient(os.environ.get("API_KEY"))
+
+message = create_customer_payload(
+ customer_id="sample-customer-123",
+ customer_email="customer-123@sample.com",
+ customer_name="Sample Customer",
+ traits={
+ "region": "us-east-1",
+ },
+)
+customer = client.add_or_update(message)
+```
+
+4. Ingest meter events
+
+```python
+import os
+from time import time
+from metering.ingest import create_ingest_client
+
+client = create_ingest_client(api_key=os.environ["API_KEY"])
+
+dimensions = {"region": "us-east-1"}
+customer_id = "sample-customer-123"
+
+client.meter(
+ meter_api_name="sample-meter",
+ meter_value=5,
+ meter_time_in_millis=int(time() * 1000),
+ customer_id=customer_id,
+ dimensions=dimensions,
+)
+```
+
+5. Query usage
+
+```python
+import os
+from time import time
+from metering.usage import (AggregationType, Take, TimeGroupingInterval,
+ TimeRange, UsageApiClient, create_usage_query)
+
+client = UsageApiClient(os.environ.get("API_KEY"))
+
+since_two_days_ago = TimeRange(int(time()) - 60 * 60 * 24 * 2)
+
+query = create_usage_query(
+ meter_api_name="my_meter",
+ aggregation=AggregationType.SUM,
+ time_grouping_interval=TimeGroupingInterval.DAY,
+ time_range=since_two_days_ago,
+ group_by=["customerId"],
+ usage_filter={"customerId": ["some-customer-321", "sample-customer-123"]},
+ take=Take(limit=10, is_ascending=False),
+)
+report = client.get(query)
+```
+
+## :zap: High throughput ingestion
+
+Amberflo.io libraries are built to support high throughput environments. That
+means you can safely send hundreds of meter records per second. For example,
+you can chose to deploy it on a web server that is serving hundreds of requests
+per second.
+
+However, every call does not result in a HTTP request, but is queued in memory
+instead. Messages are batched and flushed in the background, allowing for much
+faster operation. The size of batch and rate of flush can be customized.
+
+**Flush on demand:** For example, at the end of your program, you'll want to
+flush to make sure there's nothing left in the queue. Calling this method will
+block the calling thread until there are no messages left in the queue. So,
+you'll want to use it as part of your cleanup scripts and avoid using it as
+part of the request lifecycle.
+
+**Error handling:** The SDK allows you to set up a `on_error` callback function
+for handling errors when trying to send a batch.
+
+Here is a complete example, showing the default values of all options:
+
+```python
+def on_error_callback(error, batch):
+ ...
+
+client = create_ingest_client(
+ api_key=API_KEY,
+ max_queue_size=100000, # max number of items in the queue before rejecting new items
+ threads=2, # number of worker threads doing the sending
+ retries=2, # max number of retries after failures
+ batch_size=100, # max number of meter records in a batch
+ send_interval_in_secs=0.5, # wait time before sending an incomplete batch
+ sleep_interval_in_secs=0.1, # wait time after failure to send or queue empty
+ on_error=on_error_callback, # handle failures to send a batch
+)
+
+...
+
+client.meter(...)
+
+client.flush() # block and make sure all messages are sent
+```
+
+### What happens if there are just too many messages?
+
+If the module detects that it can't flush faster than it's receiving messages,
+it'll simply stop accepting new messages. This allows your program to
+continually run without ever crashing due to a backed up metering queue.
+
+### Ingesting through the S3 bucket
+
+The SDK provides a `metering.ingest.IngestS3Client` so you can send your meter
+records to us via the S3 bucket.
+
+Use of this feature is enabled if you install the library with the `s3` option:
+```
+pip install amberflo-metering-python[s3]
+```
+
+Just pass the S3 bucket credentials to the factory function:
+```python
+client = create_ingest_client(
+ bucket_name=os.environ.get("BUCKET_NAME"),
+ access_key=os.environ.get("ACCESS_KEY"),
+ secret_key=os.environ.get("SECRET_KEY"),
+)
+```
+
+## :book: Documentation
+
+General documentation on how to use Amberflo is available at [Product Walkthrough](https://docs.amberflo.io/docs/product-walkthrough).
+
+The full REST API documentation is available at [API Reference](https://docs.amberflo.io/reference).
+
+## :scroll: Samples
+
+Code samples covering different scenarios are available in the [./samples](https://github.com/amberflo/metering-python/blob/main/samples/README.md) folder.
+
+## :construction_worker: Contributing
+
+Feel free to open issues and send a pull request.
+
+Also, check out [CONTRIBUTING.md](https://github.com/amberflo/metering-python/blob/main/CONTRIBUTING.md).
+
+## :bookmark_tabs: Reference
+
+### API Clients
+
+#### [Ingest](https://docs.amberflo.io/reference/post_ingest)
+
+```python
+from metering.ingest import (
+ create_ingest_payload,
+ create_ingest_client,
+)
+```
+
+#### [Customer](https://docs.amberflo.io/reference/post_customers)
+
+```python
+from metering.customer import (
+ CustomerApiClient,
+ create_customer_payload,
+)
+```
+
+#### [Usage](https://docs.amberflo.io/reference/post_usage)
+
+```python
+from metering.usage import (
+ AggregationType,
+ Take,
+ TimeGroupingInterval,
+ TimeRange,
+ UsageApiClient,
+ create_usage_query,
+ create_all_usage_query,
+)
+```
+
+#### [Customer Portal Session](https://docs.amberflo.io/reference/post_session)
+
+```python
+from metering.customer_portal_session import (
+ CustomerPortalSessionApiClient,
+ create_customer_portal_session_payload,
+)
+```
+
+#### [Customer Prepaid Order](https://docs.amberflo.io/reference/post_payments-pricing-amberflo-customer-prepaid)
+
+```python
+from metering.customer_prepaid_order import (
+ BillingPeriod,
+ BillingPeriodUnit,
+ CustomerPrepaidOrderApiClient,
+ create_customer_prepaid_order_payload,
+)
+```
+
+#### [Customer Product Invoice](https://docs.amberflo.io/reference/get_payments-billing-customer-product-invoice)
+
+```python
+from metering.customer_product_invoice import (
+ CustomerProductInvoiceApiClient,
+ create_all_invoices_query,
+ create_latest_invoice_query,
+ create_invoice_query,
+)
+```
+
+#### [Customer Product Plan](https://docs.amberflo.io/reference/post_payments-pricing-amberflo-customer-pricing)
+
+```python
+from metering.customer_product_plan import (
+ CustomerProductPlanApiClient,
+ create_customer_product_plan_payload,
+)
+```
+
+### Exceptions
+
+```python
+from metering.exceptions import ApiError
+```
+
+### Logging
+
+`amberflo-metering-python` uses the standard Python logging framework. By
+default, logging is and set at the `WARNING` level.
+
+The following loggers are used:
+
+- `metering.ingest.producer`
+- `metering.ingest.s3_client`
+- `metering.ingest.consumer`
+- `metering.session.ingest_session`
+- `metering.session.api_session`
+
+
+
+
+%package -n python3-amberflo-metering-python
+Summary: Integrate Amberflo into any Python 3 application.
+Provides: python-amberflo-metering-python
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-amberflo-metering-python
+# amberflo-metering-python
+
+<p>
+ <a href="https://github.com/amberflo/metering-python/actions">
+ <img alt="CI Status" src="https://github.com/amberflo/metering-python/actions/workflows/tests.yml/badge.svg?branch=main">
+ </a>
+ <a href="https://pypi.org/project/amberflo-metering-python/">
+ <img alt="PyPI" src="https://img.shields.io/pypi/v/amberflo-metering-python">
+ </a>
+</p>
+
+[Amberflo](https://amberflo.io) is the simplest way to integrate metering into your application.
+
+This is the official Python 3 client that wraps the [Amberflo REST API](https://docs.amberflo.io/docs).
+
+## :heavy_check_mark: Features
+
+- Add and update customers
+- Assign and update product plans to customers
+- List invoices of a customer
+- Get a new customer portal session for a customer
+- Add and list prepaid orders to customers
+- Send meter events
+ - In asynchronous batches for high throughput (with optional flush on demand)
+ - Or synchronously
+ - Using the Amberflo API or the Amberflo supplied AWS S3 bucket
+- Query usage
+- Fine grained logging control
+
+## :rocket: Quick Start
+
+1. [Sign up for free](https://ui.amberflo.io/) and get an API key.
+
+2. Install the SDK
+
+```
+pip install amberflo-metering-python
+```
+
+3. Create a customer
+
+```python
+import os
+from metering.customer import CustomerApiClient, create_customer_payload
+
+client = CustomerApiClient(os.environ.get("API_KEY"))
+
+message = create_customer_payload(
+ customer_id="sample-customer-123",
+ customer_email="customer-123@sample.com",
+ customer_name="Sample Customer",
+ traits={
+ "region": "us-east-1",
+ },
+)
+customer = client.add_or_update(message)
+```
+
+4. Ingest meter events
+
+```python
+import os
+from time import time
+from metering.ingest import create_ingest_client
+
+client = create_ingest_client(api_key=os.environ["API_KEY"])
+
+dimensions = {"region": "us-east-1"}
+customer_id = "sample-customer-123"
+
+client.meter(
+ meter_api_name="sample-meter",
+ meter_value=5,
+ meter_time_in_millis=int(time() * 1000),
+ customer_id=customer_id,
+ dimensions=dimensions,
+)
+```
+
+5. Query usage
+
+```python
+import os
+from time import time
+from metering.usage import (AggregationType, Take, TimeGroupingInterval,
+ TimeRange, UsageApiClient, create_usage_query)
+
+client = UsageApiClient(os.environ.get("API_KEY"))
+
+since_two_days_ago = TimeRange(int(time()) - 60 * 60 * 24 * 2)
+
+query = create_usage_query(
+ meter_api_name="my_meter",
+ aggregation=AggregationType.SUM,
+ time_grouping_interval=TimeGroupingInterval.DAY,
+ time_range=since_two_days_ago,
+ group_by=["customerId"],
+ usage_filter={"customerId": ["some-customer-321", "sample-customer-123"]},
+ take=Take(limit=10, is_ascending=False),
+)
+report = client.get(query)
+```
+
+## :zap: High throughput ingestion
+
+Amberflo.io libraries are built to support high throughput environments. That
+means you can safely send hundreds of meter records per second. For example,
+you can chose to deploy it on a web server that is serving hundreds of requests
+per second.
+
+However, every call does not result in a HTTP request, but is queued in memory
+instead. Messages are batched and flushed in the background, allowing for much
+faster operation. The size of batch and rate of flush can be customized.
+
+**Flush on demand:** For example, at the end of your program, you'll want to
+flush to make sure there's nothing left in the queue. Calling this method will
+block the calling thread until there are no messages left in the queue. So,
+you'll want to use it as part of your cleanup scripts and avoid using it as
+part of the request lifecycle.
+
+**Error handling:** The SDK allows you to set up a `on_error` callback function
+for handling errors when trying to send a batch.
+
+Here is a complete example, showing the default values of all options:
+
+```python
+def on_error_callback(error, batch):
+ ...
+
+client = create_ingest_client(
+ api_key=API_KEY,
+ max_queue_size=100000, # max number of items in the queue before rejecting new items
+ threads=2, # number of worker threads doing the sending
+ retries=2, # max number of retries after failures
+ batch_size=100, # max number of meter records in a batch
+ send_interval_in_secs=0.5, # wait time before sending an incomplete batch
+ sleep_interval_in_secs=0.1, # wait time after failure to send or queue empty
+ on_error=on_error_callback, # handle failures to send a batch
+)
+
+...
+
+client.meter(...)
+
+client.flush() # block and make sure all messages are sent
+```
+
+### What happens if there are just too many messages?
+
+If the module detects that it can't flush faster than it's receiving messages,
+it'll simply stop accepting new messages. This allows your program to
+continually run without ever crashing due to a backed up metering queue.
+
+### Ingesting through the S3 bucket
+
+The SDK provides a `metering.ingest.IngestS3Client` so you can send your meter
+records to us via the S3 bucket.
+
+Use of this feature is enabled if you install the library with the `s3` option:
+```
+pip install amberflo-metering-python[s3]
+```
+
+Just pass the S3 bucket credentials to the factory function:
+```python
+client = create_ingest_client(
+ bucket_name=os.environ.get("BUCKET_NAME"),
+ access_key=os.environ.get("ACCESS_KEY"),
+ secret_key=os.environ.get("SECRET_KEY"),
+)
+```
+
+## :book: Documentation
+
+General documentation on how to use Amberflo is available at [Product Walkthrough](https://docs.amberflo.io/docs/product-walkthrough).
+
+The full REST API documentation is available at [API Reference](https://docs.amberflo.io/reference).
+
+## :scroll: Samples
+
+Code samples covering different scenarios are available in the [./samples](https://github.com/amberflo/metering-python/blob/main/samples/README.md) folder.
+
+## :construction_worker: Contributing
+
+Feel free to open issues and send a pull request.
+
+Also, check out [CONTRIBUTING.md](https://github.com/amberflo/metering-python/blob/main/CONTRIBUTING.md).
+
+## :bookmark_tabs: Reference
+
+### API Clients
+
+#### [Ingest](https://docs.amberflo.io/reference/post_ingest)
+
+```python
+from metering.ingest import (
+ create_ingest_payload,
+ create_ingest_client,
+)
+```
+
+#### [Customer](https://docs.amberflo.io/reference/post_customers)
+
+```python
+from metering.customer import (
+ CustomerApiClient,
+ create_customer_payload,
+)
+```
+
+#### [Usage](https://docs.amberflo.io/reference/post_usage)
+
+```python
+from metering.usage import (
+ AggregationType,
+ Take,
+ TimeGroupingInterval,
+ TimeRange,
+ UsageApiClient,
+ create_usage_query,
+ create_all_usage_query,
+)
+```
+
+#### [Customer Portal Session](https://docs.amberflo.io/reference/post_session)
+
+```python
+from metering.customer_portal_session import (
+ CustomerPortalSessionApiClient,
+ create_customer_portal_session_payload,
+)
+```
+
+#### [Customer Prepaid Order](https://docs.amberflo.io/reference/post_payments-pricing-amberflo-customer-prepaid)
+
+```python
+from metering.customer_prepaid_order import (
+ BillingPeriod,
+ BillingPeriodUnit,
+ CustomerPrepaidOrderApiClient,
+ create_customer_prepaid_order_payload,
+)
+```
+
+#### [Customer Product Invoice](https://docs.amberflo.io/reference/get_payments-billing-customer-product-invoice)
+
+```python
+from metering.customer_product_invoice import (
+ CustomerProductInvoiceApiClient,
+ create_all_invoices_query,
+ create_latest_invoice_query,
+ create_invoice_query,
+)
+```
+
+#### [Customer Product Plan](https://docs.amberflo.io/reference/post_payments-pricing-amberflo-customer-pricing)
+
+```python
+from metering.customer_product_plan import (
+ CustomerProductPlanApiClient,
+ create_customer_product_plan_payload,
+)
+```
+
+### Exceptions
+
+```python
+from metering.exceptions import ApiError
+```
+
+### Logging
+
+`amberflo-metering-python` uses the standard Python logging framework. By
+default, logging is and set at the `WARNING` level.
+
+The following loggers are used:
+
+- `metering.ingest.producer`
+- `metering.ingest.s3_client`
+- `metering.ingest.consumer`
+- `metering.session.ingest_session`
+- `metering.session.api_session`
+
+
+
+
+%package help
+Summary: Development documents and examples for amberflo-metering-python
+Provides: python3-amberflo-metering-python-doc
+%description help
+# amberflo-metering-python
+
+<p>
+ <a href="https://github.com/amberflo/metering-python/actions">
+ <img alt="CI Status" src="https://github.com/amberflo/metering-python/actions/workflows/tests.yml/badge.svg?branch=main">
+ </a>
+ <a href="https://pypi.org/project/amberflo-metering-python/">
+ <img alt="PyPI" src="https://img.shields.io/pypi/v/amberflo-metering-python">
+ </a>
+</p>
+
+[Amberflo](https://amberflo.io) is the simplest way to integrate metering into your application.
+
+This is the official Python 3 client that wraps the [Amberflo REST API](https://docs.amberflo.io/docs).
+
+## :heavy_check_mark: Features
+
+- Add and update customers
+- Assign and update product plans to customers
+- List invoices of a customer
+- Get a new customer portal session for a customer
+- Add and list prepaid orders to customers
+- Send meter events
+ - In asynchronous batches for high throughput (with optional flush on demand)
+ - Or synchronously
+ - Using the Amberflo API or the Amberflo supplied AWS S3 bucket
+- Query usage
+- Fine grained logging control
+
+## :rocket: Quick Start
+
+1. [Sign up for free](https://ui.amberflo.io/) and get an API key.
+
+2. Install the SDK
+
+```
+pip install amberflo-metering-python
+```
+
+3. Create a customer
+
+```python
+import os
+from metering.customer import CustomerApiClient, create_customer_payload
+
+client = CustomerApiClient(os.environ.get("API_KEY"))
+
+message = create_customer_payload(
+ customer_id="sample-customer-123",
+ customer_email="customer-123@sample.com",
+ customer_name="Sample Customer",
+ traits={
+ "region": "us-east-1",
+ },
+)
+customer = client.add_or_update(message)
+```
+
+4. Ingest meter events
+
+```python
+import os
+from time import time
+from metering.ingest import create_ingest_client
+
+client = create_ingest_client(api_key=os.environ["API_KEY"])
+
+dimensions = {"region": "us-east-1"}
+customer_id = "sample-customer-123"
+
+client.meter(
+ meter_api_name="sample-meter",
+ meter_value=5,
+ meter_time_in_millis=int(time() * 1000),
+ customer_id=customer_id,
+ dimensions=dimensions,
+)
+```
+
+5. Query usage
+
+```python
+import os
+from time import time
+from metering.usage import (AggregationType, Take, TimeGroupingInterval,
+ TimeRange, UsageApiClient, create_usage_query)
+
+client = UsageApiClient(os.environ.get("API_KEY"))
+
+since_two_days_ago = TimeRange(int(time()) - 60 * 60 * 24 * 2)
+
+query = create_usage_query(
+ meter_api_name="my_meter",
+ aggregation=AggregationType.SUM,
+ time_grouping_interval=TimeGroupingInterval.DAY,
+ time_range=since_two_days_ago,
+ group_by=["customerId"],
+ usage_filter={"customerId": ["some-customer-321", "sample-customer-123"]},
+ take=Take(limit=10, is_ascending=False),
+)
+report = client.get(query)
+```
+
+## :zap: High throughput ingestion
+
+Amberflo.io libraries are built to support high throughput environments. That
+means you can safely send hundreds of meter records per second. For example,
+you can chose to deploy it on a web server that is serving hundreds of requests
+per second.
+
+However, every call does not result in a HTTP request, but is queued in memory
+instead. Messages are batched and flushed in the background, allowing for much
+faster operation. The size of batch and rate of flush can be customized.
+
+**Flush on demand:** For example, at the end of your program, you'll want to
+flush to make sure there's nothing left in the queue. Calling this method will
+block the calling thread until there are no messages left in the queue. So,
+you'll want to use it as part of your cleanup scripts and avoid using it as
+part of the request lifecycle.
+
+**Error handling:** The SDK allows you to set up a `on_error` callback function
+for handling errors when trying to send a batch.
+
+Here is a complete example, showing the default values of all options:
+
+```python
+def on_error_callback(error, batch):
+ ...
+
+client = create_ingest_client(
+ api_key=API_KEY,
+ max_queue_size=100000, # max number of items in the queue before rejecting new items
+ threads=2, # number of worker threads doing the sending
+ retries=2, # max number of retries after failures
+ batch_size=100, # max number of meter records in a batch
+ send_interval_in_secs=0.5, # wait time before sending an incomplete batch
+ sleep_interval_in_secs=0.1, # wait time after failure to send or queue empty
+ on_error=on_error_callback, # handle failures to send a batch
+)
+
+...
+
+client.meter(...)
+
+client.flush() # block and make sure all messages are sent
+```
+
+### What happens if there are just too many messages?
+
+If the module detects that it can't flush faster than it's receiving messages,
+it'll simply stop accepting new messages. This allows your program to
+continually run without ever crashing due to a backed up metering queue.
+
+### Ingesting through the S3 bucket
+
+The SDK provides a `metering.ingest.IngestS3Client` so you can send your meter
+records to us via the S3 bucket.
+
+Use of this feature is enabled if you install the library with the `s3` option:
+```
+pip install amberflo-metering-python[s3]
+```
+
+Just pass the S3 bucket credentials to the factory function:
+```python
+client = create_ingest_client(
+ bucket_name=os.environ.get("BUCKET_NAME"),
+ access_key=os.environ.get("ACCESS_KEY"),
+ secret_key=os.environ.get("SECRET_KEY"),
+)
+```
+
+## :book: Documentation
+
+General documentation on how to use Amberflo is available at [Product Walkthrough](https://docs.amberflo.io/docs/product-walkthrough).
+
+The full REST API documentation is available at [API Reference](https://docs.amberflo.io/reference).
+
+## :scroll: Samples
+
+Code samples covering different scenarios are available in the [./samples](https://github.com/amberflo/metering-python/blob/main/samples/README.md) folder.
+
+## :construction_worker: Contributing
+
+Feel free to open issues and send a pull request.
+
+Also, check out [CONTRIBUTING.md](https://github.com/amberflo/metering-python/blob/main/CONTRIBUTING.md).
+
+## :bookmark_tabs: Reference
+
+### API Clients
+
+#### [Ingest](https://docs.amberflo.io/reference/post_ingest)
+
+```python
+from metering.ingest import (
+ create_ingest_payload,
+ create_ingest_client,
+)
+```
+
+#### [Customer](https://docs.amberflo.io/reference/post_customers)
+
+```python
+from metering.customer import (
+ CustomerApiClient,
+ create_customer_payload,
+)
+```
+
+#### [Usage](https://docs.amberflo.io/reference/post_usage)
+
+```python
+from metering.usage import (
+ AggregationType,
+ Take,
+ TimeGroupingInterval,
+ TimeRange,
+ UsageApiClient,
+ create_usage_query,
+ create_all_usage_query,
+)
+```
+
+#### [Customer Portal Session](https://docs.amberflo.io/reference/post_session)
+
+```python
+from metering.customer_portal_session import (
+ CustomerPortalSessionApiClient,
+ create_customer_portal_session_payload,
+)
+```
+
+#### [Customer Prepaid Order](https://docs.amberflo.io/reference/post_payments-pricing-amberflo-customer-prepaid)
+
+```python
+from metering.customer_prepaid_order import (
+ BillingPeriod,
+ BillingPeriodUnit,
+ CustomerPrepaidOrderApiClient,
+ create_customer_prepaid_order_payload,
+)
+```
+
+#### [Customer Product Invoice](https://docs.amberflo.io/reference/get_payments-billing-customer-product-invoice)
+
+```python
+from metering.customer_product_invoice import (
+ CustomerProductInvoiceApiClient,
+ create_all_invoices_query,
+ create_latest_invoice_query,
+ create_invoice_query,
+)
+```
+
+#### [Customer Product Plan](https://docs.amberflo.io/reference/post_payments-pricing-amberflo-customer-pricing)
+
+```python
+from metering.customer_product_plan import (
+ CustomerProductPlanApiClient,
+ create_customer_product_plan_payload,
+)
+```
+
+### Exceptions
+
+```python
+from metering.exceptions import ApiError
+```
+
+### Logging
+
+`amberflo-metering-python` uses the standard Python logging framework. By
+default, logging is and set at the `WARNING` level.
+
+The following loggers are used:
+
+- `metering.ingest.producer`
+- `metering.ingest.s3_client`
+- `metering.ingest.consumer`
+- `metering.session.ingest_session`
+- `metering.session.api_session`
+
+
+
+
+%prep
+%autosetup -n amberflo-metering-python-3.1.0
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-amberflo-metering-python -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Wed May 31 2023 Python_Bot <Python_Bot@openeuler.org> - 3.1.0-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..9e20a45
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+28267515ad15d976edd7704c88be9060 amberflo-metering-python-3.1.0.tar.gz