json-repair 0.27.2__tar.gz → 0.28.0__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: json_repair
3
- Version: 0.27.2
3
+ Version: 0.28.0
4
4
  Summary: A package to repair broken json strings
5
5
  Author-email: Stefano Baccianella <4247706+mangiucugna@users.noreply.github.com>
6
6
  License: MIT License
@@ -27,6 +27,7 @@ License: MIT License
27
27
 
28
28
  Project-URL: Homepage, https://github.com/mangiucugna/json_repair/
29
29
  Project-URL: Bug Tracker, https://github.com/mangiucugna/json_repair/issues
30
+ Project-URL: Live demo, https://mangiucugna.github.io/json_repair/
30
31
  Keywords: JSON,REPAIR,LLM,PARSER
31
32
  Classifier: Programming Language :: Python :: 3
32
33
  Classifier: License :: OSI Approved :: MIT License
@@ -3,7 +3,7 @@ requires = ["setuptools>=61.0"]
3
3
  build-backend = "setuptools.build_meta"
4
4
  [project]
5
5
  name = "json_repair"
6
- version = "0.27.2"
6
+ version = "0.28.0"
7
7
  license = {file = "LICENSE"}
8
8
  authors = [
9
9
  { name="Stefano Baccianella", email="4247706+mangiucugna@users.noreply.github.com" },
@@ -17,11 +17,15 @@ classifiers = [
17
17
  "License :: OSI Approved :: MIT License",
18
18
  "Operating System :: OS Independent",
19
19
  ]
20
-
21
20
  [project.urls]
22
21
  "Homepage" = "https://github.com/mangiucugna/json_repair/"
23
22
  "Bug Tracker" = "https://github.com/mangiucugna/json_repair/issues"
23
+ "Live demo" = "https://mangiucugna.github.io/json_repair/"
24
24
  [tool.pytest.ini_options]
25
25
  pythonpath = [
26
26
  "."
27
27
  ]
28
+ [tool.setuptools.package-data]
29
+ "pkgname" = ["py.typed"]
30
+ [tool.setuptools.packages.find]
31
+ where = ["src"]
@@ -51,9 +51,6 @@ class StringFileWrapper:
51
51
  self.fd.seek(current_position)
52
52
  return self.length
53
53
 
54
- def __setitem__(self) -> None:
55
- raise Exception("This is read-only!")
56
-
57
54
 
58
55
  class LoggerConfig:
59
56
  # This is a type class to simplify the declaration
@@ -310,8 +307,7 @@ class JSONParser:
310
307
  if self.get_context() == "object_key" and self.get_char_at(1) == ":":
311
308
  self.index += 1
312
309
  return ""
313
-
314
- # This is a valid exception only if it's closed by a double delimiter again
310
+ # Find the next delimiter
315
311
  i = 1
316
312
  next_c = self.get_char_at(i)
317
313
  while next_c and next_c != rstring_delimiter:
@@ -442,7 +438,7 @@ class JSONParser:
442
438
  ]:
443
439
  # This is a bit of a weird workaround, essentially in object_value context we don't always break on commas
444
440
  # This is because the routine after will make sure to correct any bad guess and this solves a corner case
445
- if next_c.isalpha():
441
+ if check_comma_in_object_value and next_c.isalpha():
446
442
  check_comma_in_object_value = False
447
443
  # If we are in an object context, let's check for the right delimiters
448
444
  if (
@@ -615,16 +611,10 @@ class JSONParser:
615
611
  self.context.append(value)
616
612
 
617
613
  def reset_context(self) -> None:
618
- try:
619
- self.context.pop()
620
- except Exception:
621
- return
614
+ self.context.pop()
622
615
 
623
616
  def get_context(self) -> str:
624
- try:
625
- return self.context[-1]
626
- except Exception:
627
- return ""
617
+ return self.context[-1]
628
618
 
629
619
  def log(self, text: str, level: str) -> None:
630
620
  if level == self.logger.log_level:
File without changes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: json_repair
3
- Version: 0.27.2
3
+ Version: 0.28.0
4
4
  Summary: A package to repair broken json strings
5
5
  Author-email: Stefano Baccianella <4247706+mangiucugna@users.noreply.github.com>
6
6
  License: MIT License
@@ -27,6 +27,7 @@ License: MIT License
27
27
 
28
28
  Project-URL: Homepage, https://github.com/mangiucugna/json_repair/
29
29
  Project-URL: Bug Tracker, https://github.com/mangiucugna/json_repair/issues
30
+ Project-URL: Live demo, https://mangiucugna.github.io/json_repair/
30
31
  Keywords: JSON,REPAIR,LLM,PARSER
31
32
  Classifier: Programming Language :: Python :: 3
32
33
  Classifier: License :: OSI Approved :: MIT License
@@ -3,9 +3,11 @@ README.md
3
3
  pyproject.toml
4
4
  src/json_repair/__init__.py
5
5
  src/json_repair/json_repair.py
6
+ src/json_repair/py.typed
6
7
  src/json_repair.egg-info/PKG-INFO
7
8
  src/json_repair.egg-info/SOURCES.txt
8
9
  src/json_repair.egg-info/dependency_links.txt
9
10
  src/json_repair.egg-info/top_level.txt
11
+ tests/test_coverage.py
10
12
  tests/test_json_repair.py
11
13
  tests/test_performance.py
@@ -0,0 +1,18 @@
1
+ import coverage
2
+ import sys
3
+
4
+ COVERAGE_THRESHOLD = 100
5
+
6
+ cov = coverage.Coverage()
7
+ cov.start()
8
+
9
+ import pytest
10
+ retcode = pytest.main(["./tests/test_json_repair.py", "--cov-config=.coveragerc"])
11
+
12
+ cov.stop()
13
+ cov.save()
14
+ coverage_percent = cov.report(show_missing=True)
15
+
16
+ if coverage_percent < COVERAGE_THRESHOLD:
17
+ print(f"ERROR: Coverage {coverage_percent:.2f}% is below the threshold of {COVERAGE_THRESHOLD}%")
18
+ sys.exit(1) # This will prevent the commit/push
@@ -94,10 +94,12 @@ def test_missing_and_mixed_quotes():
94
94
  repair_json('{"name": "John", "age": 30, "city": "New')
95
95
  == '{"name": "John", "age": 30, "city": "New"}'
96
96
  )
