scriptgini 1.5.2__tar.gz → 1.5.3__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.
Files changed (71) hide show
  1. {scriptgini-1.5.2 → scriptgini-1.5.3}/PKG-INFO +2 -2
  2. {scriptgini-1.5.2 → scriptgini-1.5.3}/README.md +1 -1
  3. scriptgini-1.5.3/app/__init__.py +3 -0
  4. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/api_key.py +2 -0
  5. {scriptgini-1.5.2 → scriptgini-1.5.3}/pyproject.toml +1 -1
  6. {scriptgini-1.5.2 → scriptgini-1.5.3}/scriptgini.egg-info/PKG-INFO +2 -2
  7. {scriptgini-1.5.2 → scriptgini-1.5.3}/tests/test_auth.py +50 -0
  8. scriptgini-1.5.2/app/__init__.py +0 -3
  9. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/agents/__init__.py +0 -0
  10. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/agents/prompts.py +0 -0
  11. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/agents/script_gini_agent.py +0 -0
  12. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/cache.py +0 -0
  13. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/celery_app.py +0 -0
  14. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/config.py +0 -0
  15. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/database.py +0 -0
  16. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/llm/__init__.py +0 -0
  17. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/llm/provider.py +0 -0
  18. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/main.py +0 -0
  19. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/__init__.py +0 -0
  20. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/api_key.py +0 -0
  21. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/bulk_job.py +0 -0
  22. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/execution_job.py +0 -0
  23. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/generated_script.py +0 -0
  24. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/membership.py +0 -0
  25. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/organization.py +0 -0
  26. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/project.py +0 -0
  27. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/script_revision.py +0 -0
  28. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/script_run.py +0 -0
  29. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/test_case.py +0 -0
  30. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/models/user.py +0 -0
  31. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/__init__.py +0 -0
  32. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/analytics.py +0 -0
  33. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/auth.py +0 -0
  34. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/bulk_jobs.py +0 -0
  35. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/demo.py +0 -0
  36. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/execution.py +0 -0
  37. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/organizations.py +0 -0
  38. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/projects.py +0 -0
  39. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/reports.py +0 -0
  40. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/scripts.py +0 -0
  41. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/routers/test_cases.py +0 -0
  42. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/__init__.py +0 -0
  43. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/analytics.py +0 -0
  44. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/api_key.py +0 -0
  45. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/auth.py +0 -0
  46. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/bulk_job.py +0 -0
  47. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/execution.py +0 -0
  48. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/generated_script.py +0 -0
  49. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/membership.py +0 -0
  50. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/organization.py +0 -0
  51. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/project.py +0 -0
  52. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/reports.py +0 -0
  53. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/script_revision.py +0 -0
  54. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/schemas/test_case.py +0 -0
  55. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/services/api_key.py +0 -0
  56. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/services/auth.py +0 -0
  57. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/services/auth_dependencies.py +0 -0
  58. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/services/git_export.py +0 -0
  59. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/services/rbac.py +0 -0
  60. {scriptgini-1.5.2 → scriptgini-1.5.3}/app/tasks.py +0 -0
  61. {scriptgini-1.5.2 → scriptgini-1.5.3}/scriptgini.egg-info/SOURCES.txt +0 -0
  62. {scriptgini-1.5.2 → scriptgini-1.5.3}/scriptgini.egg-info/dependency_links.txt +0 -0
  63. {scriptgini-1.5.2 → scriptgini-1.5.3}/scriptgini.egg-info/top_level.txt +0 -0
  64. {scriptgini-1.5.2 → scriptgini-1.5.3}/setup.cfg +0 -0
  65. {scriptgini-1.5.2 → scriptgini-1.5.3}/tests/test_api.py +0 -0
  66. {scriptgini-1.5.2 → scriptgini-1.5.3}/tests/test_coverage.py +0 -0
  67. {scriptgini-1.5.2 → scriptgini-1.5.3}/tests/test_infra_services_coverage.py +0 -0
  68. {scriptgini-1.5.2 → scriptgini-1.5.3}/tests/test_sprint2_rbac.py +0 -0
  69. {scriptgini-1.5.2 → scriptgini-1.5.3}/tests/test_sprint3_execution.py +0 -0
  70. {scriptgini-1.5.2 → scriptgini-1.5.3}/tests/test_sprint5_reporting_analytics.py +0 -0
  71. {scriptgini-1.5.2 → scriptgini-1.5.3}/tests/test_sprint6_coverage_lifecycle.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scriptgini
