diff --git a/README.md b/README.md index e6a6def..c6c336b 100644 --- a/README.md +++ b/README.md @@ -31,12 +31,14 @@ pip install -U autocode-py 2. Prepare software to be processed as in the [`./example/client`](https://github.com/muazhari/autocode/tree/main/example/client) folder. 3. Prepare deployment as in the [`./example/client/docker-compose.yml`](https://github.com/muazhari/autocode/blob/main/example/client/docker-compose.yml) file. 4. Prepare controller as in the [`./example/controller.ipynb`](https://github.com/muazhari/autocode/blob/main/example/controller.ipynb) file. -5. Instantiate `optimization` and execute `optimization.deploy()` in controller. +5. Instantiate `optimization` then execute `optimization.deploy()` in controller. 6. Open dashboard in `http://localhost:{dashboard_port}/` to see the process in real-time. 7. Wait until all client are ready (need to wait for long time because the libraries need to be re-downloaded for each client). 8. Execute `optimization.run()` in controller. 9. Wait until the run is finished. 10. Analyze and decide the best values. +11. Execute `optimization.reset(keys=["clients"])` then `optimization.deploy()` to apply different client states. +12. Try to execute `optimization.reset()` to totally reset the tool if needed (i.e. data inconsistency). ## Demo diff --git a/autocode/__init__.py b/autocode/__init__.py index 6130bc9..98632d5 100644 --- a/autocode/__init__.py +++ b/autocode/__init__.py @@ -2,7 +2,7 @@ import sys from http import HTTPStatus from multiprocessing import Process -from typing import Callable, Any, Dict, List +from typing import Callable, Any, Dict, List, Literal, Optional import ray import uvicorn @@ -110,14 +110,16 @@ def stop(self): self.server.terminate() ray.shutdown() - def reset(self): + def reset(self, keys: Optional[List[Literal["docker_clients", "clients", "objectives", "results"]]] = None): optimization_use_case: OptimizationUseCase = self.application_container.use_cases.optimization() - optimization_use_case.reset() + optimization_use_case.reset( + keys=keys + ) def deploy(self, compose_files: List[str]) -> List[DockerClient]: optimization_use_case: OptimizationUseCase = self.application_container.use_cases.optimization() return optimization_use_case.deploy( - compose_files=compose_files + compose_files=compose_files, ) def run( diff --git a/autocode/use_case.py b/autocode/use_case.py index bbb8bf2..35db013 100644 --- a/autocode/use_case.py +++ b/autocode/use_case.py @@ -3,12 +3,11 @@ import re import uuid from multiprocessing import Lock -from typing import Dict, List, Callable, Any, Coroutine, Optional +from typing import Dict, List, Callable, Any, Coroutine, Optional, Literal import dill import numpy as np import ray -import sqlalchemy.exc from langchain_core.output_parsers import PydanticToolsParser from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate from langchain_core.runnables import RunnableSerializable @@ -504,6 +503,7 @@ def deploy(self, compose_files: List[str]) -> List[DockerClient]: session.begin() session.exec(delete(Cache).where(Cache.key.startswith("results"))) session.exec(delete(Cache).where(Cache.key == "objectives")) + client_caches: List[Cache] = list(session.exec(select(Cache).where(Cache.key.startswith("clients"))).all()) docker_clients: List[DockerClient] = [] @@ -571,19 +571,31 @@ def deploy(self, compose_files: List[str]) -> List[DockerClient]: return docker_clients - def reset(self): + def reset(self, keys: Optional[List[Literal["docker_clients", "clients", "objectives", "results"]]] = None): session: Session = self.one_datastore.get_session() session.begin() - try: - docker_client_caches = list(session.exec(select(Cache).where(Cache.key.startswith("docker_clients"))).all()) - for docker_client_cache in docker_client_caches: - docker_client: DockerClient = dill.loads(docker_client_cache.value) - docker_client.compose.down() - except sqlalchemy.exc.OperationalError: - pass + if keys is None: + SQLModel.metadata.drop_all(self.one_datastore.engine) + SQLModel.metadata.create_all(self.one_datastore.engine) + else: + if "docker_clients" in keys: + docker_client_caches = list( + session.exec(select(Cache).where(Cache.key.startswith("docker_clients"))).all() + ) + for docker_client_cache in docker_client_caches: + docker_client: DockerClient = dill.loads(docker_client_cache.value) + docker_client.compose.down() + session.delete(docker_client_cache) + + if "clients" in keys: + session.exec(delete(Cache).where(Cache.key.startswith("clients"))) + + if "objectives" in keys: + session.exec(delete(Cache).where(Cache.key == "objectives")) + + if "results" in keys: + session.exec(delete(Cache).where(Cache.key.startswith("results"))) - SQLModel.metadata.drop_all(self.one_datastore.engine) - SQLModel.metadata.create_all(self.one_datastore.engine) session.commit() session.close() diff --git a/example/controller.ipynb b/example/controller.ipynb index 6c86ecf..e934f99 100644 --- a/example/controller.ipynb +++ b/example/controller.ipynb @@ -3,8 +3,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2024-08-07T11:31:43.001353Z", - "start_time": "2024-08-07T11:31:37.824723Z" + "end_time": "2024-08-07T15:06:05.794800Z", + "start_time": "2024-08-07T15:06:01.891442Z" } }, "cell_type": "code", @@ -25,14 +25,14 @@ "name": "stderr", "output_type": "stream", "text": [ - "2024-08-07 18:31:42,454\tINFO worker.py:1743 -- Started a local Ray instance. View the dashboard at \u001B[1m\u001B[32mhttp://172.25.4.192:8265 \u001B[39m\u001B[22m\n" + "2024-08-07 22:06:05,402\tINFO worker.py:1772 -- Started a local Ray instance. View the dashboard at \u001B[1m\u001B[32mhttp://172.25.4.192:8265 \u001B[39m\u001B[22m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Available resources: {'accelerator_type:G': 1.0, 'node:__internal_head__': 1.0, 'node:172.25.4.192': 1.0, 'CPU': 12.0, 'memory': 9207683483.0, 'object_store_memory': 4603841740.0, 'GPU': 1.0}\n", + "Available resources: {'accelerator_type:G': 1.0, 'node:__internal_head__': 1.0, 'node:172.25.4.192': 1.0, 'CPU': 2.0, 'object_store_memory': 4452416716.0, 'memory': 8904833435.0, 'GPU': 1.0}\n", "Server is healthy.\n" ] } @@ -42,8 +42,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2024-08-07T14:31:18.035304Z", - "start_time": "2024-08-07T14:30:04.597839Z" + "end_time": "2024-08-07T15:06:05.806341Z", + "start_time": "2024-08-07T15:06:05.796879Z" } }, "cell_type": "code", @@ -51,366 +51,14 @@ "from python_on_whales import DockerClient\n", "from typing import List\n", "\n", + "optimization.reset(keys=[\"clients\"])\n", "docker_clients: List[DockerClient] = optimization.deploy(\n", " compose_files=[\"./client/docker-compose.yml\"],\n", ")" ], "id": "303433e5ea06bdd4", - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "#0 building with \"default\" instance using docker driver\n", - "\n", - "#1 [app-product internal] load build definition from .Dockerfile\n", - "#1 transferring dockerfile: 119B 0.0s done\n", - "#1 DONE 0.0s\n", - "\n", - "#2 [app-account internal] load build definition from .Dockerfile\n", - "#2 transferring dockerfile: 119B 0.0s done\n", - "#2 DONE 0.0s\n", - "\n", - "#3 [app-gateway internal] load build definition from .Dockerfile\n", - "#3 transferring dockerfile: 119B 0.0s done\n", - "#3 DONE 0.0s\n", - "\n", - "#4 [app-gateway internal] load metadata for docker.io/library/golang:latest\n", - "#4 DONE 1.9s\n", - "\n", - "#5 [app-gateway internal] load .dockerignore\n", - "#5 transferring context: 2B done\n", - "#5 DONE 0.0s\n", - "\n", - "#6 [app-account internal] load .dockerignore\n", - "#6 transferring context: 2B done\n", - "#6 DONE 0.0s\n", - "\n", - "#7 [app-product internal] load .dockerignore\n", - "#7 transferring context: 2B 0.0s done\n", - "#7 DONE 0.0s\n", - "\n", - "#8 [app-account 1/5] FROM docker.io/library/golang:latest@sha256:2bd56f00ff47baf33e64eae7996b65846c7cb5e0a46e0a882ef179fd89654afa\n", - "#8 DONE 0.0s\n", - "\n", - "#9 [app-gateway internal] load build context\n", - "#9 transferring context: 5.04kB 0.0s done\n", - "#9 DONE 0.0s\n", - "\n", - "#10 [app-account internal] load build context\n", - "#10 transferring context: 5.06kB 0.0s done\n", - "#10 DONE 0.0s\n", - "\n", - "#11 [app-account 2/5] WORKDIR /workdir\n", - "#11 CACHED\n", - "\n", - "#12 [app-product internal] load build context\n", - "#12 transferring context: 5.06kB 0.0s done\n", - "#12 DONE 0.0s\n", - "\n", - "#13 [app-gateway 3/5] COPY . .\n", - "#13 DONE 0.0s\n", - "\n", - "#14 [app-account 3/5] COPY . .\n", - "#14 DONE 0.0s\n", - "\n", - "#15 [app-product 3/5] COPY . .\n", - "#15 DONE 0.0s\n", - "\n", - "#16 [app-account 4/5] RUN go mod tidy\n", - "#16 0.504 go: downloading github.com/stretchr/testify v1.9.0\n", - "#16 0.505 go: downloading github.com/gorilla/mux v1.8.1\n", - "#16 0.508 go: downloading github.com/muazhari/autocode-go v0.0.0-20240807125218-6ca4153954b7\n", - "#16 0.944 go: downloading github.com/muazhari/gomacro-custom v0.0.0-20240731093833-a6136ef7aaa6\n", - "#16 0.944 go: downloading github.com/google/uuid v1.6.0\n", - "#16 0.944 go: downloading github.com/valyala/fasthttp v1.55.0\n", - "#16 1.056 go: downloading gopkg.in/yaml.v3 v3.0.1\n", - "#16 1.056 go: downloading github.com/davecgh/go-spew v1.1.1\n", - "#16 1.056 go: downloading github.com/pmezard/go-difflib v1.0.0\n", - "#16 ...\n", - "\n", - "#17 [app-product 4/5] RUN go mod tidy\n", - "#17 0.502 go: downloading github.com/stretchr/testify v1.9.0\n", - "#17 0.504 go: downloading github.com/gorilla/mux v1.8.1\n", - "#17 0.505 go: downloading github.com/muazhari/autocode-go v0.0.0-20240807125218-6ca4153954b7\n", - "#17 0.963 go: downloading gopkg.in/yaml.v3 v3.0.1\n", - "#17 0.963 go: downloading github.com/davecgh/go-spew v1.1.1\n", - "#17 0.964 go: downloading github.com/pmezard/go-difflib v1.0.0\n", - "#17 0.964 go: downloading github.com/google/uuid v1.6.0\n", - "#17 0.964 go: downloading github.com/valyala/fasthttp v1.55.0\n", - "#17 0.964 go: downloading github.com/muazhari/gomacro-custom v0.0.0-20240731093833-a6136ef7aaa6\n", - "#17 5.221 go: downloading github.com/klauspost/compress v1.17.9\n", - "#17 5.221 go: downloading github.com/andybalholm/brotli v1.1.0\n", - "#17 5.221 go: downloading github.com/valyala/bytebufferpool v1.0.0\n", - "#17 6.088 go: downloading gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405\n", - "#17 ...\n", - "\n", - "#16 [app-account 4/5] RUN go mod tidy\n", - "#16 8.155 go: downloading github.com/klauspost/compress v1.17.9\n", - "#16 8.155 go: downloading github.com/andybalholm/brotli v1.1.0\n", - "#16 8.155 go: downloading github.com/valyala/bytebufferpool v1.0.0\n", - "#16 8.900 go: downloading gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405\n", - "#16 ...\n", - "\n", - "#18 [app-gateway 4/5] RUN go mod tidy\n", - "#18 0.506 go: downloading github.com/gorilla/mux v1.8.1\n", - "#18 0.506 go: downloading github.com/muazhari/autocode-go v0.0.0-20240807125218-6ca4153954b7\n", - "#18 0.507 go: downloading github.com/stretchr/testify v1.9.0\n", - "#18 1.040 go: downloading github.com/valyala/fasthttp v1.55.0\n", - "#18 1.040 go: downloading github.com/muazhari/gomacro-custom v0.0.0-20240731093833-a6136ef7aaa6\n", - "#18 1.041 go: downloading github.com/google/uuid v1.6.0\n", - "#18 1.178 go: downloading github.com/davecgh/go-spew v1.1.1\n", - "#18 1.178 go: downloading gopkg.in/yaml.v3 v3.0.1\n", - "#18 1.178 go: downloading github.com/pmezard/go-difflib v1.0.0\n", - "#18 8.407 go: downloading github.com/andybalholm/brotli v1.1.0\n", - "#18 8.408 go: downloading github.com/klauspost/compress v1.17.9\n", - "#18 8.408 go: downloading github.com/valyala/bytebufferpool v1.0.0\n", - "#18 10.06 go: downloading gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405\n", - "#18 11.98 go: downloading golang.org/x/tools v0.14.0\n", - "#18 11.98 go: downloading github.com/peterh/liner v1.2.2\n", - "#18 11.98 go: downloading github.com/mattn/go-runewidth v0.0.15\n", - "#18 ...\n", - "\n", - "#17 [app-product 4/5] RUN go mod tidy\n", - "#17 13.31 go: downloading github.com/peterh/liner v1.2.2\n", - "#17 13.31 go: downloading golang.org/x/tools v0.14.0\n", - "#17 13.32 go: downloading github.com/mattn/go-runewidth v0.0.15\n", - "#17 13.40 go: downloading golang.org/x/sys v0.21.0\n", - "#17 13.44 go: downloading github.com/rivo/uniseg v0.2.0\n", - "#17 ...\n", - "\n", - "#16 [app-account 4/5] RUN go mod tidy\n", - "#16 18.40 go: downloading golang.org/x/tools v0.14.0\n", - "#16 18.41 go: downloading github.com/peterh/liner v1.2.2\n", - "#16 18.41 go: downloading github.com/mattn/go-runewidth v0.0.15\n", - "#16 21.93 go: downloading golang.org/x/sys v0.21.0\n", - "#16 21.97 go: downloading github.com/rivo/uniseg v0.2.0\n", - "#16 ...\n", - "\n", - "#18 [app-gateway 4/5] RUN go mod tidy\n", - "#18 16.49 go: downloading golang.org/x/sys v0.21.0\n", - "#18 16.68 go: downloading github.com/rivo/uniseg v0.2.0\n", - "#18 ...\n", - "\n", - "#17 [app-product 4/5] RUN go mod tidy\n", - "#17 26.49 go: downloading golang.org/x/mod v0.13.0\n", - "#17 26.49 go: downloading golang.org/x/sync v0.4.0\n", - "#17 ...\n", - "\n", - "#16 [app-account 4/5] RUN go mod tidy\n", - "#16 32.03 go: downloading golang.org/x/mod v0.13.0\n", - "#16 32.03 go: downloading golang.org/x/sync v0.4.0\n", - "#16 ...\n", - "\n", - "#18 [app-gateway 4/5] RUN go mod tidy\n", - "#18 32.68 go: downloading golang.org/x/mod v0.13.0\n", - "#18 32.68 go: downloading golang.org/x/sync v0.4.0\n", - "#18 ...\n", - "\n", - "#17 [app-product 4/5] RUN go mod tidy\n", - "#17 DONE 60.9s\n", - "\n", - "#19 [app-product 5/5] RUN go get ./...\n", - "#19 DONE 1.4s\n", - "\n", - "#18 [app-gateway 4/5] RUN go mod tidy\n", - "#18 ...\n", - "\n", - "#20 [app-product] exporting to image\n", - "#20 exporting layers\n", - "#20 exporting layers 0.4s done\n", - "#20 writing image sha256:4482d7e68dc4e3ff889e1dc560a814e47dda3ac7c10805bbdb815c92f9f3f9ef done\n", - "#20 naming to docker.io/muazhari/autocode-example-app-product:latest done\n", - "#20 DONE 0.4s\n", - "\n", - "#21 [app-product] resolving provenance for metadata file\n", - "#21 DONE 0.0s\n", - "\n", - "#18 [app-gateway 4/5] RUN go mod tidy\n", - "#18 DONE 63.8s\n", - "\n", - "#16 [app-account 4/5] RUN go mod tidy\n", - "#16 ...\n", - "\n", - "#22 [app-gateway 5/5] RUN go get ./...\n", - "#22 DONE 0.8s\n", - "\n", - "#16 [app-account 4/5] RUN go mod tidy\n", - "#16 ...\n", - "\n", - "#23 [app-gateway] exporting to image\n", - "#23 exporting layers 0.4s done\n", - "#23 writing image sha256:bb4698dc73e6f0b18e2432d43a1aeee80fbb262702c2fdaa45c6e5923c3c431a done\n", - "#23 naming to docker.io/muazhari/autocode-example-app-gateway:latest done\n", - "#23 DONE 0.4s\n", - "\n", - "#24 [app-gateway] resolving provenance for metadata file\n", - "#24 DONE 0.0s\n", - "\n", - "#16 [app-account 4/5] RUN go mod tidy\n", - "#16 DONE 65.5s\n", - "\n", - "#25 [app-account 5/5] RUN go get ./...\n", - "#25 DONE 0.6s\n", - "\n", - "#26 [app-account] exporting to image\n", - "#26 exporting layers 0.3s done\n", - "#26 writing image sha256:9431857543db398269e173d840e28a9f0ac3a665cba76798340965e0bb336987 done\n", - "#26 naming to docker.io/muazhari/autocode-example-app-account:latest done\n", - "#26 DONE 0.3s\n", - "\n", - "#27 [app-account] resolving provenance for metadata file\n", - "#27 DONE 0.0s\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " Network autocode-worker-0_default Creating\n", - " Network autocode-worker-0_default Created\n", - " Container autocode-worker-0-app-account-1 Creating\n", - " Container autocode-worker-0-app-gateway-1 Creating\n", - " Container autocode-worker-0-app-product-1 Creating\n", - " Container autocode-worker-0-app-account-1 Created\n", - " Container autocode-worker-0-app-product-1 Created\n", - " Container autocode-worker-0-app-gateway-1 Created\n", - " Container autocode-worker-0-app-product-1 Starting\n", - " Container autocode-worker-0-app-gateway-1 Starting\n", - " Container autocode-worker-0-app-account-1 Starting\n", - " Container autocode-worker-0-app-product-1 Started\n", - " Container autocode-worker-0-app-account-1 Started\n", - " Container autocode-worker-0-app-gateway-1 Started\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "#0 building with \"default\" instance using docker driver\n", - "\n", - "#1 [app-gateway internal] load build definition from .Dockerfile\n", - "#1 transferring dockerfile: 119B 0.0s done\n", - "#1 DONE 0.0s\n", - "\n", - "#2 [app-product internal] load build definition from .Dockerfile\n", - "#2 transferring dockerfile: 119B 0.0s done\n", - "#2 DONE 0.0s\n", - "\n", - "#3 [app-account internal] load build definition from .Dockerfile\n", - "#3 transferring dockerfile: 119B 0.0s done\n", - "#3 DONE 0.0s\n", - "\n", - "#4 [app-account internal] load metadata for docker.io/library/golang:latest\n", - "#4 DONE 1.2s\n", - "\n", - "#5 [app-product internal] load .dockerignore\n", - "#5 transferring context: 2B 0.0s done\n", - "#5 DONE 0.0s\n", - "\n", - "#6 [app-gateway 1/5] FROM docker.io/library/golang:latest@sha256:2bd56f00ff47baf33e64eae7996b65846c7cb5e0a46e0a882ef179fd89654afa\n", - "#6 DONE 0.0s\n", - "\n", - "#7 [app-account internal] load .dockerignore\n", - "#7 transferring context: 2B 0.0s done\n", - "#7 DONE 0.0s\n", - "\n", - "#8 [app-gateway internal] load .dockerignore\n", - "#8 transferring context: 2B 0.0s done\n", - "#8 DONE 0.0s\n", - "\n", - "#9 [app-gateway internal] load build context\n", - "#9 transferring context: 299B 0.0s done\n", - "#9 DONE 0.0s\n", - "\n", - "#10 [app-product internal] load build context\n", - "#10 transferring context: 335B 0.0s done\n", - "#10 DONE 0.0s\n", - "\n", - "#11 [app-account internal] load build context\n", - "#11 transferring context: 335B 0.0s done\n", - "#11 DONE 0.0s\n", - "\n", - "#12 [app-gateway 3/5] COPY . .\n", - "#12 CACHED\n", - "\n", - "#13 [app-gateway 4/5] RUN go mod tidy\n", - "#13 CACHED\n", - "\n", - "#14 [app-gateway 5/5] RUN go get ./...\n", - "#14 CACHED\n", - "\n", - "#15 [app-product 4/5] RUN go mod tidy\n", - "#15 CACHED\n", - "\n", - "#16 [app-product 3/5] COPY . .\n", - "#16 CACHED\n", - "\n", - "#17 [app-product 5/5] RUN go get ./...\n", - "#17 CACHED\n", - "\n", - "#18 [app-account 4/5] RUN go mod tidy\n", - "#18 CACHED\n", - "\n", - "#19 [app-product 2/5] WORKDIR /workdir\n", - "#19 CACHED\n", - "\n", - "#20 [app-account 3/5] COPY . .\n", - "#20 CACHED\n", - "\n", - "#21 [app-account 5/5] RUN go get ./...\n", - "#21 CACHED\n", - "\n", - "#22 [app-gateway] exporting to image\n", - "#22 exporting layers done\n", - "#22 writing image sha256:cd7ab7f9a7b66c181619a268695088e957b29b3dbb3bd774f04f5df304e73a40 done\n", - "#22 naming to docker.io/muazhari/autocode-example-app-gateway:latest done\n", - "#22 DONE 0.0s\n", - "\n", - "#23 [app-product] exporting to image\n", - "#23 exporting layers done\n", - "#23 writing image sha256:611728c1bf6d24cab8c134510c040f79c639a9049846dab0f7a8e63678272004 done\n", - "#23 naming to docker.io/muazhari/autocode-example-app-product:latest done\n", - "#23 DONE 0.0s\n", - "\n", - "#24 [app-account] exporting to image\n", - "#24 exporting layers done\n", - "#24 writing image sha256:b54cbf0aed71707492fe18d7afd50f640d672ae5302f544dab982e66d0fc84cf done\n", - "#24 naming to docker.io/muazhari/autocode-example-app-account:latest done\n", - "#24 DONE 0.0s\n", - "\n", - "#25 [app-product] resolving provenance for metadata file\n", - "#25 DONE 0.0s\n", - "\n", - "#26 [app-gateway] resolving provenance for metadata file\n", - "#26 DONE 0.0s\n", - "\n", - "#27 [app-account] resolving provenance for metadata file\n", - "#27 DONE 0.0s\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " Network autocode-worker-1_default Creating\n", - " Network autocode-worker-1_default Created\n", - " Container autocode-worker-1-app-account-1 Creating\n", - " Container autocode-worker-1-app-product-1 Creating\n", - " Container autocode-worker-1-app-gateway-1 Creating\n", - " Container autocode-worker-1-app-gateway-1 Created\n", - " Container autocode-worker-1-app-account-1 Created\n", - " Container autocode-worker-1-app-product-1 Created\n", - " Container autocode-worker-1-app-product-1 Starting\n", - " Container autocode-worker-1-app-gateway-1 Starting\n", - " Container autocode-worker-1-app-account-1 Starting\n", - " Container autocode-worker-1-app-gateway-1 Started\n", - " Container autocode-worker-1-app-product-1 Started\n", - " Container autocode-worker-1-app-account-1 Started\n" - ] - } - ], - "execution_count": 21 + "outputs": [], + "execution_count": 2 }, { "metadata": { diff --git a/setup.py b/setup.py index 5fe27e5..81343b2 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setup( name='autocode-py', - version='0.0.1.post8', + version='0.0.1.post9', author='muazhari', url='https://github.com/muazhari/autocode', description='autocode: Auto Code Improvement by Metrics Optimization.',