97
- assert repair_json('[{"key": "value", COMMENT "notes": "lorem "ipsum", sic."}]') == '[{"key": "value", "notes": "lorem \\"ipsum\\", sic."}]'
97
+ assert repair_json('[{"key": "value", COMMENT "notes": "lorem "ipsum", sic." }]') == '[{"key": "value", "notes": "lorem \\"ipsum\\", sic."}]'
98
98
  assert repair_json('{"key": ""value"}') == '{"key": "value"}'
99
99
  assert repair_json('{"key": "value", 5: "value"}') == '{"key": "value", "5": "value"}'
100
100
  assert repair_json('{"foo": "\\"bar\\""') == '{"foo": "\\"bar\\""}'
101
+ assert repair_json('{"" key":"val"') == '{" key": "val"}'
102
+ assert repair_json('{"key": value "key2" : "value2" ') == '{"key": "value", "key2": "value2"}'
101
103
 
102
104
  def test_array_edge_cases():
103
105
  assert repair_json("[1, 2, 3,") == "[1, 2, 3]"
@@ -106,16 +108,9 @@ def test_array_edge_cases():
106
108
  assert repair_json("[1, 2, '...', 3]") == '[1, 2, "...", 3]'
107
109
  assert repair_json("[true, false, null, ...]") == '[true, false, null]'
108
110
  assert repair_json('["a" "b" "c" 1') == '["a", "b", "c", 1]'
109
- assert (
110
- repair_json('{"employees":["John", "Anna",')
111
- == '{"employees": ["John", "Anna"]}'
112
- )
113
- assert (
114
- repair_json('{"employees":["John", "Anna", "Peter')
115
- == '{"employees": ["John", "Anna", "Peter"]}'
116
- )
111
+ assert repair_json('{"employees":["John", "Anna",') == '{"employees": ["John", "Anna"]}'
112
+ assert repair_json('{"employees":["John", "Anna", "Peter') == '{"employees": ["John", "Anna", "Peter"]}'
117
113
  assert repair_json('{"key1": {"key2": [1, 2, 3') == '{"key1": {"key2": [1, 2, 3]}}'
118
-
119
114
 
120
115
  def test_escaping():
121
116
  assert repair_json("'\"'") == '""'
@@ -127,6 +122,7 @@ def test_escaping():
127
122
 
128
123
  def test_object_edge_cases():
129
124
  assert repair_json('{ ') == '{}'
125
+ assert repair_json('{"": "value"') == '{"": "value"}'
130
126
  assert repair_json('{"value_1": true, COMMENT "value_2": "data"}') == '{"value_1": true, "value_2": "data"}'
131
127
  assert repair_json('{"value_1": true, SHOULD_NOT_EXIST "value_2": "data" AAAA }') == '{"value_1": true, "value_2": "data"}'
132
128
  assert repair_json('{"" : true, "key2": "value2"}') == '{"": true, "key2": "value2"}'
@@ -138,6 +134,8 @@ def test_object_edge_cases():
138
134
  assert repair_json('{"key": "Lorem "ipsum" s,"}') == '{"key": "Lorem \\"ipsum\\" s,"}'
139
135
  assert repair_json('{"lorem": ipsum, sic, datum.",}') == '{"lorem": "ipsum, sic, datum."}'
140
136
  assert repair_json('{"lorem": sic tamet. "ipsum": sic tamet, quick brown fox. "sic": ipsum}') == '{"lorem": "sic tamet.", "ipsum": "sic tamet", "sic": "ipsum"}'
137
+ assert repair_json('{"key":value, " key2":"value2" }') == '{"key": "value", " key2": "value2"}'
138
+ assert repair_json('{"key":value "key2":"value2" }') == '{"key": "value", "key2": "value2"}'
141
139
 
142
140
  def test_number_edge_cases():
143
141
  assert repair_json(' - { "test_key": ["test_value", "test_value2"] }') == '{"test_key": ["test_value", "test_value2"]}'
File without changes
File without changes
File without changes