3
- Version: 1.5.2
3
+ Version: 1.5.3
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.5.2 (Sprint 6 hardening + API key audit/revocation patch)
19
+ Current release: v1.5.3 (Sprint 6 complete - 100% test coverage and full audit logging hardening)
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.5.2 (Sprint 6 hardening + API key audit/revocation patch)
5
+ Current release: v1.5.3 (Sprint 6 complete - 100% test coverage and full audit logging hardening)
6
6
 
7
7
  ---
8
8
 
@@ -0,0 +1,3 @@
1
+ __version__ = "1.5.3"
2
+ __api_version__ = "v1.5.3"
3
+
@@ -118,6 +118,7 @@ def update_api_key(
118
118
 
119
119
  # Check that the key belongs to the current user
120
120
  if existing_key.user_id != current_user.id:
121
+ _audit_api_key_event("api_key_revoked", current_user.id, existing_key.id, existing_key.prefix, "forbidden")
121
122
  raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Not authorized to update this API key")
122
123
 
123
124
  api_key = api_key_service.update_api_key(
@@ -141,6 +142,7 @@ def delete_api_key(
141
142
  existing_key = api_key_service.get_api_key_by_id(db, key_id)
142
143
 
143
144
  if not existing_key:
145
+ _audit_api_key_event("api_key_revoked", current_user.id, key_id, None, "not_found")
144
146
  raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="API key not found")
145
147
 
146
148
  # Check that the key belongs to the current user
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "scriptgini"
7
- version = "1.5.2"
7
+ version = "1.5.3"
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.5.2
3
+ Version: 1.5.3
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.5.2 (Sprint 6 hardening + API key audit/revocation patch)
19
+ Current release: v1.5.3 (Sprint 6 complete - 100% test coverage and full audit logging hardening)
20
20
 
21
21
  ---
22
22
 
@@ -386,6 +386,43 @@ class TestAPIKeyManagement:
386
386
  )
387
387
  assert response.status_code == 403
388
388
 
389
+ def test_update_api_key_not_accessible_by_other_user_emits_audit_log(
390
+ self, db_session, test_user, test_user_2, auth_headers, monkeypatch
391
+ ):
392
+ """Update by non-owner should emit a structured audit event."""
393
+ create_response = client.post(
394
+ "/api/v1/auth/api-keys",
395
+ headers=auth_headers,
396
+ json={"name": "Owner Key", "scopes": ["read"]},
397
+ )
398
+ key_id = create_response.json()["id"]
399
+
400
+ login_response = client.post(
401
+ "/api/v1/auth/login",
402
+ json={
403
+ "email": "testuser2@example.com",
404
+ "password": "TestPassword123!",
405
+ },
406
+ )
407
+ other_user_headers = {
408
+ "Authorization": f"Bearer {login_response.json()['access_token']}"
409
+ }
410
+
411
+ captured: list[tuple] = []
412
+
413
+ def _capture_log(*args, **kwargs):
414
+ captured.append(args)
415
+
416
+ monkeypatch.setattr("app.routers.api_key.logger.info", _capture_log)
417
+
418
+ response = client.put(
419
+ f"/api/v1/auth/api-keys/{key_id}",
420
+ headers=other_user_headers,
421
+ json={"name": "Hacked", "scopes": ["write"]},
422
+ )
423
+ assert response.status_code == 403
424
+ assert any(len(entry) > 5 and entry[1] == "api_key_revoked" and entry[5] == "forbidden" for entry in captured)
425
+
389
426
  def test_delete_api_key(self, db_session, test_user, auth_headers):
390
427
  """Test deleting an API key."""
391
428
  # Create key
@@ -449,6 +486,19 @@ class TestAPIKeyManagement:
449
486
  response = client.delete("/api/v1/auth/api-keys/99999", headers=auth_headers)
450
487
  assert response.status_code == 404
451
488
 
489
+ def test_delete_api_key_not_found_emits_audit_log(self, auth_headers, monkeypatch):
490
+ """Missing API key deletion should emit a structured audit event."""
491
+ captured: list[tuple] = []
492
+
493
+ def _capture_log(*args, **kwargs):
494
+ captured.append(args)
495
+
496
+ monkeypatch.setattr("app.routers.api_key.logger.info", _capture_log)
497
+
498
+ response = client.delete("/api/v1/auth/api-keys/99999", headers=auth_headers)
499
+ assert response.status_code == 404
500
+ assert any(len(entry) > 5 and entry[1] == "api_key_revoked" and entry[5] == "not_found" for entry in captured)
501
+
452
502
  def test_delete_api_key_not_accessible_by_other_user(
453
503
  self, db_session, test_user, test_user_2, auth_headers
454
504
  ):
@@ -1,3 +0,0 @@
1
- __version__ = "1.5.2"
2
- __api_version__ = "v1.5.2"
3
-
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes