sqlmirror 0.2.0__py3-none-any.whl

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 (95) hide show
  1. sqlmirror/__init__.py +1 -0
  2. sqlmirror/apply.py +136 -0
  3. sqlmirror/backfill.py +65 -0
  4. sqlmirror/cli.py +335 -0
  5. sqlmirror/cron.py +103 -0
  6. sqlmirror/db.py +469 -0
  7. sqlmirror/db_mssql.py +530 -0
  8. sqlmirror/dev/__init__.py +1 -0
  9. sqlmirror/dev/cli.py +166 -0
  10. sqlmirror/dev/compare.py +87 -0
  11. sqlmirror/dev/e2e.py +261 -0
  12. sqlmirror/dev/golden.py +182 -0
  13. sqlmirror/dev/mock_jira.py +347 -0
  14. sqlmirror/dev/site.py +383 -0
  15. sqlmirror/dev/synth.py +769 -0
  16. sqlmirror/golden/01_issues_by_status.sql +8 -0
  17. sqlmirror/golden/02_issue_keys.sql +7 -0
  18. sqlmirror/golden/03_created_vs_resolved.sql +8 -0
  19. sqlmirror/golden/04_open_by_priority.sql +10 -0
  20. sqlmirror/golden/05_time_in_status.sql +16 -0
  21. sqlmirror/golden/06_cycle_time.sql +16 -0
  22. sqlmirror/golden/07_worklog_by_user.sql +11 -0
  23. sqlmirror/golden/08_fix_versions.sql +11 -0
  24. sqlmirror/golden/09_bugs_by_affected_version.sql +11 -0
  25. sqlmirror/golden/10_components.sql +10 -0
  26. sqlmirror/golden/11_top_labels.sql +9 -0
  27. sqlmirror/golden/12_select_field_distribution.sql +11 -0
  28. sqlmirror/golden/13_story_points_by_sprint.sql +11 -0
  29. sqlmirror/golden/14_sprint_completion.sql +14 -0
  30. sqlmirror/golden/15_epics.sql +12 -0
  31. sqlmirror/golden/16_subtasks.sql +10 -0
  32. sqlmirror/golden/17_blocked_issues.sql +11 -0
  33. sqlmirror/golden/18_most_discussed.sql +10 -0
  34. sqlmirror/golden/19_assignee_workload.sql +11 -0
  35. sqlmirror/golden/20_resolutions.sql +7 -0
  36. sqlmirror/golden/21_issue_history.sql +10 -0
  37. sqlmirror/golden/22_reopened.sql +11 -0
  38. sqlmirror/golden/23_overdue.sql +8 -0
  39. sqlmirror/golden/24_cascading_select.sql +13 -0
  40. sqlmirror/golden/25_user_picker.sql +12 -0
  41. sqlmirror/golden/26_attachments.sql +9 -0
  42. sqlmirror/golden/27_project_categories.sql +8 -0
  43. sqlmirror/golden/28_issue_types.sql +7 -0
  44. sqlmirror/golden/29_estimate_accuracy.sql +11 -0
  45. sqlmirror/golden/30_project_leads.sql +7 -0
  46. sqlmirror/golden/tsql/01_issues_by_status.sql +8 -0
  47. sqlmirror/golden/tsql/02_issue_keys.sql +6 -0
  48. sqlmirror/golden/tsql/03_created_vs_resolved.sql +8 -0
  49. sqlmirror/golden/tsql/04_open_by_priority.sql +10 -0
  50. sqlmirror/golden/tsql/05_time_in_status.sql +16 -0
  51. sqlmirror/golden/tsql/06_cycle_time.sql +16 -0
  52. sqlmirror/golden/tsql/07_worklog_by_user.sql +11 -0
  53. sqlmirror/golden/tsql/08_fix_versions.sql +11 -0
  54. sqlmirror/golden/tsql/09_bugs_by_affected_version.sql +11 -0
  55. sqlmirror/golden/tsql/10_components.sql +10 -0
  56. sqlmirror/golden/tsql/11_top_labels.sql +8 -0
  57. sqlmirror/golden/tsql/12_select_field_distribution.sql +11 -0
  58. sqlmirror/golden/tsql/13_story_points_by_sprint.sql +11 -0
  59. sqlmirror/golden/tsql/14_sprint_completion.sql +14 -0
  60. sqlmirror/golden/tsql/15_epics.sql +11 -0
  61. sqlmirror/golden/tsql/16_subtasks.sql +9 -0
  62. sqlmirror/golden/tsql/17_blocked_issues.sql +11 -0
  63. sqlmirror/golden/tsql/18_most_discussed.sql +9 -0
  64. sqlmirror/golden/tsql/19_assignee_workload.sql +11 -0
  65. sqlmirror/golden/tsql/20_resolutions.sql +7 -0
  66. sqlmirror/golden/tsql/21_issue_history.sql +10 -0
  67. sqlmirror/golden/tsql/22_reopened.sql +11 -0
  68. sqlmirror/golden/tsql/23_overdue.sql +8 -0
  69. sqlmirror/golden/tsql/24_cascading_select.sql +13 -0
  70. sqlmirror/golden/tsql/25_user_picker.sql +12 -0
  71. sqlmirror/golden/tsql/26_attachments.sql +9 -0
  72. sqlmirror/golden/tsql/27_project_categories.sql +8 -0
  73. sqlmirror/golden/tsql/28_issue_types.sql +7 -0
  74. sqlmirror/golden/tsql/29_estimate_accuracy.sql +11 -0
  75. sqlmirror/golden/tsql/30_project_leads.sql +7 -0
  76. sqlmirror/idmap.py +161 -0
  77. sqlmirror/jira.py +223 -0
  78. sqlmirror/mapper.py +774 -0
  79. sqlmirror/reconcile.py +73 -0
  80. sqlmirror/samples/dc_export_example.csv +19 -0
  81. sqlmirror/samples/dc_reports/mysql_sprint_report.sql +10 -0
  82. sqlmirror/samples/dc_reports/postgres_assigned_to_user.sql +6 -0
  83. sqlmirror/samples/dc_reports/postgres_customer_impact.sql +7 -0
  84. sqlmirror/samples/dc_reports/postgres_time_logged.sql +7 -0
  85. sqlmirror/samples/dc_reports/postgres_workflow_steps.sql +4 -0
  86. sqlmirror/samples/dc_reports/sqlserver_open_by_status.sql +9 -0
  87. sqlmirror/schema.py +518 -0
  88. sqlmirror/source.py +117 -0
  89. sqlmirror/sqlcheck.py +647 -0
  90. sqlmirror/util.py +80 -0
  91. sqlmirror-0.2.0.dist-info/METADATA +19 -0
  92. sqlmirror-0.2.0.dist-info/RECORD +95 -0
  93. sqlmirror-0.2.0.dist-info/WHEEL +5 -0
  94. sqlmirror-0.2.0.dist-info/entry_points.txt +3 -0
  95. sqlmirror-0.2.0.dist-info/top_level.txt +1 -0
