biller-cli 0.1.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.
- biller_cli/__init__.py +0 -0
- biller_cli/ai/__init__.py +397 -0
- biller_cli/ai/ingest.py +394 -0
- biller_cli/commands/down.py +96 -0
- biller_cli/commands/downgrade.py +142 -0
- biller_cli/commands/init.py +210 -0
- biller_cli/commands/up.py +138 -0
- biller_cli/commands/upgrade.py +271 -0
- biller_cli/main.py +34 -0
- biller_cli/templates/biller-user-layer/pom.xml +100 -0
- biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/ApplicationContext.java +13 -0
- biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/config/DatabaseConfig.java +35 -0
- biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/config/WebCorsConfig.java +21 -0
- biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/controller/BbpsRequestController.java +98 -0
- biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/dao/impl/BillFetchDaoImpl.java +135 -0
- biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/dao/impl/BillPaymentDaoImpl.java +100 -0
- biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/provider/BillingProviderConfig.java +34 -0
- biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/provider/BillingProviderProperties.java +92 -0
- biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/provider/impl/CsvBillingProvider.java +257 -0
- biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/provider/impl/ExcelBillingProvider.java +261 -0
- biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/provider/impl/PostgresBillingProvider.java +210 -0
- biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/service/impl/BillFetchServiceImpl.java +131 -0
- biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/service/impl/BillPaymentServiceImpl.java +175 -0
- biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/service/impl/HeartbeatServiceImpl.java +136 -0
- biller_cli/templates/biller-user-layer/src/main/resources/application.properties +88 -0
- biller_cli/templates/pom.xml +33 -0
- biller_cli/utils/preflight.py +151 -0
- biller_cli/utils/secrets.py +37 -0
- biller_cli/utils/version_pin.py +67 -0
- biller_cli-0.1.0.dist-info/METADATA +17 -0
- biller_cli-0.1.0.dist-info/RECORD +33 -0
- biller_cli-0.1.0.dist-info/WHEEL +4 -0
- biller_cli-0.1.0.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
server.port=${SERVER_PORT:8111}
|
|
2
|
+
app.cors.allowed-origins=${CORS_ALLOWED_ORIGINS:http://localhost:3000}
|
|
3
|
+
|
|
4
|
+
# Database
|
|
5
|
+
spring.datasource.url=${DB_URL:jdbc:postgresql://localhost:5432/billerdb?currentSchema=billerdb}
|
|
6
|
+
spring.datasource.username=${DB_USERNAME:postgres}
|
|
7
|
+
spring.datasource.password=${DB_PASSWORD:postgres}
|
|
8
|
+
spring.datasource.driver-class-name=org.postgresql.Driver
|
|
9
|
+
spring.jpa.hibernate.ddl-auto=update
|
|
10
|
+
spring.jpa.show-sql=true
|
|
11
|
+
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
|
|
12
|
+
spring.sql.init.schema-locations=classpath:schema.sql
|
|
13
|
+
spring.sql.init.mode=always
|
|
14
|
+
spring.main.allow-bean-definition-overriding=true
|
|
15
|
+
|
|
16
|
+
# BOU Connection
|
|
17
|
+
bou.domain=${BOU_DOMAIN:http://localhost:8112}
|
|
18
|
+
bou.billfetchrequest.url=/bbps/BillFetchRequest/1.0/urn:referenceId:
|
|
19
|
+
bou.billpaymentrequest.url=/bbps/BillPaymentRequest/1.0/urn:referenceId:
|
|
20
|
+
bou.billfetchresponse.url=/bbps/BillFetchResponse/1.0/urn:referenceId:
|
|
21
|
+
bou.billpaymentresponse.url=/bbps/BillPaymentResponse/1.0/urn:referenceId:
|
|
22
|
+
|
|
23
|
+
# BBPS
|
|
24
|
+
bbps.ip=${BBPS_IP:http://localhost:8113}
|
|
25
|
+
bbps.billfetchresponse.url=${bou.billfetchresponse.url}
|
|
26
|
+
bbps.billpaymentresponse.url=${bou.billpaymentresponse.url}
|
|
27
|
+
hbt.frequency=3
|
|
28
|
+
|
|
29
|
+
# OU Identity — set PENDING until BBPS assigns your OU ID
|
|
30
|
+
# Run 'biller activate' after receiving your OU ID from BBPS
|
|
31
|
+
ou.id=${OU_ID:PENDING}
|
|
32
|
+
|
|
33
|
+
# Certificate — never hardcode, never commit ousigner.p12
|
|
34
|
+
bbps.cert.path=${BBPS_CERT_PATH:config/certificate/OU/ousigner.p12}
|
|
35
|
+
bbps.cert.password=${BBPS_CERT_PASSWORD:changeit}
|
|
36
|
+
bbps.sign-method=RSA_SHA256
|
|
37
|
+
|
|
38
|
+
# Billing Provider
|
|
39
|
+
billing.provider.type=${BILLING_PROVIDER_TYPE:postgres}
|
|
40
|
+
billing.provider.date-format=yyyy-MM-ddx
|
|
41
|
+
|
|
42
|
+
billing.provider.postgres.tables.bill-details=bill_details
|
|
43
|
+
billing.provider.postgres.tables.payment-transactions=payment_transactions
|
|
44
|
+
billing.provider.postgres.bill-columns.bill-id=bill_id
|
|
45
|
+
billing.provider.postgres.bill-columns.customer-param-name=customer_param_name
|
|
46
|
+
billing.provider.postgres.bill-columns.customer-param-type=customer_param_type
|
|
47
|
+
billing.provider.postgres.bill-columns.customer-param-value=customer_param_value
|
|
48
|
+
billing.provider.postgres.bill-columns.bill-amount=bill_amount
|
|
49
|
+
billing.provider.postgres.bill-columns.bill-date=bill_date
|
|
50
|
+
billing.provider.postgres.bill-columns.due-date=due_date
|
|
51
|
+
billing.provider.postgres.bill-columns.bill-number=bill_number
|
|
52
|
+
billing.provider.postgres.bill-columns.bill-period=bill_period
|
|
53
|
+
billing.provider.postgres.bill-columns.bill-status=bill_status
|
|
54
|
+
billing.provider.postgres.bill-columns.additional-info=additional_info
|
|
55
|
+
billing.provider.postgres.bill-columns.created-at=created_at
|
|
56
|
+
billing.provider.postgres.bill-columns.updated-at=updated_at
|
|
57
|
+
billing.provider.postgres.payment-columns.bill-id=bill_id
|
|
58
|
+
billing.provider.postgres.payment-columns.bbps-txn-ref=bbps_txn_ref
|
|
59
|
+
billing.provider.postgres.payment-columns.amount-paid=amount_paid
|
|
60
|
+
billing.provider.postgres.payment-columns.payment-mode=payment_mode
|
|
61
|
+
|
|
62
|
+
billing.provider.csv.path=${CSV_PATH:}
|
|
63
|
+
billing.provider.csv.payment-log-path=${CSV_PAYMENT_LOG_PATH:}
|
|
64
|
+
billing.provider.csv.delimiter=,
|
|
65
|
+
billing.provider.csv.columns.bill-id=bill_id
|
|
66
|
+
billing.provider.csv.columns.customer-param-name=customer_param_name
|
|
67
|
+
billing.provider.csv.columns.customer-param-type=customer_param_type
|
|
68
|
+
billing.provider.csv.columns.customer-param-value=customer_param_value
|
|
69
|
+
billing.provider.csv.columns.bill-amount=bill_amount
|
|
70
|
+
billing.provider.csv.columns.bill-date=bill_date
|
|
71
|
+
billing.provider.csv.columns.due-date=due_date
|
|
72
|
+
billing.provider.csv.columns.bill-number=bill_number
|
|
73
|
+
billing.provider.csv.columns.bill-period=bill_period
|
|
74
|
+
billing.provider.csv.columns.bill-status=bill_status
|
|
75
|
+
|
|
76
|
+
billing.provider.excel.path=${EXCEL_PATH:}
|
|
77
|
+
billing.provider.excel.sheet-name=Sheet1
|
|
78
|
+
billing.provider.excel.payment-log-path=${EXCEL_PAYMENT_LOG_PATH:}
|
|
79
|
+
billing.provider.excel.columns.bill-id=bill_id
|
|
80
|
+
billing.provider.excel.columns.customer-param-name=customer_param_name
|
|
81
|
+
billing.provider.excel.columns.customer-param-type=customer_param_type
|
|
82
|
+
billing.provider.excel.columns.customer-param-value=customer_param_value
|
|
83
|
+
billing.provider.excel.columns.bill-amount=bill_amount
|
|
84
|
+
billing.provider.excel.columns.bill-date=bill_date
|
|
85
|
+
billing.provider.excel.columns.due-date=due_date
|
|
86
|
+
billing.provider.excel.columns.bill-number=bill_number
|
|
87
|
+
billing.provider.excel.columns.bill-period=bill_period
|
|
88
|
+
billing.provider.excel.columns.bill-status=bill_status
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
3
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
4
|
+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
5
|
+
<modelVersion>4.0.0</modelVersion>
|
|
6
|
+
|
|
7
|
+
<parent>
|
|
8
|
+
<groupId>org.springframework.boot</groupId>
|
|
9
|
+
<artifactId>spring-boot-starter-parent</artifactId>
|
|
10
|
+
<version>3.2.0</version>
|
|
11
|
+
<relativePath/>
|
|
12
|
+
</parent>
|
|
13
|
+
|
|
14
|
+
<groupId>com.bharatconnect.biller</groupId>
|
|
15
|
+
<artifactId>test-biller-integrator</artifactId>
|
|
16
|
+
<version>1.0.0</version>
|
|
17
|
+
<packaging>pom</packaging>
|
|
18
|
+
|
|
19
|
+
<modules>
|
|
20
|
+
<module>biller-user-layer</module>
|
|
21
|
+
</modules>
|
|
22
|
+
|
|
23
|
+
<properties>
|
|
24
|
+
<java.version>17</java.version>
|
|
25
|
+
</properties>
|
|
26
|
+
<repositories>
|
|
27
|
+
<repository>
|
|
28
|
+
<id>github</id>
|
|
29
|
+
<url>https://maven.pkg.github.com/Dhru227/biller-core</url>
|
|
30
|
+
</repository>
|
|
31
|
+
</repositories>
|
|
32
|
+
|
|
33
|
+
</project>
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import shutil, subprocess, sys
|
|
2
|
+
from rich.console import Console
|
|
3
|
+
from enum import Enum
|
|
4
|
+
|
|
5
|
+
console = Console()
|
|
6
|
+
|
|
7
|
+
class RuntimeMode(Enum):
|
|
8
|
+
DOCKER = "docker"
|
|
9
|
+
NATIVE = "native"
|
|
10
|
+
NONE = "none"
|
|
11
|
+
|
|
12
|
+
# ── Individual check functions ────────────────────────────────────────────────
|
|
13
|
+
|
|
14
|
+
def _check_python() -> bool:
|
|
15
|
+
return sys.version_info >= (3, 10)
|
|
16
|
+
|
|
17
|
+
def _check_git() -> bool:
|
|
18
|
+
return shutil.which("git") is not None
|
|
19
|
+
|
|
20
|
+
def _check_java() -> bool:
|
|
21
|
+
if not shutil.which("java"):
|
|
22
|
+
return False
|
|
23
|
+
result = subprocess.run(["java", "-version"], capture_output=True, text=True)
|
|
24
|
+
output = result.stderr + result.stdout
|
|
25
|
+
for line in output.splitlines():
|
|
26
|
+
if "version" in line:
|
|
27
|
+
try:
|
|
28
|
+
version_str = line.split('"')[1]
|
|
29
|
+
major = int(version_str.split(".")[0])
|
|
30
|
+
if major == 1: # legacy 1.8.x format
|
|
31
|
+
major = int(version_str.split(".")[1])
|
|
32
|
+
return major >= 17
|
|
33
|
+
except (IndexError, ValueError):
|
|
34
|
+
return False
|
|
35
|
+
return False
|
|
36
|
+
|
|
37
|
+
def _check_maven() -> bool:
|
|
38
|
+
return shutil.which("mvn") is not None
|
|
39
|
+
|
|
40
|
+
def _check_docker_installed() -> bool:
|
|
41
|
+
return shutil.which("docker") is not None
|
|
42
|
+
|
|
43
|
+
def _check_docker_daemon() -> bool:
|
|
44
|
+
if not _check_docker_installed():
|
|
45
|
+
return False
|
|
46
|
+
result = subprocess.run(["docker", "info"], capture_output=True)
|
|
47
|
+
return result.returncode == 0
|
|
48
|
+
|
|
49
|
+
# ── Runtime detection ─────────────────────────────────────────────────────────
|
|
50
|
+
|
|
51
|
+
def detect_runtime() -> RuntimeMode:
|
|
52
|
+
"""
|
|
53
|
+
Returns the best available runtime:
|
|
54
|
+
docker — Docker installed AND daemon running
|
|
55
|
+
native — No Docker (or daemon down), but Java 17+ and Maven present
|
|
56
|
+
none — Neither viable
|
|
57
|
+
"""
|
|
58
|
+
if _check_docker_daemon():
|
|
59
|
+
return RuntimeMode.DOCKER
|
|
60
|
+
if _check_java() and _check_maven():
|
|
61
|
+
return RuntimeMode.NATIVE
|
|
62
|
+
return RuntimeMode.NONE
|
|
63
|
+
|
|
64
|
+
# ── Pre-flight gate ───────────────────────────────────────────────────────────
|
|
65
|
+
|
|
66
|
+
UNIVERSAL_CHECKS = [
|
|
67
|
+
{
|
|
68
|
+
"name": "Python >= 3.10",
|
|
69
|
+
"check": _check_python,
|
|
70
|
+
"fix": "Upgrade Python: https://python.org",
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"name": "Git",
|
|
74
|
+
"check": _check_git,
|
|
75
|
+
"fix": "Install Git: sudo apt-get install git",
|
|
76
|
+
},
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
NATIVE_CHECKS = [
|
|
80
|
+
{
|
|
81
|
+
"name": "Java 17+",
|
|
82
|
+
"check": _check_java,
|
|
83
|
+
"fix": "Install Java: sudo apt-get install openjdk-17-jdk\n"
|
|
84
|
+
" Or: https://adoptium.net",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"name": "Maven",
|
|
88
|
+
"check": _check_maven,
|
|
89
|
+
"fix": "Install Maven: sudo apt-get install maven\n"
|
|
90
|
+
" Or: https://maven.apache.org/install.html",
|
|
91
|
+
},
|
|
92
|
+
]
|
|
93
|
+
|
|
94
|
+
def run_preflight(require_runtime: bool = True) -> RuntimeMode:
|
|
95
|
+
"""
|
|
96
|
+
Run all pre-flight checks. Returns the detected RuntimeMode.
|
|
97
|
+
Exits with a clear message if any universal check fails,
|
|
98
|
+
or if require_runtime=True and no runtime is viable.
|
|
99
|
+
"""
|
|
100
|
+
# Universal checks — must always pass
|
|
101
|
+
failed = []
|
|
102
|
+
for item in UNIVERSAL_CHECKS:
|
|
103
|
+
try:
|
|
104
|
+
passed = item["check"]()
|
|
105
|
+
except Exception:
|
|
106
|
+
passed = False
|
|
107
|
+
if not passed:
|
|
108
|
+
failed.append(item)
|
|
109
|
+
|
|
110
|
+
if failed:
|
|
111
|
+
console.print("\n[red]Pre-flight failed:[/red]\n")
|
|
112
|
+
for item in failed:
|
|
113
|
+
console.print(f" [red]✗[/red] {item['name']}")
|
|
114
|
+
console.print(f" → {item['fix']}\n")
|
|
115
|
+
raise SystemExit(1)
|
|
116
|
+
|
|
117
|
+
# Runtime detection
|
|
118
|
+
runtime = detect_runtime()
|
|
119
|
+
|
|
120
|
+
if runtime == RuntimeMode.DOCKER:
|
|
121
|
+
console.print("[dim]Runtime: Docker ✓[/dim]")
|
|
122
|
+
|
|
123
|
+
elif runtime == RuntimeMode.NATIVE:
|
|
124
|
+
console.print("[yellow]Docker not available — using native Maven mode.[/yellow]")
|
|
125
|
+
failed_native = []
|
|
126
|
+
for item in NATIVE_CHECKS:
|
|
127
|
+
try:
|
|
128
|
+
passed = item["check"]()
|
|
129
|
+
except Exception:
|
|
130
|
+
passed = False
|
|
131
|
+
if not passed:
|
|
132
|
+
failed_native.append(item)
|
|
133
|
+
if failed_native:
|
|
134
|
+
console.print("\n[red]Native mode also unavailable:[/red]\n")
|
|
135
|
+
for item in failed_native:
|
|
136
|
+
console.print(f" [red]✗[/red] {item['name']}")
|
|
137
|
+
console.print(f" → {item['fix']}\n")
|
|
138
|
+
raise SystemExit(1)
|
|
139
|
+
|
|
140
|
+
elif runtime == RuntimeMode.NONE and require_runtime:
|
|
141
|
+
console.print("\n[red]No viable runtime found.[/red]")
|
|
142
|
+
console.print("biller-cli needs either:\n")
|
|
143
|
+
console.print(" [bold]Docker (recommended)[/bold]")
|
|
144
|
+
console.print(" sudo apt-get install docker.io")
|
|
145
|
+
console.print(" sudo systemctl start docker")
|
|
146
|
+
console.print(" sudo usermod -aG docker $USER # then log out and back in\n")
|
|
147
|
+
console.print(" [bold]OR: Java 17+ and Maven[/bold]")
|
|
148
|
+
console.print(" sudo apt-get install openjdk-17-jdk maven\n")
|
|
149
|
+
raise SystemExit(1)
|
|
150
|
+
|
|
151
|
+
return runtime
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from rich.console import Console
|
|
3
|
+
|
|
4
|
+
console = Console()
|
|
5
|
+
|
|
6
|
+
def write_env_file(project_dir: Path, secrets: dict):
|
|
7
|
+
"""Write sensitive values to .env.biller. Never call yaml.dump on these."""
|
|
8
|
+
env_file = project_dir / ".env.biller"
|
|
9
|
+
lines = ["# Biller secrets — DO NOT COMMIT\n"]
|
|
10
|
+
for key, value in secrets.items():
|
|
11
|
+
lines.append(f"{key.upper()}={value}\n")
|
|
12
|
+
env_file.write_text("".join(lines))
|
|
13
|
+
_ensure_gitignore(project_dir)
|
|
14
|
+
console.print(f"[dim]Secrets → {env_file} (git-ignored)[/dim]")
|
|
15
|
+
|
|
16
|
+
def read_env_file(project_dir: Path) -> dict:
|
|
17
|
+
"""Reads secrets back for native mode injection."""
|
|
18
|
+
env_file = project_dir / ".env.biller"
|
|
19
|
+
if not env_file.exists():
|
|
20
|
+
return {}
|
|
21
|
+
result = {}
|
|
22
|
+
for line in env_file.read_text().splitlines():
|
|
23
|
+
if "=" in line and not line.startswith("#"):
|
|
24
|
+
k, v = line.split("=", 1)
|
|
25
|
+
result[k.lower()] = v
|
|
26
|
+
return result
|
|
27
|
+
|
|
28
|
+
def _ensure_gitignore(project_dir: Path):
|
|
29
|
+
"""Guarantees .env.biller is ignored in the user's generated repo."""
|
|
30
|
+
gitignore = project_dir / ".gitignore"
|
|
31
|
+
entry = ".env.biller"
|
|
32
|
+
if gitignore.exists():
|
|
33
|
+
if entry not in gitignore.read_text():
|
|
34
|
+
with gitignore.open("a") as f:
|
|
35
|
+
f.write(f"\n# Biller secrets — auto-added by biller-cli\n{entry}\n")
|
|
36
|
+
else:
|
|
37
|
+
gitignore.write_text(f"# Biller secrets\n{entry}\n")
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Shared utility for reading and writing the biller-core version pin.
|
|
3
|
+
|
|
4
|
+
Used by both `biller-cli upgrade` and `biller-cli downgrade`.
|
|
5
|
+
Updates two files atomically:
|
|
6
|
+
- biller.yaml → core.version
|
|
7
|
+
- pom.xml → properties/biller.core.version
|
|
8
|
+
|
|
9
|
+
Uses an XML parser (not regex) so POM reformatting by IDEs or Maven
|
|
10
|
+
does not silently break the update.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import xml.etree.ElementTree as ET
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
import yaml
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
MAVEN_NS = "http://maven.apache.org/POM/4.0.0"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def get_version_pin(project_dir: Path) -> str:
|
|
22
|
+
"""Return the currently pinned biller-core version from biller.yaml."""
|
|
23
|
+
bp = project_dir / "biller.yaml"
|
|
24
|
+
if not bp.exists():
|
|
25
|
+
raise FileNotFoundError(f"biller.yaml not found in {project_dir}")
|
|
26
|
+
cfg = yaml.safe_load(bp.read_text())
|
|
27
|
+
version = cfg.get("core", {}).get("version")
|
|
28
|
+
if not version:
|
|
29
|
+
raise KeyError("core.version not found in biller.yaml")
|
|
30
|
+
return version
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def set_version_pin(project_dir: Path, version: str) -> None:
|
|
34
|
+
"""
|
|
35
|
+
Write version to both biller.yaml and pom.xml.
|
|
36
|
+
|
|
37
|
+
Raises RuntimeError if biller.core.version property is missing from pom.xml —
|
|
38
|
+
this means the pom.xml was not scaffolded correctly and should not be silently fixed.
|
|
39
|
+
"""
|
|
40
|
+
# 1. biller.yaml
|
|
41
|
+
bp = project_dir / "biller.yaml"
|
|
42
|
+
cfg = yaml.safe_load(bp.read_text())
|
|
43
|
+
if "core" not in cfg:
|
|
44
|
+
cfg["core"] = {}
|
|
45
|
+
cfg["core"]["version"] = version
|
|
46
|
+
bp.write_text(yaml.dump(cfg, default_flow_style=False, sort_keys=False))
|
|
47
|
+
|
|
48
|
+
# 2. pom.xml — use XML parser, never regex
|
|
49
|
+
pom_path = project_dir / "pom.xml"
|
|
50
|
+
if not pom_path.exists():
|
|
51
|
+
raise FileNotFoundError(f"pom.xml not found in {project_dir}")
|
|
52
|
+
|
|
53
|
+
ET.register_namespace("", MAVEN_NS)
|
|
54
|
+
tree = ET.parse(pom_path)
|
|
55
|
+
root = tree.getroot()
|
|
56
|
+
ns = {"m": MAVEN_NS}
|
|
57
|
+
|
|
58
|
+
prop = root.find(".//m:properties/m:biller.core.version", ns)
|
|
59
|
+
if prop is None:
|
|
60
|
+
raise RuntimeError(
|
|
61
|
+
"biller.core.version not found in pom.xml <properties>. "
|
|
62
|
+
"The pom.xml may not have been scaffolded by biller-cli init. "
|
|
63
|
+
"Add: <biller.core.version>VERSION</biller.core.version> under <properties>."
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
prop.text = version
|
|
67
|
+
tree.write(str(pom_path), xml_declaration=True, encoding="unicode")
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: biller-cli
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Requires-Python: >=3.10
|
|
5
|
+
Requires-Dist: gitpython>=3.1
|
|
6
|
+
Requires-Dist: packaging>=24.0
|
|
7
|
+
Requires-Dist: psutil>=5.9
|
|
8
|
+
Requires-Dist: pyyaml>=6
|
|
9
|
+
Requires-Dist: requests>=2.31
|
|
10
|
+
Requires-Dist: rich>=13
|
|
11
|
+
Requires-Dist: typer[all]>=0.12
|
|
12
|
+
Provides-Extra: dev
|
|
13
|
+
Requires-Dist: mypy; extra == 'dev'
|
|
14
|
+
Requires-Dist: pytest; extra == 'dev'
|
|
15
|
+
Requires-Dist: pytest-cov; extra == 'dev'
|
|
16
|
+
Requires-Dist: pytest-mock; extra == 'dev'
|
|
17
|
+
Requires-Dist: ruff; extra == 'dev'
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
biller_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
biller_cli/main.py,sha256=gFvdGyN_UlBy7Ht8WZWB6UobZnYB-JzS4CUihChO0ac,922
|
|
3
|
+
biller_cli/ai/__init__.py,sha256=Ejvyx2lme4yg2xCVs5ET8D09CE5hcBxJinkmGJS46n0,14011
|
|
4
|
+
biller_cli/ai/ingest.py,sha256=J-xZNq7Dc0n2HGI6kutg7AydN8NAMvoV5ORTNWko4x4,13760
|
|
5
|
+
biller_cli/commands/down.py,sha256=sfU_YfLui5h0a1goOQbQHhNLezQ5mElp_gt6F6Vc3tc,3134
|
|
6
|
+
biller_cli/commands/downgrade.py,sha256=lHXLDvoZTLVGni6rGcM6jqauyV0z_FtmaaNz7qim78Q,5581
|
|
7
|
+
biller_cli/commands/init.py,sha256=LWW7oZrkV_qea1ZbeZKMGqYptJyjvIzm5CS1NNjamBw,8272
|
|
8
|
+
biller_cli/commands/up.py,sha256=U_98YrILMGCGHPGuMd0K2h_G02GBiG1UUGLWBQXLuYA,5309
|
|
9
|
+
biller_cli/commands/upgrade.py,sha256=cnv0Lq8ampvghkPb6u8KHDn1fs2OXS3WPHwGzcmHBqs,10561
|
|
10
|
+
biller_cli/templates/pom.xml,sha256=Nyz1XFv9a88eOE2dTk1J8ILCnI5Vw0z1fynpTDNMgho,1001
|
|
11
|
+
biller_cli/templates/biller-user-layer/pom.xml,sha256=ulmmNEb9_zGleI8b7sqxAQ8eldh-h1TQkFhQsPx9C4g,3777
|
|
12
|
+
biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/ApplicationContext.java,sha256=nOL_aDmnyHul2slLqVDmfYvFucXeNfGSwEtj2wjeA3o,458
|
|
13
|
+
biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/config/DatabaseConfig.java,sha256=wAeuqP0xxp9e7mQqyF1Dg_IfX1Jaajgn5T8z2fbe9CA,1452
|
|
14
|
+
biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/config/WebCorsConfig.java,sha256=vpMit5img8pHIljuZVRhFl8q_dhWqyioPdZuWf6Bt1w,756
|
|
15
|
+
biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/controller/BbpsRequestController.java,sha256=EbqzPzo6B6zDS3wK8aNCUf6Rsw8ZAW6fuDjqx54najA,4518
|
|
16
|
+
biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/dao/impl/BillFetchDaoImpl.java,sha256=Nq9LFrCz0VW2EKftofdKLo76a_IuuPT8_C6hhxZHBqI,6346
|
|
17
|
+
biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/dao/impl/BillPaymentDaoImpl.java,sha256=s7ciaoUVZyg5Sh6whOvkCU8mFJs2qczndGvRrozGNdI,4441
|
|
18
|
+
biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/provider/BillingProviderConfig.java,sha256=ZIqxuBaX91ulr-Wn6ZTfc-oji5LsC-P2MBU6k5n1tmY,1728
|
|
19
|
+
biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/provider/BillingProviderProperties.java,sha256=DKlUbUrBJ1siYjyU6egOhiO8EcLiiO7lLMbHSel_Wlw,2992
|
|
20
|
+
biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/provider/impl/CsvBillingProvider.java,sha256=3Vrq298FjqLxk0tqdj6XXZR4wiUZeGfuC6rfQI5S7Zo,10813
|
|
21
|
+
biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/provider/impl/ExcelBillingProvider.java,sha256=Mzm0DIFRn6nNGdddBR8AkMBCxtuACgbdR9woL0cp76o,11647
|
|
22
|
+
biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/provider/impl/PostgresBillingProvider.java,sha256=CJmMmx-ot5WWV6SKSz49tpBs7cqL73aF7GtFABHc9rw,9930
|
|
23
|
+
biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/service/impl/BillFetchServiceImpl.java,sha256=YCFoBqFxH7KqKucf4JgC3FRuF8ilxUrtZaAKBew9d5I,5682
|
|
24
|
+
biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/service/impl/BillPaymentServiceImpl.java,sha256=jvqD35Zm8bpBE99oGdton_Gv06TXpnWxw4d6wRiAi_w,7388
|
|
25
|
+
biller_cli/templates/biller-user-layer/src/main/java/bharat/connect/biller/service/impl/HeartbeatServiceImpl.java,sha256=38f2MXalCzaslKamp-Sc_sWTAiVXaZwLpvgAtvBhNuE,5755
|
|
26
|
+
biller_cli/templates/biller-user-layer/src/main/resources/application.properties,sha256=NCarEJ8hCD-tMACPCkJM_BLNKak5tpHGnj3fVY5NVAs,4331
|
|
27
|
+
biller_cli/utils/preflight.py,sha256=Bplsupr3jB_m6fIT7jY7vkyJJ0Z-hiAh5-cnK2pDyzI,5274
|
|
28
|
+
biller_cli/utils/secrets.py,sha256=jPO_aEJ4ZBjXbzPK0lVkFUrTZ8t23fq1MUUXfXToEqE,1407
|
|
29
|
+
biller_cli/utils/version_pin.py,sha256=8GJe56Hw-JmT8QdVKYfs4axZ74UIG8HYYJyVUF6bTew,2276
|
|
30
|
+
biller_cli-0.1.0.dist-info/METADATA,sha256=0jDxZE1f8UD-LQ0DXrG6TcJnNPMwr0ulZ-vRqOeCqtI,492
|
|
31
|
+
biller_cli-0.1.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
32
|
+
biller_cli-0.1.0.dist-info/entry_points.txt,sha256=CkwW_8TCDaqkvl2_lxt12SxJ3AQjWfgudXVYVIeA9mM,51
|
|
33
|
+
biller_cli-0.1.0.dist-info/RECORD,,
|