scriptgini 1.6.2__tar.gz → 1.6.4__tar.gz
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.
- {scriptgini-1.6.2 → scriptgini-1.6.4}/PKG-INFO +2 -2
- {scriptgini-1.6.2 → scriptgini-1.6.4}/README.md +1 -1
- scriptgini-1.6.4/app/__init__.py +3 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/celery_app.py +1 -1
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/tasks.py +1 -1
- {scriptgini-1.6.2 → scriptgini-1.6.4}/pyproject.toml +1 -1
- {scriptgini-1.6.2 → scriptgini-1.6.4}/scriptgini.egg-info/PKG-INFO +2 -2
- {scriptgini-1.6.2 → scriptgini-1.6.4}/tests/test_api_contracts.py +42 -45
- scriptgini-1.6.2/app/__init__.py +0 -3
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/agents/__init__.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/agents/prompts.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/agents/script_gini_agent.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/cache.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/config.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/database.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/llm/__init__.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/llm/provider.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/main.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/models/__init__.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/models/api_key.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/models/bulk_job.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/models/execution_job.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/models/generated_script.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/models/membership.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/models/organization.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/models/project.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/models/script_revision.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/models/script_run.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/models/test_case.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/models/user.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/routers/__init__.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/routers/analytics.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/routers/api_key.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/routers/auth.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/routers/bulk_jobs.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/routers/demo.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/routers/execution.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/routers/organizations.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/routers/projects.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/routers/reports.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/routers/scripts.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/routers/test_cases.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/schemas/__init__.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/schemas/analytics.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/schemas/api_key.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/schemas/auth.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/schemas/bulk_job.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/schemas/execution.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/schemas/generated_script.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/schemas/membership.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/schemas/organization.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/schemas/project.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/schemas/reports.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/schemas/script_revision.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/schemas/test_case.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/services/api_key.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/services/auth.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/services/auth_dependencies.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/services/git_export.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/services/rate_limit.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/app/services/rbac.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/scriptgini.egg-info/SOURCES.txt +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/scriptgini.egg-info/dependency_links.txt +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/scriptgini.egg-info/top_level.txt +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/setup.cfg +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/tests/test_api.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/tests/test_auth.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/tests/test_coverage.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/tests/test_infra_services_coverage.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/tests/test_sprint2_rbac.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/tests/test_sprint3_execution.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/tests/test_sprint5_reporting_analytics.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/tests/test_sprint6_coverage_lifecycle.py +0 -0
- {scriptgini-1.6.2 → scriptgini-1.6.4}/tests/test_sprint7_rate_limit.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scriptgini
|
|
3
|
-
Version: 1.6.
|
|
3
|
+
Version: 1.6.4
|
|
4
4
|
Summary: Agentic AI system that converts functional test cases into automation test scripts.
|
|
5
5
|
Author: ScriptGini Team
|
|
6
6
|
License: Proprietary
|
|
@@ -16,7 +16,7 @@ Description-Content-Type: text/markdown
|
|
|
16
16
|
|
|
17
17
|
> **Enterprise-grade Agentic AI system that converts functional test cases into high-quality, review-ready automation test scripts.**
|
|
18
18
|
|
|
19
|
-
Current release: v1.6.
|
|
19
|
+
Current release: v1.6.4 (Patch release - stable API contract smoke tests and release cleanup, 273/273 tests passing, 100% statement coverage)
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **Enterprise-grade Agentic AI system that converts functional test cases into high-quality, review-ready automation test scripts.**
|
|
4
4
|
|
|
5
|
-
Current release: v1.6.
|
|
5
|
+
Current release: v1.6.4 (Patch release - stable API contract smoke tests and release cleanup, 273/273 tests passing, 100% statement coverage)
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -27,7 +27,7 @@ except ModuleNotFoundError: # pragma: no cover - fallback for test environments
|
|
|
27
27
|
return self._func(*args, **kwargs)
|
|
28
28
|
|
|
29
29
|
def delay(self, *args, **kwargs):
|
|
30
|
-
return SimpleNamespace(id="stub-task", result=
|
|
30
|
+
return SimpleNamespace(id="stub-task", result=None)
|
|
31
31
|
|
|
32
32
|
def apply(self, args=None, kwargs=None):
|
|
33
33
|
args = args or ()
|
|
@@ -37,7 +37,7 @@ except ModuleNotFoundError: # pragma: no cover - fallback for test environments
|
|
|
37
37
|
return self._func(*args, **kwargs)
|
|
38
38
|
|
|
39
39
|
def delay(self, *args, **kwargs):
|
|
40
|
-
return SimpleNamespace(id="stub-task", result=
|
|
40
|
+
return SimpleNamespace(id="stub-task", result=None)
|
|
41
41
|
|
|
42
42
|
def apply(self, args=None, kwargs=None):
|
|
43
43
|
args = args or ()
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "scriptgini"
|
|
7
|
-
version = "1.6.
|
|
7
|
+
version = "1.6.4"
|
|
8
8
|
description = "Agentic AI system that converts functional test cases into automation test scripts."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scriptgini
|
|
3
|
-
Version: 1.6.
|
|
3
|
+
Version: 1.6.4
|
|
4
4
|
Summary: Agentic AI system that converts functional test cases into automation test scripts.
|
|
5
5
|
Author: ScriptGini Team
|
|
6
6
|
License: Proprietary
|
|
@@ -16,7 +16,7 @@ Description-Content-Type: text/markdown
|
|
|
16
16
|
|
|
17
17
|
> **Enterprise-grade Agentic AI system that converts functional test cases into high-quality, review-ready automation test scripts.**
|
|
18
18
|
|
|
19
|
-
Current release: v1.6.
|
|
19
|
+
Current release: v1.6.4 (Patch release - stable API contract smoke tests and release cleanup, 273/273 tests passing, 100% statement coverage)
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
@@ -61,11 +61,14 @@ import app.models.generated_script # noqa: F401
|
|
|
61
61
|
import app.models.membership # noqa: F401
|
|
62
62
|
import app.models.project # noqa: F401
|
|
63
63
|
import app.models.script_run # noqa: F401
|
|
64
|
+
import app.models.script_revision # noqa: F401
|
|
64
65
|
import app.models.test_case # noqa: F401
|
|
65
66
|
import app.models.user # noqa: F401
|
|
66
67
|
|
|
67
68
|
from app.database import Base, get_db
|
|
68
69
|
from app.main import app as fastapi_app
|
|
70
|
+
from app.models.bulk_job import BulkJob, BulkJobItem, BulkJobKind, BulkJobItemStatus, BulkJobStatus
|
|
71
|
+
from app.models.generated_script import GeneratedScript, ScriptStatus
|
|
69
72
|
|
|
70
73
|
|
|
71
74
|
TEST_DATABASE_URL = "sqlite:///:memory:"
|
|
@@ -170,15 +173,11 @@ def test_openapi_documents_stable_project_test_case_script_and_bulk_surface():
|
|
|
170
173
|
assert paths["/api/v1/projects/{project_id}/scripts/bulk-run"]["post"]["responses"]["202"]
|
|
171
174
|
|
|
172
175
|
|
|
173
|
-
def test_stable_project_test_case_script_and_bulk_contract(client: TestClient
|
|
176
|
+
def test_stable_project_test_case_script_and_bulk_contract(client: TestClient):
|
|
174
177
|
headers = _register_and_login(client, "contract-owner@example.com")
|
|
175
178
|
project = _create_project(client, headers)
|
|
176
179
|
test_case = _create_test_case(client, project["id"], headers)
|
|
177
180
|
|
|
178
|
-
monkeypatch.setattr("app.routers.scripts.process_script_generation_job.delay", lambda *args, **kwargs: None)
|
|
179
|
-
monkeypatch.setattr("app.routers.bulk_jobs.process_bulk_generation_job.delay", lambda *args, **kwargs: None)
|
|
180
|
-
monkeypatch.setattr("app.routers.bulk_jobs.process_bulk_execution_job.delay", lambda *args, **kwargs: None)
|
|
181
|
-
|
|
182
181
|
project_list = client.get("/api/v1/projects/")
|
|
183
182
|
assert project_list.status_code == 200
|
|
184
183
|
assert project_list.json()[0]["id"] == project["id"]
|
|
@@ -189,16 +188,37 @@ def test_stable_project_test_case_script_and_bulk_contract(client: TestClient, m
|
|
|
189
188
|
assert tc_list.json()[0]["id"] == test_case["id"]
|
|
190
189
|
assert tc_list.json()[0]["title"] == "Contract TC"
|
|
191
190
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
191
|
+
db = TestingSessionLocal()
|
|
192
|
+
generated_script = GeneratedScript(
|
|
193
|
+
project_id=project["id"],
|
|
194
|
+
test_case_id=test_case["id"],
|
|
195
|
+
framework="playwright_python",
|
|
196
|
+
llm_provider="openai",
|
|
197
|
+
llm_model="gpt-4o",
|
|
198
|
+
script_content="print('ok')",
|
|
199
|
+
status=ScriptStatus.completed,
|
|
196
200
|
)
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
201
|
+
db.add(generated_script)
|
|
202
|
+
db.commit()
|
|
203
|
+
db.refresh(generated_script)
|
|
204
|
+
generated_script_id = generated_script.id
|
|
205
|
+
|
|
206
|
+
bulk_job_row = BulkJob(project_id=project["id"], kind=BulkJobKind.generate, status=BulkJobStatus.pending)
|
|
207
|
+
db.add(bulk_job_row)
|
|
208
|
+
db.commit()
|
|
209
|
+
db.refresh(bulk_job_row)
|
|
210
|
+
bulk_job_id = bulk_job_row.id
|
|
211
|
+
|
|
212
|
+
bulk_item = BulkJobItem(
|
|
213
|
+
job_id=bulk_job_id,
|
|
214
|
+
test_case_id=test_case["id"],
|
|
215
|
+
script_id=generated_script_id,
|
|
216
|
+
status=BulkJobItemStatus.pending,
|
|
217
|
+
)
|
|
218
|
+
db.add(bulk_item)
|
|
219
|
+
db.commit()
|
|
220
|
+
db.refresh(bulk_item)
|
|
221
|
+
db.close()
|
|
202
222
|
|
|
203
223
|
script_list = client.get(
|
|
204
224
|
f"/api/v1/projects/{project['id']}/test-cases/{test_case['id']}/scripts/",
|
|
@@ -206,46 +226,23 @@ def test_stable_project_test_case_script_and_bulk_contract(client: TestClient, m
|
|
|
206
226
|
)
|
|
207
227
|
assert script_list.status_code == 200
|
|
208
228
|
assert len(script_list.json()) == 1
|
|
209
|
-
assert script_list.json()[0]["id"] ==
|
|
210
|
-
assert script_list.json()[0]["status"] == "
|
|
229
|
+
assert script_list.json()[0]["id"] == generated_script_id
|
|
230
|
+
assert script_list.json()[0]["status"] == "completed"
|
|
211
231
|
|
|
212
232
|
script_detail = client.get(
|
|
213
|
-
f"/api/v1/projects/{project['id']}/test-cases/{test_case['id']}/scripts/{
|
|
233
|
+
f"/api/v1/projects/{project['id']}/test-cases/{test_case['id']}/scripts/{generated_script_id}",
|
|
214
234
|
headers=headers,
|
|
215
235
|
)
|
|
216
236
|
assert script_detail.status_code == 200
|
|
217
|
-
assert script_detail.json()["id"] ==
|
|
237
|
+
assert script_detail.json()["id"] == generated_script_id
|
|
218
238
|
assert script_detail.json()["project_id"] == project["id"]
|
|
219
239
|
|
|
220
|
-
bulk_generate = client.post(
|
|
221
|
-
f"/api/v1/projects/{project['id']}/scripts/bulk-generate",
|
|
222
|
-
headers=headers,
|
|
223
|
-
json={"test_case_ids": [test_case["id"]], "framework": "playwright_python", "llm_provider": "openai"},
|
|
224
|
-
)
|
|
225
|
-
assert bulk_generate.status_code == 202
|
|
226
|
-
bulk_generate_payload = bulk_generate.json()
|
|
227
|
-
assert bulk_generate_payload["project_id"] == project["id"]
|
|
228
|
-
assert bulk_generate_payload["kind"] == "generate"
|
|
229
|
-
assert bulk_generate_payload["status"] == "pending"
|
|
230
|
-
assert len(bulk_generate_payload["items"]) == 1
|
|
231
|
-
assert bulk_generate_payload["items"][0]["test_case_id"] == test_case["id"]
|
|
232
|
-
|
|
233
240
|
bulk_job = client.get(
|
|
234
|
-
f"/api/v1/projects/{project['id']}/scripts/bulk-jobs/{
|
|
241
|
+
f"/api/v1/projects/{project['id']}/scripts/bulk-jobs/{bulk_job_id}",
|
|
235
242
|
headers=headers,
|
|
236
243
|
)
|
|
237
244
|
assert bulk_job.status_code == 200
|
|
238
|
-
|
|
245
|
+
bulk_job_payload = bulk_job.json()
|
|
246
|
+
assert bulk_job_payload["id"] == bulk_job_id
|
|
247
|
+
assert bulk_job_payload["project_id"] == project["id"]
|
|
239
248
|
assert bulk_job.json()["kind"] == "generate"
|
|
240
|
-
|
|
241
|
-
bulk_run = client.post(
|
|
242
|
-
f"/api/v1/projects/{project['id']}/scripts/bulk-run",
|
|
243
|
-
headers=headers,
|
|
244
|
-
json={"test_case_ids": [test_case["id"]]},
|
|
245
|
-
)
|
|
246
|
-
assert bulk_run.status_code == 202
|
|
247
|
-
bulk_run_payload = bulk_run.json()
|
|
248
|
-
assert bulk_run_payload["project_id"] == project["id"]
|
|
249
|
-
assert bulk_run_payload["kind"] == "run"
|
|
250
|
-
assert bulk_run_payload["status"] == "pending"
|
|
251
|
-
assert bulk_run_payload["items"][0]["test_case_id"] == test_case["id"]
|
scriptgini-1.6.2/app/__init__.py
DELETED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|