diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 0947951e..70c59fc8 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -78,23 +78,6 @@ jobs: - name: Test Gnomock connection run: curl localhost:23042/stop -d '{"id":"42"}' - test-sdk: - name: "[sdk] python" - runs-on: ubuntu-latest - env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - steps: - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - name: Install Task - uses: arduino/setup-task@v1 - with: - version: '3.0.0' - - name: Generate - run: task generate:sdk:python - - name: Test - run: task test:sdk:python - test-localstack: name: "[preset] localstack" runs-on: ubuntu-latest diff --git a/README.md b/README.md index 8181588e..aa6d49dd 100644 --- a/README.md +++ b/README.md @@ -180,8 +180,7 @@ give Gnomock an advantage: Preset implementation whenever necessary. - Gnomock's vision includes **being useful not only in Go** projects, but in any projects via HTTP. It already supports almost all its features over HTTP - layer, has a clear OpenAPI spec, and even a proof of concept wrapper in - Python. + layer and has a clear OpenAPI spec. - Gnomock has a friendly **garden gnome mascot**😻 ## Troubleshooting diff --git a/Taskfile.yml b/Taskfile.yml index c29e42dd..76301a39 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -28,32 +28,12 @@ tasks: ./internal/cleaner \ ./internal/health - # - # SDK release routines - # - - release:sdk:python: - cmds: - - task: swagger:update-version - - task: git:clone:python - - task: generate:sdk:python - # - task: test:sdk:python - - task: git:commit:python - - rm -rf ./dist - - deactivate || true - - python3 setup.py sdist bdist_wheel - - python3 -m twine upload dist/* - dir: ./sdktest/python/gnomock - swagger:update-version: cmds: - | sed -Ei '' 's/^ version: (.*)$/ version: {{.version}}/' swagger/swagger.yaml - - | - sed -Ei '' 's/^packageVersion: (.*)$/packageVersion: {{.version}}/' swagger/config/python.yaml - | sed -Ei '' 's/apis\/orlangure\/gnomock\/(.*)#/apis\/orlangure\/gnomock\/{{.version}}#/' README.md - - git add README.md swagger/config/python.yaml swagger/swagger.yaml - git commit -m 'Update version to {{.version}}' silent: true dir: . @@ -68,54 +48,6 @@ tasks: - sh: test $release msg: release flag is not set - git:clone:python: - cmds: - - rm -rf gnomock - - git clone --depth 1 https://github.com/orlangure/gnomock-python-sdk gnomock - dir: ./sdktest/python - - generate:sdk:python: - cmds: - - | - docker run --rm -v $PWD:/local \ - openapitools/openapi-generator-cli:v4.3.1 generate \ - -i /local/swagger/swagger.yaml \ - -g python \ - -o /local/sdktest/python/gnomock \ - -c /local/swagger/config/python.yaml \ - --git-user-id orlangure \ - --git-repo-id gnomock-python-sdk - silent: true - dir: . - - git:commit:python: - cmds: - - rm .travis.yml - - git add . - - git commit -m 'Bump version to {{.version}}' - - git push - dir: ./sdktest/python/gnomock - preconditions: - - sh: test $version - msg: version is not set - - test:sdk:python: - cmds: - - task: gnomock:run - - | - {{ if not .CI }} - python3 -m venv venv - source venv/bin/activate - {{ else }} - docker system df - docker system prune -f - docker system df - {{ end }} - pip3 install -r requirements.txt - python3 -m pytest -n 1 -v -k TestSDK - - task: gnomock:stop - dir: ./sdktest/python - gnomock:run: cmds: - task: gnomock:stop diff --git a/cmd/generator/main.go b/cmd/generator/main.go index 36e3e061..c4f6b95a 100644 --- a/cmd/generator/main.go +++ b/cmd/generator/main.go @@ -15,8 +15,6 @@ import ( const ( registryPlaceholder = `// new presets go here -` - pytestPlaceholder = `### gnomock-generator ` startPresetPlaceholder = `### /start/preset ` @@ -85,10 +83,6 @@ func generate() error { return err } - if err := sdktestPkg(pp); err != nil { - return err - } - if err := swagger(pp); err != nil { return err } @@ -229,34 +223,6 @@ func registry(params presetParams) error { return nil } -// sdktestPkg generates code required for testing the generated SDK. It creates -// a `testdata` folder for a new preset and adds a test stub to `test_sdk.py`. -// -// Test generator is the most basic possible: it will generate wrong names for -// any preset that doesn't have a single word, simple case name like "Redis" or -// "Kubernetes": names like RabbitMQ will break. -func sdktestPkg(params presetParams) error { - testPath := path.Join("sdktest", "python", "test") - dir := path.Join(testPath, "testdata", strings.ToLower(params.Name)) - - if err := os.MkdirAll(dir, os.ModePerm); err != nil { - return fmt.Errorf("can't create testdata dir: %w", err) - } - - pytestFileName := path.Join(testPath, "test_sdk.py") - - if err := replacePlaceholder( - pytestFileName, - "cmd/generator/templates/sdktest/python/test/test_sdk.py.template", - pytestPlaceholder, - params, - ); err != nil { - return fmt.Errorf("can't generate python tests: %w", err) - } - - return nil -} - // swagger generates new definitions in swagger.yaml file. These definitions // should be extended with options supported by a new preset. func swagger(params presetParams) error { diff --git a/cmd/generator/templates/sdktest/python/test/test_sdk.py.template b/cmd/generator/templates/sdktest/python/test/test_sdk.py.template deleted file mode 100644 index 530b58e7..00000000 --- a/cmd/generator/templates/sdktest/python/test/test_sdk.py.template +++ /dev/null @@ -1,20 +0,0 @@ - def test_{{ lower .Name }}(self): - # TODO: make sure names below match the code - options = gnomock.Options(debug=True) - preset = gnomock.{{ title .Name }}(version="latest") - {{ lower .Name }}_request = gnomock.{{ title .Name }}Request(options=options, - preset=preset) - id = "" - - try: - response = self.api.start_{{ snake .Name }}({{ lower .Name }}_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - -### gnomock-generator diff --git a/docs/server.md b/docs/server.md index 9c3e7658..61c75091 100644 --- a/docs/server.md +++ b/docs/server.md @@ -88,17 +88,7 @@ $ curl --data @mysql-preset.json http://127.0.0.1:23042/start/mysql } ``` -There are auto-generated wrappers for the available API: - -| Client | Sample code | -|--------|-------------| -| [Python SDK](https://github.com/orlangure/gnomock-python-sdk) | [Code](https://github.com/orlangure/gnomock/blob/master/sdktest/python/test/test_sdk.py) | -| JavaScript SDK | | -| Ruby SDK | | -| PHP SDK | | -| Java SDK | | -| [Other](https://openapi-generator.tech/docs/generators) languages | | - -**For more details and a full specification, see -[documentation](https://app.swaggerhub.com/apis/orlangure/gnomock/).** +For more details and a full specification, see +[documentation](https://app.swaggerhub.com/apis/orlangure/gnomock/). Use +OpenAPI generator to create API wrappers in the language of your choice. diff --git a/sdktest/python/__init__.py b/sdktest/python/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/sdktest/python/requirements.txt b/sdktest/python/requirements.txt deleted file mode 100644 index 014c92b8..00000000 --- a/sdktest/python/requirements.txt +++ /dev/null @@ -1,19 +0,0 @@ -apipkg==1.5 -attrs==19.3.0 -certifi==2020.4.5.1 -execnet==1.7.1 -importlib-metadata==1.6.0 -more-itertools==8.2.0 -packaging==20.3 -pluggy==0.13.1 -py==1.10.0 -pyparsing==2.4.7 -pytest==6.2.2 -pytest-forked==1.1.3 -pytest-xdist==1.31.0 -python-dateutil==2.8.1 -six==1.14.0 -urllib3==1.26.5 -wcwidth==0.1.9 -zipp==3.1.0 -pytest-order==0.9.4 diff --git a/sdktest/python/run.sh b/sdktest/python/run.sh deleted file mode 100755 index 29b55529..00000000 --- a/sdktest/python/run.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -set -e - -if [[ -z "$GITHUB_ACTIONS" ]]; then - python3 -m venv venv - source venv/bin/activate -fi - -pip3 install -r requirements.txt -python3 -m pytest -n 2 diff --git a/sdktest/python/test/test_sdk.py b/sdktest/python/test/test_sdk.py deleted file mode 100644 index 83614c78..00000000 --- a/sdktest/python/test/test_sdk.py +++ /dev/null @@ -1,334 +0,0 @@ -import gnomock -from gnomock.rest import ApiException -from urllib.parse import urlparse -import os - -import unittest -import os - -class TestSDK(unittest.TestCase): - def setUp(self): - addr = "127.0.0.1" - - dh = os.environ.get("DOCKER_HOST") - if dh: - u = urlparse(dh) - addr = u.hostname - - host = "http://{}:23042".format(addr) - - configuration = gnomock.Configuration(host=host) - with gnomock.ApiClient(configuration) as client: - self.api = gnomock.PresetsApi(client) - - def tearDown(self): - return super().tearDown() - - def test_mongo(self): - options = gnomock.Options() - file_name = os.path.abspath("./test/testdata/mongo") - preset = gnomock.Mongo(data_path=file_name, version="3") - mongo_request = gnomock.MongoRequest(options=options, preset=preset) - id = "" - - try: - response = self.api.start_mongo(mongo_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - - def test_mysql(self): - options = gnomock.Options() - file_name = os.path.abspath("./test/testdata/mysql/schema.sql") - preset = gnomock.Mysql(queries_files=[file_name], version="8") - mysql_request = gnomock.MysqlRequest(options=options, preset=preset) - id = "" - - try: - response = self.api.start_mysql(mysql_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - - def test_mariadb(self): - options = gnomock.Options() - file_name = os.path.abspath("./test/testdata/mysql/schema.sql") - preset = gnomock.Mariadb(queries_files=[file_name], version="10") - mariadb_request = gnomock.MariadbRequest(options=options, preset=preset) - id = "" - - try: - response = self.api.start_mariadb(mariadb_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - - def test_mssql(self): - options = gnomock.Options() - file_name = os.path.abspath("./test/testdata/mssql/schema.sql") - preset = gnomock.Mssql(queries_files=[file_name], license=True, version="2019-latest") - mssql_request = gnomock.MssqlRequest(options=options, preset=preset) - id = "" - - try: - response = self.api.start_mssql(mssql_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - - def test_postgres(self): - options = gnomock.Options() - file_name = os.path.abspath("./test/testdata/postgres/schema.sql") - preset = gnomock.Postgres(queries_files=[file_name], version="12") - postgres_request = gnomock.PostgresRequest(options=options, preset=preset) - id = "" - - try: - response = self.api.start_postgres(postgres_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - - def test_redis(self): - options = gnomock.Options(debug=True) - values = { - "foo": "bar", - "number": 42, - "float": 3.14 - } - preset = gnomock.Redis(version="5", values=values) - redis_request = gnomock.RedisRequest(options=options, preset=preset) - id = "" - - try: - response = self.api.start_redis(redis_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - - def test_memcached(self): - options = gnomock.Options() - values = { - "foo": "bar", - } - byte_values = { - "key": "Z25vbW9jawo=" - } - preset = gnomock.Memcached(version="1.6.6-alpine", values=values, - byte_values=byte_values) - memcached_request = gnomock.MemcachedRequest(options=options, preset=preset) - id = "" - - try: - response = self.api.start_memcached(memcached_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - - def test_splunk(self): - options = gnomock.Options() - file_name = os.path.abspath("./test/testdata/splunk/events.jsonl") - preset = gnomock.Splunk(values_file=file_name, accept_license=True, - admin_password="12345678", version="8.0.2.1") - splunk_request = gnomock.SplunkRequest(options=options, preset=preset) - id = "" - - try: - response = self.api.start_splunk(splunk_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - - def test_localstack(self): - options = gnomock.Options() - preset = gnomock.Localstack(services=['s3'], version="0.11.0") - localstack_request = gnomock.LocalstackRequest(options=options, preset=preset) - id = "" - - try: - response = self.api.start_localstack(localstack_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - def test_rabbitmq(self): - file_name = os.path.abspath("./test/testdata/rabbitmq/messages.jsonl") - options = gnomock.Options() - message = gnomock.RabbitmqMessage(queue="alerts", - content_type="text/plain", string_body="python") - preset = gnomock.Rabbitmq(version="3.8.5-alpine", - messages_files=[file_name], messages=[message]) - rabbitmq_request = gnomock.RabbitmqRequest(options=options, - preset=preset) - id = "" - - try: - response = self.api.start_rabbit_mq(rabbitmq_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - - def test_kafka(self): - options = gnomock.Options() - preset = gnomock.Kafka(version="2.5.1-L0") - kafka_request = gnomock.KafkaRequest(options=options, - preset=preset) - id = "" - - try: - response = self.api.start_kafka(kafka_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - - def test_elastic(self): - options = gnomock.Options() - preset = gnomock.Elastic(version="7.9.2") - elastic_request = gnomock.ElasticRequest(options=options, - preset=preset) - id = "" - - try: - response = self.api.start_elastic(elastic_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - - def test_kubernetes(self): - options = gnomock.Options() - preset = gnomock.Kubernetes(version="latest") - kubernetes_request = gnomock.KubernetesRequest(options=options, - preset=preset) - id = "" - - try: - response = self.api.start_kubernetes(kubernetes_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - - def test_cockroachdb(self): - options = gnomock.Options() - preset = gnomock.Cockroachdb(version="latest") - cockroachdb_request = gnomock.CockroachdbRequest(options=options, - preset=preset) - id = "" - - try: - response = self.api.start_cockroach_db(cockroachdb_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - - def test_influxdb(self): - options = gnomock.Options() - preset = gnomock.Influxdb(version="latest", username="python-user", - password="python-password", org="python-org", - bucket="python-bucket", auth_token="python-token") - influxdb_request = gnomock.InfluxdbRequest(options=options, - preset=preset) - id = "" - - try: - response = self.api.start_influx_db(influxdb_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - - def test_cassandra(self): - options = gnomock.Options(debug=True) - preset = gnomock.Cassandra(version="3") - cassandra_request = gnomock.CassandraRequest(options=options, - preset=preset) - id = "" - - try: - response = self.api.start_cassandra(cassandra_request) - id = response.id - self.assertEqual("127.0.0.1", response.host) - - finally: - if id != "": - stop_request = gnomock.StopRequest(id=id) - self.api.stop(stop_request) - - -### gnomock-generator - - -if __name__ == "__main__": - unittest.main() diff --git a/sdktest/python/test/testdata/mongo/testdb/items.jsonl b/sdktest/python/test/testdata/mongo/testdb/items.jsonl deleted file mode 100644 index 6d959030..00000000 --- a/sdktest/python/test/testdata/mongo/testdb/items.jsonl +++ /dev/null @@ -1 +0,0 @@ -{"foo": "bar"} diff --git a/sdktest/python/test/testdata/mssql/schema.sql b/sdktest/python/test/testdata/mssql/schema.sql deleted file mode 100644 index 3bde2c42..00000000 --- a/sdktest/python/test/testdata/mssql/schema.sql +++ /dev/null @@ -1,2 +0,0 @@ -create table foo(a int); -insert into foo(a) values (1), (2), (3); diff --git a/sdktest/python/test/testdata/mysql/schema.sql b/sdktest/python/test/testdata/mysql/schema.sql deleted file mode 100644 index 3bde2c42..00000000 --- a/sdktest/python/test/testdata/mysql/schema.sql +++ /dev/null @@ -1,2 +0,0 @@ -create table foo(a int); -insert into foo(a) values (1), (2), (3); diff --git a/sdktest/python/test/testdata/postgres/schema.sql b/sdktest/python/test/testdata/postgres/schema.sql deleted file mode 100644 index 3bde2c42..00000000 --- a/sdktest/python/test/testdata/postgres/schema.sql +++ /dev/null @@ -1,2 +0,0 @@ -create table foo(a int); -insert into foo(a) values (1), (2), (3); diff --git a/sdktest/python/test/testdata/rabbitmq/messages.jsonl b/sdktest/python/test/testdata/rabbitmq/messages.jsonl deleted file mode 100644 index 16b0854e..00000000 --- a/sdktest/python/test/testdata/rabbitmq/messages.jsonl +++ /dev/null @@ -1,3 +0,0 @@ -{ "queue": "events", "content_type": "text/plain", "string_body": "something else" } -{ "queue": "alerts", "content_type": "text/plain", "string_body": "memory pressure" } -{ "queue": "alerts", "content_type": "text/binary", "body": "Z25vbW9jaw==" } diff --git a/sdktest/python/test/testdata/splunk/events.jsonl b/sdktest/python/test/testdata/splunk/events.jsonl deleted file mode 100644 index 2f2c1706..00000000 --- a/sdktest/python/test/testdata/splunk/events.jsonl +++ /dev/null @@ -1 +0,0 @@ -{"index":"some_index","source":"app","sourcetype":"http","time":1588610745,"event":"this is a test"} diff --git a/sdktest/sdk_test.go b/sdktest/sdk_test.go deleted file mode 100644 index 2a5b1117..00000000 --- a/sdktest/sdk_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package sdktest - -import ( - "context" - "net/http" - "os" - "os/exec" - "testing" - - "github.com/orlangure/gnomock/internal/gnomockd" - "github.com/stretchr/testify/require" -) - -func TestMain(m *testing.M) { - os.Exit(testMain(m)) -} - -func testMain(m *testing.M) int { - srv := http.Server{ - Addr: "127.0.0.1:23042", - Handler: gnomockd.Handler(), - } - - defer func() { - _ = srv.Shutdown(context.Background()) - }() - - go func() { - _ = srv.ListenAndServe() - }() - - return m.Run() -} - -func TestPython(t *testing.T) { - t.Parallel() - - require.NoError(t, os.Chdir("./python")) - - cmd := exec.Command("/bin/bash", "./run.sh") - out, err := cmd.CombinedOutput() - require.NoErrorf(t, err, "got error with output: %s", string(out)) -} diff --git a/swagger/bin/generate-python.sh b/swagger/bin/generate-python.sh deleted file mode 100755 index 7679f072..00000000 --- a/swagger/bin/generate-python.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -set -e - -docker run --rm \ - -v ${PWD}:/local openapitools/openapi-generator-cli:v4.3.1 generate \ - -i /local/swagger/swagger.yaml \ - -g python \ - -o /local/sdktest/python/gnomock \ - -c /local/swagger/config/python.yaml \ - --git-user-id orlangure \ - --git-repo-id gnomock-python-sdk diff --git a/swagger/config/python.yaml b/swagger/config/python.yaml deleted file mode 100644 index 85c50655..00000000 --- a/swagger/config/python.yaml +++ /dev/null @@ -1,4 +0,0 @@ -projectName: gnomock-python-sdk -projectUrl: https://github.com/orlangure/gnomock -packageName: gnomock -packageVersion: 1.20.0