sqlmirror/util.py ADDED
@@ -0,0 +1,80 @@
1
+ from __future__ import annotations
2
+
3
+ import hashlib
4
+ import re
5
+ from datetime import date, datetime, timezone
6
+ from typing import Any
7
+
8
+ _TZ_NO_COLON = re.compile(r"([+-]\d{2})(\d{2})$")
9
+
10
+
11
+ def parse_ts(value: Any) -> datetime | None:
12
+ """Parse the timestamp formats Jira Cloud returns into an aware datetime.
13
+
14
+ Handles "2026-01-02T10:00:00.000+0000", "...Z", "...+00:00", plain dates
15
+ ("2026-02-01", returned as midnight UTC) and epoch milliseconds.
16
+ """
17
+ if value is None or value == "":
18
+ return None
19
+ if isinstance(value, datetime):
20
+ return value if value.tzinfo else value.replace(tzinfo=timezone.utc)
21
+ if isinstance(value, date):
22
+ return datetime(value.year, value.month, value.day, tzinfo=timezone.utc)
23
+ if isinstance(value, (int, float)):
24
+ return datetime.fromtimestamp(value / 1000.0, tz=timezone.utc)
25
+ s = str(value).strip()
26
+ if len(s) == 10 and s[4] == "-" and s[7] == "-":
27
+ y, m, d = s.split("-")
28
+ return datetime(int(y), int(m), int(d), tzinfo=timezone.utc)
29
+ if s.endswith("Z"):
30
+ s = s[:-1] + "+00:00"
31
+ s = _TZ_NO_COLON.sub(r"\1:\2", s)
32
+ try:
33
+ dt = datetime.fromisoformat(s)
34
+ except ValueError:
35
+ return None
36
+ return dt if dt.tzinfo else dt.replace(tzinfo=timezone.utc)
37
+
38
+
39
+ def to_epoch_ms(value: Any) -> int | None:
40
+ dt = parse_ts(value)
41
+ return int(dt.timestamp() * 1000) if dt else None
42
+
43
+
44
+ def stable_id(*parts: Any) -> int:
45
+ """Deterministic 56-bit id for rows Cloud does not give an id to.
46
+
47
+ Stable across runs, so re-applying the same data produces the same ids
48
+ (useful for customers who copy mirror tables incrementally).
49
+ """
50
+ h = hashlib.sha1("|".join(str(p) for p in parts).encode("utf-8")).hexdigest()
51
+ return int(h[:14], 16)
52
+
53
+
54
+ def to_int(value: Any) -> int | None:
55
+ if value is None or value == "":
56
+ return None
57
+ try:
58
+ return int(value)
59
+ except (TypeError, ValueError):
60
+ try:
61
+ return int(float(value))
62
+ except (TypeError, ValueError):
63
+ return None
64
+
65
+
66
+ def to_float(value: Any) -> float | None:
67
+ if value is None or value == "":
68
+ return None
69
+ try:
70
+ return float(value)
71
+ except (TypeError, ValueError):
72
+ return None
73
+
74
+
75
+ def utcnow() -> datetime:
76
+ return datetime.now(timezone.utc)
77
+
78
+
79
+ def iso(dt: datetime | None) -> str | None:
80
+ return dt.astimezone(timezone.utc).isoformat().replace("+00:00", "Z") if dt else None
@@ -0,0 +1,19 @@
1
+ Metadata-Version: 2.4
2
+ Name: sqlmirror
3
+ Version: 0.2.0
4
+ Summary: Mirror Jira Cloud into your own Postgres or SQL Server under Data Center table names
5
+ Requires-Python: >=3.10
6
+ Requires-Dist: boto3>=1.28
7
+ Requires-Dist: click>=8.1
8
+ Requires-Dist: httpx>=0.27
9
+ Requires-Dist: psycopg[binary]>=3.2
10
+ Requires-Dist: python-dotenv>=1.0
11
+ Requires-Dist: sqlglot>=25
12
+ Provides-Extra: sqlserver
13
+ Requires-Dist: python-tds>=1.15; extra == "sqlserver"
14
+ Requires-Dist: pyOpenSSL>=23; extra == "sqlserver"
15
+ Requires-Dist: certifi; extra == "sqlserver"
16
+ Provides-Extra: dev
17
+ Requires-Dist: moto[server]>=5; extra == "dev"
18
+ Requires-Dist: pytest>=8; extra == "dev"
19
+ Requires-Dist: python-tds>=1.15; extra == "dev"
@@ -0,0 +1,95 @@
1
+ sqlmirror/__init__.py,sha256=Zn1KFblwuFHiDRdRAiRnDBRkbPttWh44jKa5zG2ov0E,22
2
+ sqlmirror/apply.py,sha256=7CTx2OFqfs6ZR-toLCwb5jPGiqqBTpW_tOCkB7-SabY,5361
3
+ sqlmirror/backfill.py,sha256=lH8-Xxu3Yy8gka2rXKY5m2kQ7t0Pi-ewPiR_aKnsDJE,3008
4
+ sqlmirror/cli.py,sha256=Dcm2ZAZDuvAjZSMUmZ-YvmGnZ5QgfYZ4oaoA2w36IUY,15365
5
+ sqlmirror/cron.py,sha256=l0i-G9eRBp0uMMWuWfSehqPtoMh87QUE65GossoKj8o,3549
6
+ sqlmirror/db.py,sha256=cyXKjAF8SxIrXkRZeprbox8oAJTapWZkguXapP8xGB0,22164
7
+ sqlmirror/db_mssql.py,sha256=Snv3hSjuWHe6CiIXq4CFt-hoDv-XpHRoDipGyubM7JM,25046
8
+ sqlmirror/idmap.py,sha256=pYzRuzPJXPENN9-S-Tgi8RjUJjbLF5JJbceqMfeOrdE,7585
9
+ sqlmirror/jira.py,sha256=RMgHh6HRnX3oobraMFZaYvpF_Hgz-Enf2OWj2JeeVpA,9844
10
+ sqlmirror/mapper.py,sha256=TIXoqvee0t-Gv_zgcBYvcM-wk8psAefCMVxyqwYogQE,33607
11
+ sqlmirror/reconcile.py,sha256=Zoex_K3iaupKFxg1EyyFH6GaEITwo3qTp4Dj-nlcmBc,3454
12
+ sqlmirror/schema.py,sha256=XXnyFQEzsU8k-IjQnHfrl75wQu-v7tdqpIWst2eKWhI,20370
13
+ sqlmirror/source.py,sha256=ZY1XS-UYX3tPiO6T_dosCOpwi3g1Ou1LwKdUtKwSkGA,4337
14
+ sqlmirror/sqlcheck.py,sha256=XpotzPkt6yyDRZ5xD_YsfWITyYqzMNnEA9J1oyD2ERs,34495
15
+ sqlmirror/util.py,sha256=_PhMacCVd_yVn7HA-5M_-4_N0Q-Gw7uL2g7RhTC6ZA4,2449
16
+ sqlmirror/dev/__init__.py,sha256=6tswKyKSKRz1nPEUVndTlUJshDmIW07UetJEsc_7744,94
17
+ sqlmirror/dev/cli.py,sha256=0LFYv_AWMFjCl_D98-VXm-I9OaFgS_VFNnz0_b38MWg,7481
18
+ sqlmirror/dev/compare.py,sha256=wd9dY27SF3xvehBb4Nzgn6Me4rjLCL7ClMnYZ5xkn2I,3220
19
+ sqlmirror/dev/e2e.py,sha256=qt3Xbcu-im03OH-QvnwFi1KTftEPZGNLcRdw6z9hsqU,12028
20
+ sqlmirror/dev/golden.py,sha256=yFoRYLmoPqucaVueVDzG1FX1Lj0VLZ9eSbLyKVXiZhs,7944
21
+ sqlmirror/dev/mock_jira.py,sha256=kURrzZyBDvFs2c-pSqc9vXZtY5_LdGfqE7_PxxusgPY,16478
22
+ sqlmirror/dev/site.py,sha256=48yyMrI3fs728tQTbJuDLurzq6DY33_QwhXSkXJg__A,19904
23
+ sqlmirror/dev/synth.py,sha256=0dPVMhWfo2_uHGGAsba1csgpwiZlWOVUCmVsBON4Osg,43265
24
+ sqlmirror/golden/01_issues_by_status.sql,sha256=zxBX34IGgfZwo6iN8zDsOHW1tDTHWQ1J_KC14YEFYVU,251
25
+ sqlmirror/golden/02_issue_keys.sql,sha256=9M2kGDRsAnItwyt7nNyphab2NdqU7pllNZH3WlAWW-Y,241
26
+ sqlmirror/golden/03_created_vs_resolved.sql,sha256=rdufsQqt6RQRJjthltMoS3jMLLFtcuhPZXDoHmztO-Q,202
27
+ sqlmirror/golden/04_open_by_priority.sql,sha256=vsE_Weu2vB1DIFvdPSxtShUAOhJYkJ8iDI6VNH6w0nE,328
28
+ sqlmirror/golden/05_time_in_status.sql,sha256=FHgkNkvvxjjL7R3LHERyGVK2SEQ7Eg9hq1B-_B9yfJM,576
29
+ sqlmirror/golden/06_cycle_time.sql,sha256=Xri7pcsKO4oxVZKZENr2OVkzfT2KbI3BDVL_peU9agg,619
30
+ sqlmirror/golden/07_worklog_by_user.sql,sha256=4u5m_24H7QTYt7D-KpIbQEFl6OTvj3GMcXydciqcbFQ,443
31
+ sqlmirror/golden/08_fix_versions.sql,sha256=0NxEoxAHXR8drU7qw50k-gLNtpmZYRk29b0-Z4u_8qo,429
32
+ sqlmirror/golden/09_bugs_by_affected_version.sql,sha256=cTeOy5tr-umY_KsLHTc4xKRyJ-4pVG_OjiBNsSbredo,375
33
+ sqlmirror/golden/10_components.sql,sha256=toeCB2_tHSpR105l9_R1uGzcZAIhhLru-AF4mSybPBo,312
34
+ sqlmirror/golden/11_top_labels.sql,sha256=rorzLfS7hSU83V9xg9UEnVEIzGb1T3fVmRDjhXAm-KQ,195
35
+ sqlmirror/golden/12_select_field_distribution.sql,sha256=VG_3FwcmjBfQVoCfWW_Efuwqu2T0xhfx0dMPVohE50M,580
36
+ sqlmirror/golden/13_story_points_by_sprint.sql,sha256=YD5utju5K273Q5ACexziW5rfk3DyvK5ZSSPQLWmNSoc,563
37
+ sqlmirror/golden/14_sprint_completion.sql,sha256=b-xsoU4wu5jpI5egyqSaR-k3lLB45tPE5HHIycIKq8A,573
38
+ sqlmirror/golden/15_epics.sql,sha256=qLNJTXvFkJytbNOxNIm_H5lJt9642mliha3hbkxvFg0,534
39
+ sqlmirror/golden/16_subtasks.sql,sha256=yKWK_igAjEznTJjj2PWe_XI0Oa2sgbxImToRFZyY3l8,360
40
+ sqlmirror/golden/17_blocked_issues.sql,sha256=UxQRFoygXyYAVYI6TIZKTffBmwdKzHN4vWeRxF_tnEM,445
41
+ sqlmirror/golden/18_most_discussed.sql,sha256=Q6D4KVX-BdPUNUHqpQb-ZnYNHWXCd0ADaAhRcMlxP2A,247
42
+ sqlmirror/golden/19_assignee_workload.sql,sha256=Z4c6R8r0beMsRFn1NUrSwdF70nBzzqr1WrghkSfJxzQ,394
43
+ sqlmirror/golden/20_resolutions.sql,sha256=C3HolYL4IJWxxhsUsDOTSKbo02YiCNlEoCqkamNY-b8,211
44
+ sqlmirror/golden/21_issue_history.sql,sha256=6kTkDQTT_3Gvxwl_wCxrP3OxZZp69bFhB2ZWn0zKORA,483
45
+ sqlmirror/golden/22_reopened.sql,sha256=gZqiJWkacUGdr2uw2Pq2DdbxD2UEpSO9FaXfLCm4mf8,499
46
+ sqlmirror/golden/23_overdue.sql,sha256=ijOLv7g2n7W6iMFUudtIzTgZatN7azSNktqthKilUyw,306
47
+ sqlmirror/golden/24_cascading_select.sql,sha256=W8i6HdAA8RCCRM-xdYEPlEqlSmvTYSBeyEE4qOLzCaY,714
48
+ sqlmirror/golden/25_user_picker.sql,sha256=NFP7GZXkZkDhOcoH7bHlz03o5kS-qg74OtALzIrszio,601
49
+ sqlmirror/golden/26_attachments.sql,sha256=4wcsL93Hyr4qK0EIOXC7U34FJxyp6ovEnY_ZeMSYEQo,289
50
+ sqlmirror/golden/27_project_categories.sql,sha256=Mx7k16pWJkRKdizjU27XiN-WiRKHT5XHVBipzfHAisU,323
51
+ sqlmirror/golden/28_issue_types.sql,sha256=1y3I64Q7CuJo-MphU_7T693mZaJfG0gwv7E1itVZk0w,228
52
+ sqlmirror/golden/29_estimate_accuracy.sql,sha256=OnuBB-pu15pOGb2690M05fvYRNltwDGGcRKKyDYnWXc,470
53
+ sqlmirror/golden/30_project_leads.sql,sha256=PHmFjXo7TCfhxjlhl4hnkzyuHS1hKHdV87Zn1KJqjx0,221
54
+ sqlmirror/golden/tsql/01_issues_by_status.sql,sha256=5uPzh6yUrK9JNu9V2T_HE0gjE6_UZaNU3epj98cj4zU,251
55
+ sqlmirror/golden/tsql/02_issue_keys.sql,sha256=kJHFGgsy7luWEfpkNuwtdgtlQ_3Oni-kcOWlS4p7Q3U,258
56
+ sqlmirror/golden/tsql/03_created_vs_resolved.sql,sha256=djJXkeqvyahZk_01MnP6fKkxLkHoKULKPyskFgDhX9Q,273
57
+ sqlmirror/golden/tsql/04_open_by_priority.sql,sha256=XkZE0WHr_mnNmubw2g1hgD64sEI3O4xbySF_7fq37xo,328
58
+ sqlmirror/golden/tsql/05_time_in_status.sql,sha256=NikUnUlYcaV2mFD_rpoRRikQvSB9R46ApS4Uo04NYBc,564
59
+ sqlmirror/golden/tsql/06_cycle_time.sql,sha256=x5J8d7fksSokvxJhjoB26lVxTlMxjgl4po-KhvSoVwY,598
60
+ sqlmirror/golden/tsql/07_worklog_by_user.sql,sha256=8AqYVaj9BZZ46DFXcPvXiVqxTOcI9B51qcMbq7MLg6Q,443
61
+ sqlmirror/golden/tsql/08_fix_versions.sql,sha256=YC27lHaW495dudH26EUdmfXTs-nsjpbnyDroVZmEC6E,429
62
+ sqlmirror/golden/tsql/09_bugs_by_affected_version.sql,sha256=tMZCcTyqO7E8nsgFXHZjpSt9N-wjqVTBsN6LnkiqOwc,375
63
+ sqlmirror/golden/tsql/10_components.sql,sha256=9-1aowRp1YDlYPaLeem7QoPKNxWaAI2pzpyjrLmumaI,312
64
+ sqlmirror/golden/tsql/11_top_labels.sql,sha256=e85nnC-Fd5c_6OXoCB_6TPrHp6Z4yv8CpKvUGmbtnnM,193
65
+ sqlmirror/golden/tsql/12_select_field_distribution.sql,sha256=t_Y06jcyqOrblg4zxA6TvEBMtgDKVSwfUu4-IfwGA-I,597
66
+ sqlmirror/golden/tsql/13_story_points_by_sprint.sql,sha256=zrcWIMcXgH0HWi999axdA7kxn5lCJGW6kxTQlXjc0XI,568
67
+ sqlmirror/golden/tsql/14_sprint_completion.sql,sha256=spS7knuZQwLTWk-5MN2vO-RX85Gek-1OgddadovnVxM,573
68
+ sqlmirror/golden/tsql/15_epics.sql,sha256=4ZaNnXSPG0FcrlO0_-4zzz7sY6FJfLt13ibfudihAwg,532
69
+ sqlmirror/golden/tsql/16_subtasks.sql,sha256=n1Bz7jzC5oTSefU4GGSvwE38b2Xr9cRbt0yV9f8UxPY,358
70
+ sqlmirror/golden/tsql/17_blocked_issues.sql,sha256=UxQRFoygXyYAVYI6TIZKTffBmwdKzHN4vWeRxF_tnEM,445
71
+ sqlmirror/golden/tsql/18_most_discussed.sql,sha256=vrVVTia3T4fXuztgJSUWGgmcUiVXm_eLKSkdxqqDw7Q,245
72
+ sqlmirror/golden/tsql/19_assignee_workload.sql,sha256=c01G_itg0ox-TukCTmp1HV0xm0A8RB60-1QlL6NVCck,427
73
+ sqlmirror/golden/tsql/20_resolutions.sql,sha256=YSJL3luWq0jATHyb_mvZl9rr0R88bYcmdSLQkAA025Y,237
74
+ sqlmirror/golden/tsql/21_issue_history.sql,sha256=iB1OW8aGETYeA5GMXOiwIskjJtZOKMTqCc_W4r_P82c,481
75
+ sqlmirror/golden/tsql/22_reopened.sql,sha256=gZqiJWkacUGdr2uw2Pq2DdbxD2UEpSO9FaXfLCm4mf8,499
76
+ sqlmirror/golden/tsql/23_overdue.sql,sha256=lZ8BHNFUJvieoxKVE6IhR4lHHIN1MzTuJQT5XyuW-f4,313
77
+ sqlmirror/golden/tsql/24_cascading_select.sql,sha256=vI7SyOs2pXEnNJl4S9UmfAqy6BKqhcIzDN8TIjWUWqg,797
78
+ sqlmirror/golden/tsql/25_user_picker.sql,sha256=7xtW9XIv99usarr8KriURLddCOjSZCz-VOTIjWL8J38,601
79
+ sqlmirror/golden/tsql/26_attachments.sql,sha256=7Qe4ofI3_ftGRnjC8qcDdcxEMDyCIb8_UA3K3Srs7v0,289
80
+ sqlmirror/golden/tsql/27_project_categories.sql,sha256=Mx7k16pWJkRKdizjU27XiN-WiRKHT5XHVBipzfHAisU,323
81
+ sqlmirror/golden/tsql/28_issue_types.sql,sha256=lZyJAtOc0V8SVG2BY2J5PnlCvNc2W_hjsxFOoVPDCdU,228
82
+ sqlmirror/golden/tsql/29_estimate_accuracy.sql,sha256=pJGuq5duAB85M9SB47oeTXBXMX_ecF0kB8el8aMO6NY,470
83
+ sqlmirror/golden/tsql/30_project_leads.sql,sha256=PHmFjXo7TCfhxjlhl4hnkzyuHS1hKHdV87Zn1KJqjx0,221
84
+ sqlmirror/samples/dc_export_example.csv,sha256=ZggC49NsKbh3TRuYGgYn_6Y5Xwv8CajHMK6WiE0R3hE,669
85
+ sqlmirror/samples/dc_reports/mysql_sprint_report.sql,sha256=UaHN46wNsPRJPVOwaEvOeKmVU7ARBfheTbQSYWjJf9E,427
86
+ sqlmirror/samples/dc_reports/postgres_assigned_to_user.sql,sha256=OOFYEXgkRWvc-fUjaCSzg_7gtwoeUhiJtb6FnPJpCLE,229
87
+ sqlmirror/samples/dc_reports/postgres_customer_impact.sql,sha256=J_akYHm0BCK9xuwW2iz5umee53PPvfZUSFWmztOVfZQ,260
88
+ sqlmirror/samples/dc_reports/postgres_time_logged.sql,sha256=AFYaTwdVccY4Ppohl2ihw7DXQvKqIgEqjZGcOD-guzY,250
89
+ sqlmirror/samples/dc_reports/postgres_workflow_steps.sql,sha256=nik5Kmazc5SsgKt9YOLBZu5XE30i826eehboSU46j-s,176
90
+ sqlmirror/samples/dc_reports/sqlserver_open_by_status.sql,sha256=cUTq895Jl4PlKK_FgUgDY433inSE8jDOTPeyU7P9-r0,422
91
+ sqlmirror-0.2.0.dist-info/METADATA,sha256=I3zGMJRLcQ7l92OKFvZ9EaKODp4rah6Lxb6kLOvmXO8,680
92
+ sqlmirror-0.2.0.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
93
+ sqlmirror-0.2.0.dist-info/entry_points.txt,sha256=K4nZqKycijq_pRcSbCq8qfo4Hx-j9ATp0Og4I3KS6wc,88
94
+ sqlmirror-0.2.0.dist-info/top_level.txt,sha256=i8vLm3PIRFmg4b8tFslxqzid4Fq1ntQrsUNeX4OSbqg,10
95
+ sqlmirror-0.2.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.2.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ sqlmirror = sqlmirror.cli:main
3
+ sqlmirror-dev = sqlmirror.dev.cli:main
@@ -0,0 +1 @@
1
+ sqlmirror