parse-lp 3.0.2__tar.gz → 3.0.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 (155) hide show
  1. {parse_lp-3.0.2 → parse_lp-3.0.3}/Cargo.lock +150 -15
  2. {parse_lp-3.0.2 → parse_lp-3.0.3}/PKG-INFO +1 -1
  3. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/Cargo.toml +1 -1
  4. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/python/CHANGELOG.md +7 -0
  5. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/src/lib.rs +4 -1
  6. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/Cargo.toml +7 -4
  7. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/README.md +92 -11
  8. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/rust/CHANGELOG.md +17 -0
  9. parse_lp-3.0.3/rust/src/bin/lp_parser/cli.rs +214 -0
  10. parse_lp-3.0.3/rust/src/bin/lp_parser/main.rs +625 -0
  11. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/builder.rs +23 -7
  12. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/compat/lp_solvers.rs +19 -7
  13. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/context.rs +8 -0
  14. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/csv.rs +23 -1
  15. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/error.rs +12 -4
  16. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/lexer.rs +24 -21
  17. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/lib.rs +13 -2
  18. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/model.rs +4 -0
  19. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/problem.rs +69 -8
  20. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/writer.rs +21 -13
  21. parse_lp-3.0.2/rust/src/bin/main.rs +0 -111
  22. {parse_lp-3.0.2 → parse_lp-3.0.3}/Cargo.toml +0 -0
  23. {parse_lp-3.0.2 → parse_lp-3.0.3}/LICENSE-APACHE +0 -0
  24. {parse_lp-3.0.2 → parse_lp-3.0.3}/README.md +0 -0
  25. {parse_lp-3.0.2 → parse_lp-3.0.3}/parse_lp/__init__.py +0 -0
  26. {parse_lp-3.0.2 → parse_lp-3.0.3}/parse_lp/parse_lp.pyi +0 -0
  27. {parse_lp-3.0.2 → parse_lp-3.0.3}/parse_lp/py.typed +0 -0
  28. {parse_lp-3.0.2 → parse_lp-3.0.3}/pyproject.toml +0 -0
  29. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/.cargo/config.toml +0 -0
  30. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/.gitignore +0 -0
  31. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/CHANGELOG.md +0 -0
  32. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/LICENSE-APACHE +0 -0
  33. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/MANIFEST.in +0 -0
  34. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/Makefile +0 -0
  35. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/README.md +0 -0
  36. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/parse_lp/__init__.py +0 -0
  37. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/parse_lp/parse_lp.pyi +0 -0
  38. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/parse_lp/py.typed +0 -0
  39. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/resources/afiro.lp +0 -0
  40. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/tests/__init__.py +0 -0
  41. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/tests/conftest.py +0 -0
  42. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/tests/fixtures/afiro.lp +0 -0
  43. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/tests/fixtures/minimize.lp +0 -0
  44. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/tests/fixtures/simple.lp +0 -0
  45. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/tests/test_csv_writer.py +0 -0
  46. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/tests/test_lp_parser.py +0 -0
  47. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/tests/test_lp_writer.py +0 -0
  48. {parse_lp-3.0.2 → parse_lp-3.0.3}/python/uv.lock +0 -0
  49. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/CHANGELOG.md +0 -0
  50. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/build.rs +0 -0
  51. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/1obj_1cons_all_variables_with_bounds.lp +0 -0
  52. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/2obj_2cons_all_variable_types.lp +0 -0
  53. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/2obj_2cons_only_binary_vars.lp +0 -0
  54. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/3obj_2cons.lp +0 -0
  55. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/AmericanSteelProblem.lp +0 -0
  56. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/BeerDistributionProblem.lp +0 -0
  57. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/ComputerPlantProblem.lp +0 -0
  58. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/WhiskasModel2.lp +0 -0
  59. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/afiro.lp +0 -0
  60. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/afiro_ext.lp +0 -0
  61. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/blank_lines.lp +0 -0
  62. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/boeing1.lp +0 -0
  63. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/boeing2.lp +0 -0
  64. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/complex_names.lp +0 -0
  65. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/corrupt.lp +0 -0
  66. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/cplex.lp +0 -0
  67. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/diet.lp +0 -0
  68. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/empty_bounds.lp +0 -0
  69. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/fit1d.lp +0 -0
  70. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/fit2d.lp +0 -0
  71. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/infile_comments.lp +0 -0
  72. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/infile_comments2.lp +0 -0
  73. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/invalid.lp +0 -0
  74. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/kb2.lp +0 -0
  75. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/limbo.lp +0 -0
  76. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/lol.lp +0 -0
  77. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/milo1.lp +0 -0
  78. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/missing_signs.lp +0 -0
  79. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/model.lp +0 -0
  80. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/model2.lp +0 -0
  81. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/mosek.lp +0 -0
  82. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/mosek_bounds.lp +0 -0
  83. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/no_end_section.lp +0 -0
  84. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/optional_labels.lp +0 -0
  85. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/output.lp +0 -0
  86. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/output2_1.lp +0 -0
  87. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/output2_2.lp +0 -0
  88. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/output2_3.lp +0 -0
  89. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/output2_4.lp +0 -0
  90. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/output_cplex_2.lp +0 -0
  91. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/pulp.lp +0 -0
  92. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/pulp2.lp +0 -0
  93. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/sc50a.lp +0 -0
  94. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/scientific_notation.lp +0 -0
  95. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/scientific_notation_2.lp +0 -0
  96. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/semi_continuous.lp +0 -0
  97. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/sos.lp +0 -0
  98. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/sudoku.lp +0 -0
  99. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/test.lp +0 -0
  100. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/test2.lp +0 -0
  101. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/test_copy.lp +0 -0
  102. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/wbm.lp +0 -0
  103. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/compat/mod.rs +0 -0
  104. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/lp.lalrpop +0 -0
  105. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/parser.rs +0 -0
  106. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/snapshots/lp_parser_rs__problem__test__complete_input.snap +0 -0
  107. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/snapshots/lp_parser_rs__problem__test__minified_example.snap +0 -0
  108. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/snapshots/lp_parser_rs__problem__test__small_input.snap +0 -0
  109. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__afiro.snap +0 -0
  110. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__afiro_ext.snap +0 -0
  111. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__american_steel_problem.snap +0 -0
  112. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__beer_distribution_problem.snap +0 -0
  113. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__blank_lines.snap +0 -0
  114. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__boeing1.snap +0 -0
  115. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__boeing2.snap +0 -0
  116. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__complex_names.snap +0 -0
  117. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__computer_plant_problem.snap +0 -0
  118. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__cplex.snap +0 -0
  119. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__diet.snap +0 -0
  120. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__empty_bounds.snap +0 -0
  121. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__fit1d.snap +0 -0
  122. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__infile_comments.snap +0 -0
  123. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__infile_comments2.snap +0 -0
  124. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__kb2.snap +0 -0
  125. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__limbo.snap +0 -0
  126. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__lol.snap +0 -0
  127. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__milo1.snap +0 -0
  128. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__missing_signs.snap +0 -0
  129. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__model.snap +0 -0
  130. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__model2.snap +0 -0
  131. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__mosek.snap +0 -0
  132. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__mosek_bounds.snap +0 -0
  133. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__nom_fit2d.snap +0 -0
  134. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__obj3_2cons.snap +0 -0
  135. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__obj_1cons_all_variables_with_bounds.snap +0 -0
  136. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__obj_2cons_all_variable_types.snap +0 -0
  137. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__obj_2cons_only_binary_vars.snap +0 -0
  138. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__output.snap +0 -0
  139. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__output2_1.snap +0 -0
  140. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__output2_2.snap +0 -0
  141. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__output2_3.snap +0 -0
  142. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__output2_4.snap +0 -0
  143. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__pulp.snap +0 -0
  144. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__pulp2.snap +0 -0
  145. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__sc50a.snap +0 -0
  146. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__scientific_notation.snap +0 -0
  147. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__scientific_notation_2.snap +0 -0
  148. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__sos.snap +0 -0
  149. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__sudoku.snap +0 -0
  150. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__test.snap +0 -0
  151. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__test2.snap +0 -0
  152. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__wbm.snap +0 -0
  153. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__whiskas_model_2.snap +0 -0
  154. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/test_from_file.rs +0 -0
  155. {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/test_lp_solvers_compat.rs +0 -0
@@ -11,6 +11,56 @@ dependencies = [
11
11
  "memchr",
12
12
  ]
13
13
 
14
+ [[package]]
15
+ name = "anstream"
16
+ version = "0.6.21"
17
+ source = "registry+https://github.com/rust-lang/crates.io-index"
18
+ checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a"
19
+ dependencies = [
20
+ "anstyle",
21
+ "anstyle-parse",
22
+ "anstyle-query",
23
+ "anstyle-wincon",
24
+ "colorchoice",
25
+ "is_terminal_polyfill",
26
+ "utf8parse",
27
+ ]
28
+
29
+ [[package]]
30
+ name = "anstyle"
31
+ version = "1.0.13"
32
+ source = "registry+https://github.com/rust-lang/crates.io-index"
33
+ checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
34
+
35
+ [[package]]
36
+ name = "anstyle-parse"
37
+ version = "0.2.7"
38
+ source = "registry+https://github.com/rust-lang/crates.io-index"
39
+ checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
40
+ dependencies = [
41
+ "utf8parse",
42
+ ]
43
+
44
+ [[package]]
45
+ name = "anstyle-query"
46
+ version = "1.1.5"
47
+ source = "registry+https://github.com/rust-lang/crates.io-index"
48
+ checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
49
+ dependencies = [
50
+ "windows-sys 0.61.2",
51
+ ]
52
+
53
+ [[package]]
54
+ name = "anstyle-wincon"
55
+ version = "3.0.11"
56
+ source = "registry+https://github.com/rust-lang/crates.io-index"
57
+ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
58
+ dependencies = [
59
+ "anstyle",
60
+ "once_cell_polyfill",
61
+ "windows-sys 0.61.2",
62
+ ]
63
+
14
64
  [[package]]
15
65
  name = "ascii-canvas"
16
66
  version = "4.0.0"
@@ -90,6 +140,52 @@ version = "1.0.4"
90
140
  source = "registry+https://github.com/rust-lang/crates.io-index"
91
141
  checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
92
142
 
143
+ [[package]]
144
+ name = "clap"
145
+ version = "4.5.53"
146
+ source = "registry+https://github.com/rust-lang/crates.io-index"
147
+ checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8"
148
+ dependencies = [
149
+ "clap_builder",
150
+ "clap_derive",
151
+ ]
152
+
153
+ [[package]]
154
+ name = "clap_builder"
155
+ version = "4.5.53"
156
+ source = "registry+https://github.com/rust-lang/crates.io-index"
157
+ checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00"
158
+ dependencies = [
159
+ "anstream",
160
+ "anstyle",
161
+ "clap_lex",
162
+ "strsim",
163
+ ]
164
+
165
+ [[package]]
166
+ name = "clap_derive"
167
+ version = "4.5.49"
168
+ source = "registry+https://github.com/rust-lang/crates.io-index"
169
+ checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671"
170
+ dependencies = [
171
+ "heck",
172
+ "proc-macro2",
173
+ "quote",
174
+ "syn 2.0.111",
175
+ ]
176
+
177
+ [[package]]
178
+ name = "clap_lex"
179
+ version = "0.7.6"
180
+ source = "registry+https://github.com/rust-lang/crates.io-index"
181
+ checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d"
182
+
183
+ [[package]]
184
+ name = "colorchoice"
185
+ version = "1.0.4"
186
+ source = "registry+https://github.com/rust-lang/crates.io-index"
187
+ checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
188
+
93
189
  [[package]]
94
190
  name = "console"
95
191
  version = "0.15.11"
@@ -302,6 +398,12 @@ dependencies = [
302
398
  "similar",
303
399
  ]
304
400
 
401
+ [[package]]
402
+ name = "is_terminal_polyfill"
403
+ version = "1.70.2"
404
+ source = "registry+https://github.com/rust-lang/crates.io-index"
405
+ checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
406
+
305
407
  [[package]]
306
408
  name = "itertools"
307
409
  version = "0.14.0"
@@ -368,12 +470,6 @@ dependencies = [
368
470
  "rustversion",
369
471
  ]
370
472
 
371
- [[package]]
372
- name = "lazy_static"
373
- version = "1.5.0"
374
- source = "registry+https://github.com/rust-lang/crates.io-index"
375
- checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
376
-
377
473
  [[package]]
378
474
  name = "libc"
379
475
  version = "0.2.178"
@@ -403,24 +499,24 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
403
499
 
404
500
  [[package]]
405
501
  name = "logos"
406
- version = "0.15.1"
502
+ version = "0.16.0"
407
503
  source = "registry+https://github.com/rust-lang/crates.io-index"
408
- checksum = "ff472f899b4ec2d99161c51f60ff7075eeb3097069a36050d8037a6325eb8154"
504
+ checksum = "a790d11254054e5dc83902dba85d253ff06ceb0cfafb12be8773435cb9dfb4f4"
409
505
  dependencies = [
410
506
  "logos-derive",
411
507
  ]
412
508
 
413
509
  [[package]]
414
510
  name = "logos-codegen"
415
- version = "0.15.1"
511
+ version = "0.16.0"
416
512
  source = "registry+https://github.com/rust-lang/crates.io-index"
417
- checksum = "192a3a2b90b0c05b27a0b2c43eecdb7c415e29243acc3f89cc8247a5b693045c"
513
+ checksum = "f60337c43a38313b58871f8d5d76872b8e17aa9d51fad494b5e76092c0ce05f5"
418
514
  dependencies = [
419
515
  "beef",
420
516
  "fnv",
421
- "lazy_static",
422
517
  "proc-macro2",
423
518
  "quote",
519
+ "regex-automata",
424
520
  "regex-syntax",
425
521
  "rustc_version",
426
522
  "syn 2.0.111",
@@ -428,9 +524,9 @@ dependencies = [
428
524
 
429
525
  [[package]]
430
526
  name = "logos-derive"
431
- version = "0.15.1"
527
+ version = "0.16.0"
432
528
  source = "registry+https://github.com/rust-lang/crates.io-index"
433
- checksum = "605d9697bcd5ef3a42d38efc51541aa3d6a4a25f7ab6d1ed0da5ac632a26b470"
529
+ checksum = "d151b2ae667f69e10b8738f5cac0c746faa22b2e15ea7e83b55476afec3767dc"
434
530
  dependencies = [
435
531
  "logos-codegen",
436
532
  ]
@@ -447,8 +543,9 @@ dependencies = [
447
543
 
448
544
  [[package]]
449
545
  name = "lp_parser_rs"
450
- version = "3.0.2"
546
+ version = "3.0.3"
451
547
  dependencies = [
548
+ "clap",
452
549
  "csv",
453
550
  "diff-struct",
454
551
  "float_eq",
@@ -460,6 +557,7 @@ dependencies = [
460
557
  "lp-solvers",
461
558
  "serde",
462
559
  "serde_json",
560
+ "serde_yaml",
463
561
  "thiserror",
464
562
  "unique_id",
465
563
  ]
@@ -564,6 +662,12 @@ version = "1.21.3"
564
662
  source = "registry+https://github.com/rust-lang/crates.io-index"
565
663
  checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
566
664
 
665
+ [[package]]
666
+ name = "once_cell_polyfill"
667
+ version = "1.70.2"
668
+ source = "registry+https://github.com/rust-lang/crates.io-index"
669
+ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
670
+
567
671
  [[package]]
568
672
  name = "parking_lot"
569
673
  version = "0.12.5"
@@ -589,7 +693,7 @@ dependencies = [
589
693
 
590
694
  [[package]]
591
695
  name = "parse_lp"
592
- version = "3.0.2"
696
+ version = "3.0.3"
593
697
  dependencies = [
594
698
  "lp_parser_rs",
595
699
  "pyo3",
@@ -905,6 +1009,19 @@ dependencies = [
905
1009
  "serde_core",
906
1010
  ]
907
1011
 
1012
+ [[package]]
1013
+ name = "serde_yaml"
1014
+ version = "0.9.34+deprecated"
1015
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1016
+ checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
1017
+ dependencies = [
1018
+ "indexmap",
1019
+ "itoa",
1020
+ "ryu",
1021
+ "serde",
1022
+ "unsafe-libyaml",
1023
+ ]
1024
+
908
1025
  [[package]]
909
1026
  name = "sha2"
910
1027
  version = "0.10.9"
@@ -956,6 +1073,12 @@ dependencies = [
956
1073
  "precomputed-hash",
957
1074
  ]
958
1075
 
1076
+ [[package]]
1077
+ name = "strsim"
1078
+ version = "0.11.1"
1079
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1080
+ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
1081
+
959
1082
  [[package]]
960
1083
  name = "syn"
961
1084
  version = "1.0.109"
@@ -1066,6 +1189,18 @@ dependencies = [
1066
1189
  "uuid",
1067
1190
  ]
1068
1191
 
1192
+ [[package]]
1193
+ name = "unsafe-libyaml"
1194
+ version = "0.2.11"
1195
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1196
+ checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
1197
+
1198
+ [[package]]
1199
+ name = "utf8parse"
1200
+ version = "0.2.2"
1201
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1202
+ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
1203
+
1069
1204
  [[package]]
1070
1205
  name = "uuid"
1071
1206
  version = "1.19.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: parse_lp
3
- Version: 3.0.2
3
+ Version: 3.0.3
4
4
  Classifier: License :: OSI Approved :: Apache Software License
5
5
  Classifier: Programming Language :: Python :: 3.9
6
6
  Classifier: Programming Language :: Python :: 3.10
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "parse_lp"
3
- version = "3.0.2"
3
+ version = "3.0.3"
4
4
  edition = "2021"
5
5
  authors = ["Dan Dixey", "Dan Dixey <dan@functorml.co.uk>"]
6
6
  rust-version = "1.74.0"
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [3.0.3](https://github.com/dandxy89/lp_parser_rs/compare/parse_lp-v3.0.2...parse_lp-v3.0.3) (2025-12-11)
4
+
5
+
6
+ ### Code Refactoring
7
+
8
+ * Clippy ([#150](https://github.com/dandxy89/lp_parser_rs/issues/150)) ([0ec6a51](https://github.com/dandxy89/lp_parser_rs/commit/0ec6a510fe3bd3a9f6f52194de381a110ad19589))
9
+
3
10
  ## [3.0.2](https://github.com/dandxy89/lp_parser_rs/compare/parse_lp-v3.0.0...parse_lp-v3.0.2) (2025-12-07)
4
11
 
5
12
 
@@ -1,3 +1,6 @@
1
+ // Allow pedantic lints that are unavoidable due to PyO3 macro requirements
2
+ #![allow(clippy::unnecessary_wraps, clippy::needless_pass_by_value, clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
3
+
1
4
  use std::borrow::Cow;
2
5
  use std::path::{Path, PathBuf};
3
6
 
@@ -36,7 +39,7 @@ impl LpParser {
36
39
  #[pyo3(text_signature = "($self)")]
37
40
  fn parse(&mut self) -> PyResult<()> {
38
41
  let input = parse_file(&PathBuf::from(&self.lp_file)).map_err(|_| PyRuntimeError::new_err("Unable to read LpFile."))?;
39
- self.parsed_content = Some(input.to_owned());
42
+ self.parsed_content = Some(input.clone());
40
43
  Ok(())
41
44
  }
42
45
 
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "lp_parser_rs"
3
- version = "3.0.2"
3
+ version = "3.0.3"
4
4
  edition = "2021"
5
5
  authors = ["Dan Dixey", "Dan Dixey <dan@functorml.co.uk>"]
6
6
  rust-version = "1.70.0"
@@ -26,16 +26,19 @@ doctest = false
26
26
 
27
27
  [[bin]]
28
28
  name = "lp_parser"
29
- path = "src/bin/main.rs"
29
+ path = "src/bin/lp_parser/main.rs"
30
30
 
31
31
  [dependencies]
32
+ clap = { version = "4.5", features = ["derive"] }
32
33
  csv = { version = "1.4.0", optional = true }
33
34
  diff-struct = { version = "0.5.3", optional = true }
34
35
  lalrpop-util = "0.22.2"
35
36
  lp-solvers = { version = "1.1", optional = true }
36
37
  log = "0.4.29"
37
- logos = "0.15.1"
38
+ logos = "0.16.0"
38
39
  serde = { version = "1.0.228", features = ["derive"], optional = true }
40
+ serde_json = { version = "1.0", optional = true }
41
+ serde_yaml = { version = "0.9", optional = true }
39
42
  thiserror = "2.0.17"
40
43
  unique_id = { version = "0.1.7", features = ["sequence"] }
41
44
 
@@ -52,7 +55,7 @@ csv = ["dep:csv"]
52
55
  default = []
53
56
  diff = ["dep:diff-struct", "serde"]
54
57
  lp-solvers = ["dep:lp-solvers"]
55
- serde = ["dep:serde"]
58
+ serde = ["dep:serde", "dep:serde_json", "dep:serde_yaml"]
56
59
  test-cbc = ["lp-solvers"]
57
60
 
58
61
  [package.metadata.cargo-machete]
@@ -61,16 +61,6 @@ lp_parser_rs = "3.0.0" # x-release-please-version
61
61
 
62
62
  ### Basic Usage
63
63
 
64
- Clone and run with a sample file:
65
-
66
- ```bash
67
- git clone https://github.com/dandxy89/lp_parser_rs.git
68
- # Parse a single LP file
69
- cargo run --bin lp_parser --release -- {{ /path/to/your/file.lp }}
70
- # Compare two LP files (enabling the 'diff' feature)
71
- cargo run --bin lp_parser --release --features diff -- {{ /path/to/your/file.lp }} {{ /path/to/your/other/file.lp }}
72
- ```
73
-
74
64
  Using the library directly:
75
65
 
76
66
  ```rust
@@ -132,7 +122,98 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
132
122
  lp_parser_rs = { version = "3.0.0", features = ["serde", "diff"] } # x-release-please-version
133
123
  ```
134
124
 
135
- ### Solving with External Solvers (`lp-solvers` feature)
125
+ ## Command-Line Interface
126
+
127
+ The `lp_parser` binary provides a comprehensive CLI for working with LP files.
128
+
129
+ ### Installation
130
+
131
+ ```bash
132
+ # Install with all features
133
+ cargo install lp_parser_rs --all-features
134
+
135
+ # Or build from source
136
+ git clone https://github.com/dandxy89/lp_parser_rs.git
137
+ cd lp_parser_rs/rust
138
+ cargo build --release --all-features
139
+ ```
140
+
141
+ ### Commands
142
+
143
+ ```
144
+ lp_parser <COMMAND>
145
+
146
+ Commands:
147
+ parse Parse an LP file and display its structure
148
+ info Show detailed statistics about an LP problem
149
+ diff Compare two LP files (requires 'diff' feature)
150
+ convert Convert LP file to another format
151
+ solve Solve an LP problem using external solvers (requires 'lp-solvers' feature)
152
+
153
+ Global Options:
154
+ -v, --verbose Increase output verbosity
155
+ -q, --quiet Suppress non-essential output
156
+ -h, --help Print help
157
+ -V, --version Print version
158
+ ```
159
+
160
+ ### Examples
161
+
162
+ **Parse and display an LP file:**
163
+
164
+ ```bash
165
+ lp_parser parse problem.lp
166
+ ```
167
+
168
+ **Get problem statistics:**
169
+
170
+ ```bash
171
+ lp_parser info problem.lp
172
+ # With detailed listings
173
+ lp_parser info problem.lp --variables --constraints --objectives
174
+ ```
175
+
176
+ **Output as JSON or YAML:**
177
+
178
+ ```bash
179
+ lp_parser info problem.lp --format json --pretty
180
+ lp_parser parse problem.lp --format yaml -o problem.yaml
181
+ ```
182
+
183
+ **Compare two LP files:**
184
+
185
+ ```bash
186
+ lp_parser diff old_model.lp new_model.lp
187
+ lp_parser diff old.lp new.lp --format json --pretty
188
+ ```
189
+
190
+ **Convert between formats:**
191
+
192
+ ```bash
193
+ # To LP (with formatting options)
194
+ lp_parser convert problem.lp --format lp --precision 4 --compact
195
+
196
+ # To CSV (creates constraints.csv, objectives.csv, variables.csv)
197
+ lp_parser convert problem.lp --format csv --output ./output_dir
198
+
199
+ # To JSON/YAML
200
+ lp_parser convert problem.lp --format json --pretty -o problem.json
201
+ lp_parser convert problem.lp --format yaml -o problem.yaml
202
+ ```
203
+
204
+ **Solve with external solvers:**
205
+ ```bash
206
+ # Using CBC (default)
207
+ lp_parser solve problem.lp
208
+
209
+ # Using GLPK
210
+ lp_parser solve problem.lp --solver glpk
211
+
212
+ # Output solution as JSON
213
+ lp_parser solve problem.lp --format json --pretty
214
+ ```
215
+
216
+ ## Solving with External Solvers (`lp-solvers` feature)
136
217
 
137
218
  Enable the `lp-solvers` feature to solve parsed LP problems using external solvers like CBC, Gurobi, CPLEX, or GLPK via the [lp-solvers](https://crates.io/crates/lp-solvers) crate:
138
219
 
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## [3.0.3](https://github.com/dandxy89/lp_parser_rs/compare/lp_parser_rs-v3.0.2...lp_parser_rs-v3.0.3) (2025-12-11)
4
+
5
+
6
+ ### Build System
7
+
8
+ * Bump logos crate to 0.16.0 ([690e83c](https://github.com/dandxy89/lp_parser_rs/commit/690e83c69277a9de49bc8579c86db3a433766389))
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * Improvements to the binary / main ([#151](https://github.com/dandxy89/lp_parser_rs/issues/151)) ([0ca04b8](https://github.com/dandxy89/lp_parser_rs/commit/0ca04b81cce55c7fac0b04211a493997ec0892b2))
14
+
15
+
16
+ ### Code Refactoring
17
+
18
+ * Clippy ([#150](https://github.com/dandxy89/lp_parser_rs/issues/150)) ([0ec6a51](https://github.com/dandxy89/lp_parser_rs/commit/0ec6a510fe3bd3a9f6f52194de381a110ad19589))
19
+
3
20
  ## [3.0.2](https://github.com/dandxy89/lp_parser_rs/compare/lp_parser_rs-v3.0.1...lp_parser_rs-v3.0.2) (2025-12-07)
4
21
 
5
22
 
@@ -0,0 +1,214 @@
1
+ //! CLI argument definitions for `lp_parser`.
2
+
3
+ use std::path::PathBuf;
4
+
5
+ use clap::{Parser, Subcommand, ValueEnum};
6
+
7
+ /// LP Parser - Parse, analyze, convert, and solve Linear Programming files
8
+ #[derive(Parser)]
9
+ #[command(name = "lp_parser")]
10
+ #[command(author, version, about, long_about = None)]
11
+ #[command(propagate_version = true)]
12
+ pub struct Cli {
13
+ #[command(subcommand)]
14
+ pub command: Commands,
15
+
16
+ /// Increase output verbosity
17
+ #[arg(short, long, global = true, action = clap::ArgAction::Count)]
18
+ pub verbose: u8,
19
+
20
+ /// Suppress non-essential output
21
+ #[arg(short, long, global = true)]
22
+ pub quiet: bool,
23
+ }
24
+
25
+ #[derive(Subcommand)]
26
+ pub enum Commands {
27
+ /// Parse an LP file and display its structure
28
+ Parse(ParseArgs),
29
+
30
+ /// Show detailed statistics about an LP problem
31
+ Info(InfoArgs),
32
+
33
+ /// Compare two LP files
34
+ #[cfg(feature = "diff")]
35
+ Diff(DiffArgs),
36
+
37
+ /// Convert LP file to another format
38
+ Convert(ConvertArgs),
39
+
40
+ /// Solve an LP problem using external solvers
41
+ #[cfg(feature = "lp-solvers")]
42
+ Solve(SolveArgs),
43
+ }
44
+
45
+ #[derive(ValueEnum, Clone, Debug, Default)]
46
+ pub enum OutputFormat {
47
+ /// Plain text output
48
+ #[default]
49
+ Text,
50
+ /// JSON output (requires 'serde' feature)
51
+ #[cfg(feature = "serde")]
52
+ Json,
53
+ /// YAML output (requires 'serde' feature)
54
+ #[cfg(feature = "serde")]
55
+ Yaml,
56
+ }
57
+
58
+ #[derive(clap::Args)]
59
+ pub struct ParseArgs {
60
+ /// Path to the LP file
61
+ pub file: PathBuf,
62
+
63
+ /// Write output to file instead of stdout
64
+ #[arg(short, long)]
65
+ pub output: Option<PathBuf>,
66
+
67
+ /// Output format
68
+ #[arg(short, long, value_enum, default_value = "text")]
69
+ pub format: OutputFormat,
70
+
71
+ /// Pretty-print structured output (for JSON/YAML)
72
+ #[arg(long)]
73
+ pub pretty: bool,
74
+ }
75
+
76
+ #[derive(clap::Args)]
77
+ #[allow(clippy::struct_excessive_bools)]
78
+ pub struct InfoArgs {
79
+ /// Path to the LP file
80
+ pub file: PathBuf,
81
+
82
+ /// Write output to file instead of stdout
83
+ #[arg(short, long)]
84
+ pub output: Option<PathBuf>,
85
+
86
+ /// Output format
87
+ #[arg(short, long, value_enum, default_value = "text")]
88
+ pub format: OutputFormat,
89
+
90
+ /// Pretty-print structured output
91
+ #[arg(long)]
92
+ pub pretty: bool,
93
+
94
+ /// List all variables with their types
95
+ #[arg(long)]
96
+ pub variables: bool,
97
+
98
+ /// List all constraints
99
+ #[arg(long)]
100
+ pub constraints: bool,
101
+
102
+ /// List all objectives
103
+ #[arg(long)]
104
+ pub objectives: bool,
105
+ }
106
+
107
+ #[cfg(feature = "diff")]
108
+ #[derive(clap::Args)]
109
+ pub struct DiffArgs {
110
+ /// First LP file (base)
111
+ pub file1: PathBuf,
112
+
113
+ /// Second LP file (to compare against)
114
+ pub file2: PathBuf,
115
+
116
+ /// Write output to file instead of stdout
117
+ #[arg(short, long)]
118
+ pub output: Option<PathBuf>,
119
+
120
+ /// Output format
121
+ #[arg(short, long, value_enum, default_value = "text")]
122
+ pub format: OutputFormat,
123
+
124
+ /// Pretty-print structured output
125
+ #[arg(long)]
126
+ pub pretty: bool,
127
+ }
128
+
129
+ #[derive(ValueEnum, Clone, Debug, Default)]
130
+ pub enum ConvertFormat {
131
+ /// LP file format
132
+ #[default]
133
+ Lp,
134
+ /// CSV files (constraints.csv, objectives.csv, variables.csv)
135
+ #[cfg(feature = "csv")]
136
+ Csv,
137
+ /// JSON format
138
+ #[cfg(feature = "serde")]
139
+ Json,
140
+ /// YAML format
141
+ #[cfg(feature = "serde")]
142
+ Yaml,
143
+ }
144
+
145
+ #[derive(clap::Args)]
146
+ pub struct ConvertArgs {
147
+ /// Path to the LP file
148
+ pub file: PathBuf,
149
+
150
+ /// Output file or directory (required for CSV)
151
+ #[arg(short, long)]
152
+ pub output: Option<PathBuf>,
153
+
154
+ /// Target format
155
+ #[arg(short, long, value_enum, default_value = "lp")]
156
+ pub format: ConvertFormat,
157
+
158
+ /// Pretty-print output (for JSON/YAML)
159
+ #[arg(long)]
160
+ pub pretty: bool,
161
+
162
+ /// Decimal precision for numbers
163
+ #[arg(long, default_value = "6")]
164
+ pub precision: usize,
165
+
166
+ /// Maximum line length before wrapping
167
+ #[arg(long, default_value = "80")]
168
+ pub max_line_length: usize,
169
+
170
+ /// Omit problem name comment in LP output
171
+ #[arg(long)]
172
+ pub no_problem_name: bool,
173
+
174
+ /// Compact output (no spacing between sections)
175
+ #[arg(long)]
176
+ pub compact: bool,
177
+ }
178
+
179
+ #[cfg(feature = "lp-solvers")]
180
+ #[derive(ValueEnum, Clone, Debug, Default)]
181
+ pub enum Solver {
182
+ /// CBC solver
183
+ #[default]
184
+ Cbc,
185
+ /// Gurobi solver
186
+ Gurobi,
187
+ /// CPLEX solver
188
+ Cplex,
189
+ /// GLPK solver
190
+ Glpk,
191
+ }
192
+
193
+ #[cfg(feature = "lp-solvers")]
194
+ #[derive(clap::Args)]
195
+ pub struct SolveArgs {
196
+ /// Path to the LP file
197
+ pub file: PathBuf,
198
+
199
+ /// Solver to use
200
+ #[arg(short, long, value_enum, default_value = "cbc")]
201
+ pub solver: Solver,
202
+
203
+ /// Write solution to file instead of stdout
204
+ #[arg(short, long)]
205
+ pub output: Option<PathBuf>,
206
+
207
+ /// Output format
208
+ #[arg(short, long, value_enum, default_value = "text")]
209
+ pub format: OutputFormat,
210
+
211
+ /// Pretty-print structured output
212
+ #[arg(long)]
213
+ pub pretty: bool,
214
+ }