Metadata-Version: 2.1
Name: sfdevtools
Version: 1.13.0
Summary: 
Author: SulfredLee
Author-email: sflee1112@gmail.com
Requires-Python: >=3.8,<4.0
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Requires-Dist: boto3 (>=1.26.61,<2.0.0)
Requires-Dist: grpcio (>=1.51.1,<2.0.0)
Requires-Dist: grpcio-tools (>=1.51.1,<2.0.0)
Requires-Dist: nanoid (>=2.0.0,<3.0.0)
Requires-Dist: pandas (>=1.5.3,<2.0.0)
Description-Content-Type: text/markdown

## How to publish to pypi
```bash
# set up pypi token
poetry config pypi-token.pypi my-token

# build the project
poetry build

# publish the project
poetry publish

# DONE
```

## Generate source code from protobuf
```bash
$ poetry add grpcio-tools
$ poetry add grpcio
$ cd sfdevtools/
$ poetry run python -m grpc_tools.protoc -I ./grpc_protos --python_out=./grpc_protos/ --grpc_python_out=./grpc_protos/ ./grpc_protos/peacock.proto
```

## Demo example
### Double check lock for singleton
```python
import sfdevtools.observability.log_helper as lh
import logging
logger = lh.init_logger(logger_name="sfdevtools_logger", is_json_output=False)
# create class X
class X(SDC):
    pass

# create class Y
class Y(SDC):
    pass

A1, A2 = X.instance(), X.instance()
B1, B2 = Y.instance(), Y.instance()

assert A1 is not B1
assert A1 is A2
assert B1 is B2

logger.info('A1 : {}'.format(A1))
logger.info('A2 : {}'.format(A2))
logger.info('B1 : {}'.format(B1))
logger.info('B2 : {}'.format(B2))
```

### Send log to logstash
```python
logger = lh.init_logger(logger_name="connection_tester_logger"
                        , is_json_output=False
                        , is_print_to_console=True
                        , is_print_to_logstash=True
                        , logstash_host="<the host name>"
                        , logstash_port=5960
                        , logstash_user_tags=["Test001", "Test002"])
logger.info("Test Message from test")
logger.error("Test Message from test")
logger.warning("Test Message from test")
```

