mnenv 0.1.0 → 0.1.2

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 (306) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/PROPOSAL.md +197 -0
  4. data/README.adoc +168 -461
  5. data/Rakefile +7 -4
  6. data/bin/Install-Mnenv.ps1 +145 -0
  7. data/bin/mnenv-installer +72 -0
  8. data/completions/bash +47 -0
  9. data/completions/fish +29 -0
  10. data/completions/powershell.ps1 +94 -0
  11. data/completions/zsh +43 -0
  12. data/lib/mnenv/binary_repository.rb +189 -0
  13. data/lib/mnenv/chocolatey.rb +7 -0
  14. data/lib/mnenv/cli.rb +110 -10
  15. data/lib/mnenv/commands/available_command.rb +169 -0
  16. data/lib/mnenv/commands/chocolatey_command.rb +4 -5
  17. data/lib/mnenv/commands/gemfile_command.rb +4 -5
  18. data/lib/mnenv/commands/homebrew_command.rb +4 -5
  19. data/lib/mnenv/commands/install_command.rb +234 -0
  20. data/lib/mnenv/commands/snap_command.rb +5 -7
  21. data/lib/mnenv/commands/uninstall_command.rb +111 -0
  22. data/lib/mnenv/commands/version_command.rb +167 -0
  23. data/lib/mnenv/commands.rb +9 -4
  24. data/lib/mnenv/gemfile/extractor.rb +10 -3
  25. data/lib/mnenv/gemfile.rb +8 -0
  26. data/lib/mnenv/gemfile_repository.rb +0 -2
  27. data/lib/mnenv/homebrew.rb +7 -0
  28. data/lib/mnenv/installer/base.rb +62 -0
  29. data/lib/mnenv/installer/factory.rb +46 -0
  30. data/lib/mnenv/installer.rb +12 -0
  31. data/lib/mnenv/installers/binary_installer.rb +242 -0
  32. data/lib/mnenv/installers/gemfile_installer.rb +76 -0
  33. data/lib/mnenv/json_formatter.rb +3 -13
  34. data/lib/mnenv/logger.rb +9 -1
  35. data/lib/mnenv/models/binary_version.rb +78 -0
  36. data/lib/mnenv/models/chocolatey_version.rb +7 -0
  37. data/lib/mnenv/models/gemfile_version.rb +19 -5
  38. data/lib/mnenv/models/homebrew_version.rb +7 -0
  39. data/lib/mnenv/models/snap_version.rb +8 -0
  40. data/lib/mnenv/models/version.rb +16 -0
  41. data/lib/mnenv/models.rb +7 -5
  42. data/lib/mnenv/paths.rb +69 -0
  43. data/lib/mnenv/platform_detector.rb +109 -0
  44. data/lib/mnenv/repository.rb +50 -35
  45. data/lib/mnenv/resolver +72 -0
  46. data/lib/mnenv/shells/base.rb +32 -0
  47. data/lib/mnenv/shells/bash.rb +72 -0
  48. data/lib/mnenv/shells/cmd.rb +108 -0
  49. data/lib/mnenv/shells/factory.rb +82 -0
  50. data/lib/mnenv/shells/power_shell.rb +110 -0
  51. data/lib/mnenv/shim_manager.rb +121 -0
  52. data/lib/mnenv/snap.rb +7 -0
  53. data/lib/mnenv/snap_repository.rb +2 -19
  54. data/lib/mnenv/source_registry.rb +69 -0
  55. data/lib/mnenv/sources.rb +46 -0
  56. data/lib/mnenv/version.rb +1 -1
  57. data/lib/mnenv/version_resolver.rb +108 -0
  58. data/lib/mnenv/versions_manager.rb +92 -0
  59. data/lib/mnenv.rb +6 -0
  60. data/mnenv.gemspec +4 -1
  61. data/scripts/cross-source-switching-test.sh +214 -0
  62. data/scripts/integration-test.sh +89 -0
  63. data/scripts/version-switching-test.sh +151 -0
  64. metadata +85 -247
  65. data/data/chocolatey/versions.yaml +0 -812
  66. data/data/gemfile/v1.1.6/Gemfile +0 -4
  67. data/data/gemfile/v1.1.6/Gemfile.lock.archived +0 -232
  68. data/data/gemfile/v1.1.7/Gemfile +0 -4
  69. data/data/gemfile/v1.1.7/Gemfile.lock.archived +0 -235
  70. data/data/gemfile/v1.1.8/Gemfile +0 -4
  71. data/data/gemfile/v1.1.8/Gemfile.lock.archived +0 -238
  72. data/data/gemfile/v1.10.0/Gemfile +0 -5
  73. data/data/gemfile/v1.10.0/Gemfile.lock.archived +0 -930
  74. data/data/gemfile/v1.10.1/Gemfile +0 -5
  75. data/data/gemfile/v1.10.1/Gemfile.lock.archived +0 -929
  76. data/data/gemfile/v1.10.10/Gemfile +0 -5
  77. data/data/gemfile/v1.10.10/Gemfile.lock.archived +0 -973
  78. data/data/gemfile/v1.10.11/Gemfile +0 -5
  79. data/data/gemfile/v1.10.11/Gemfile.lock.archived +0 -975
  80. data/data/gemfile/v1.10.2/Gemfile +0 -5
  81. data/data/gemfile/v1.10.2/Gemfile.lock.archived +0 -939
  82. data/data/gemfile/v1.10.3/Gemfile +0 -5
  83. data/data/gemfile/v1.10.3/Gemfile.lock.archived +0 -946
  84. data/data/gemfile/v1.10.5/Gemfile +0 -5
  85. data/data/gemfile/v1.10.5/Gemfile.lock.archived +0 -958
  86. data/data/gemfile/v1.10.6/Gemfile +0 -5
  87. data/data/gemfile/v1.10.6/Gemfile.lock.archived +0 -969
  88. data/data/gemfile/v1.10.7/Gemfile +0 -5
  89. data/data/gemfile/v1.10.7/Gemfile.lock.archived +0 -969
  90. data/data/gemfile/v1.10.8/Gemfile +0 -5
  91. data/data/gemfile/v1.10.8/Gemfile.lock.archived +0 -968
  92. data/data/gemfile/v1.10.9/Gemfile +0 -5
  93. data/data/gemfile/v1.10.9/Gemfile.lock.archived +0 -972
  94. data/data/gemfile/v1.11.0/Gemfile +0 -5
  95. data/data/gemfile/v1.11.0/Gemfile.lock.archived +0 -971
  96. data/data/gemfile/v1.11.1/Gemfile +0 -5
  97. data/data/gemfile/v1.11.1/Gemfile.lock.archived +0 -975
  98. data/data/gemfile/v1.11.4/Gemfile +0 -5
  99. data/data/gemfile/v1.11.4/Gemfile.lock.archived +0 -1046
  100. data/data/gemfile/v1.11.5/Gemfile +0 -5
  101. data/data/gemfile/v1.11.5/Gemfile.lock.archived +0 -1047
  102. data/data/gemfile/v1.12.10/Gemfile +0 -3
  103. data/data/gemfile/v1.12.10/Gemfile.lock.archived +0 -1073
  104. data/data/gemfile/v1.12.3/Gemfile +0 -3
  105. data/data/gemfile/v1.12.3/Gemfile.lock.archived +0 -1050
  106. data/data/gemfile/v1.12.4/Gemfile +0 -3
  107. data/data/gemfile/v1.12.4/Gemfile.lock.archived +0 -1056
  108. data/data/gemfile/v1.12.5/Gemfile +0 -3
  109. data/data/gemfile/v1.12.5/Gemfile.lock.archived +0 -1054
  110. data/data/gemfile/v1.12.6/Gemfile +0 -3
  111. data/data/gemfile/v1.12.6/Gemfile.lock.archived +0 -1056
  112. data/data/gemfile/v1.12.8/Gemfile +0 -3
  113. data/data/gemfile/v1.12.8/Gemfile.lock.archived +0 -1063
  114. data/data/gemfile/v1.13.0/Gemfile +0 -3
  115. data/data/gemfile/v1.13.0/Gemfile.lock.archived +0 -1074
  116. data/data/gemfile/v1.13.2/Gemfile +0 -3
  117. data/data/gemfile/v1.13.2/Gemfile.lock.archived +0 -899
  118. data/data/gemfile/v1.13.3/Gemfile +0 -3
  119. data/data/gemfile/v1.13.3/Gemfile.lock.archived +0 -938
  120. data/data/gemfile/v1.13.4/Gemfile +0 -3
  121. data/data/gemfile/v1.13.4/Gemfile.lock.archived +0 -938
  122. data/data/gemfile/v1.13.5/Gemfile +0 -3
  123. data/data/gemfile/v1.13.5/Gemfile.lock.archived +0 -944
  124. data/data/gemfile/v1.13.7/Gemfile +0 -3
  125. data/data/gemfile/v1.13.7/Gemfile.lock.archived +0 -944
  126. data/data/gemfile/v1.13.8/Gemfile +0 -3
  127. data/data/gemfile/v1.13.8/Gemfile.lock.archived +0 -944
  128. data/data/gemfile/v1.13.9/Gemfile +0 -3
  129. data/data/gemfile/v1.13.9/Gemfile.lock.archived +0 -956
  130. data/data/gemfile/v1.14.3/Gemfile +0 -3
  131. data/data/gemfile/v1.14.3/Gemfile.lock.archived +0 -950
  132. data/data/gemfile/v1.2.12/Gemfile +0 -3
  133. data/data/gemfile/v1.2.12/Gemfile.lock.archived +0 -283
  134. data/data/gemfile/v1.2.2/Gemfile +0 -4
  135. data/data/gemfile/v1.2.2/Gemfile.lock.archived +0 -224
  136. data/data/gemfile/v1.2.3/Gemfile +0 -4
  137. data/data/gemfile/v1.2.3/Gemfile.lock.archived +0 -231
  138. data/data/gemfile/v1.2.6/Gemfile +0 -4
  139. data/data/gemfile/v1.2.6/Gemfile.lock.archived +0 -239
  140. data/data/gemfile/v1.2.8/Gemfile +0 -4
  141. data/data/gemfile/v1.2.8/Gemfile.lock.archived +0 -233
  142. data/data/gemfile/v1.2.9/Gemfile +0 -4
  143. data/data/gemfile/v1.2.9/Gemfile.lock.archived +0 -245
  144. data/data/gemfile/v1.3.1/Gemfile +0 -3
  145. data/data/gemfile/v1.3.1/Gemfile.lock.archived +0 -296
  146. data/data/gemfile/v1.3.2/Gemfile +0 -3
  147. data/data/gemfile/v1.3.2/Gemfile.lock.archived +0 -296
  148. data/data/gemfile/v1.3.4/Gemfile +0 -3
  149. data/data/gemfile/v1.3.4/Gemfile.lock.archived +0 -284
  150. data/data/gemfile/v1.3.5/Gemfile +0 -3
  151. data/data/gemfile/v1.3.5/Gemfile.lock.archived +0 -284
  152. data/data/gemfile/v1.3.6/Gemfile +0 -3
  153. data/data/gemfile/v1.3.6/Gemfile.lock.archived +0 -286
  154. data/data/gemfile/v1.3.9/Gemfile +0 -3
  155. data/data/gemfile/v1.3.9/Gemfile.lock.archived +0 -334
  156. data/data/gemfile/v1.4.0/Gemfile +0 -3
  157. data/data/gemfile/v1.4.0/Gemfile.lock.archived +0 -330
  158. data/data/gemfile/v1.4.10/Gemfile +0 -4
  159. data/data/gemfile/v1.4.10/Gemfile.lock.archived +0 -461
  160. data/data/gemfile/v1.4.11/Gemfile +0 -4
  161. data/data/gemfile/v1.4.11/Gemfile.lock.archived +0 -452
  162. data/data/gemfile/v1.4.12/Gemfile +0 -4
  163. data/data/gemfile/v1.4.12/Gemfile.lock.archived +0 -452
  164. data/data/gemfile/v1.4.13/Gemfile +0 -4
  165. data/data/gemfile/v1.4.13/Gemfile.lock.archived +0 -455
  166. data/data/gemfile/v1.4.14/Gemfile +0 -4
  167. data/data/gemfile/v1.4.14/Gemfile.lock.archived +0 -456
  168. data/data/gemfile/v1.4.18/Gemfile +0 -3
  169. data/data/gemfile/v1.4.18/Gemfile.lock.archived +0 -486
  170. data/data/gemfile/v1.4.3/Gemfile +0 -3
  171. data/data/gemfile/v1.4.3/Gemfile.lock.archived +0 -339
  172. data/data/gemfile/v1.4.4/Gemfile +0 -3
  173. data/data/gemfile/v1.4.4/Gemfile.lock.archived +0 -339
  174. data/data/gemfile/v1.4.5/Gemfile +0 -3
  175. data/data/gemfile/v1.4.5/Gemfile.lock.archived +0 -348
  176. data/data/gemfile/v1.4.6/Gemfile +0 -3
  177. data/data/gemfile/v1.4.6/Gemfile.lock.archived +0 -357
  178. data/data/gemfile/v1.4.7/Gemfile +0 -3
  179. data/data/gemfile/v1.4.7/Gemfile.lock.archived +0 -391
  180. data/data/gemfile/v1.4.8/Gemfile +0 -3
  181. data/data/gemfile/v1.4.8/Gemfile.lock.archived +0 -445
  182. data/data/gemfile/v1.4.9/Gemfile +0 -3
  183. data/data/gemfile/v1.4.9/Gemfile.lock.archived +0 -448
  184. data/data/gemfile/v1.5.0/Gemfile +0 -3
  185. data/data/gemfile/v1.5.0/Gemfile.lock.archived +0 -478
  186. data/data/gemfile/v1.5.10/Gemfile +0 -3
  187. data/data/gemfile/v1.5.10/Gemfile.lock.archived +0 -668
  188. data/data/gemfile/v1.5.11/Gemfile +0 -3
  189. data/data/gemfile/v1.5.11/Gemfile.lock.archived +0 -668
  190. data/data/gemfile/v1.5.15/Gemfile +0 -3
  191. data/data/gemfile/v1.5.15/Gemfile.lock.archived +0 -686
  192. data/data/gemfile/v1.5.16/Gemfile +0 -3
  193. data/data/gemfile/v1.5.16/Gemfile.lock.archived +0 -684
  194. data/data/gemfile/v1.5.17/Gemfile +0 -3
  195. data/data/gemfile/v1.5.17/Gemfile.lock.archived +0 -684
  196. data/data/gemfile/v1.5.18/Gemfile +0 -5
  197. data/data/gemfile/v1.5.18/Gemfile.lock.archived +0 -691
  198. data/data/gemfile/v1.5.19/Gemfile +0 -5
  199. data/data/gemfile/v1.5.19/Gemfile.lock.archived +0 -703
  200. data/data/gemfile/v1.5.20/Gemfile +0 -5
  201. data/data/gemfile/v1.5.20/Gemfile.lock.archived +0 -703
  202. data/data/gemfile/v1.5.21/Gemfile +0 -5
  203. data/data/gemfile/v1.5.21/Gemfile.lock.archived +0 -707
  204. data/data/gemfile/v1.5.22/Gemfile +0 -5
  205. data/data/gemfile/v1.5.22/Gemfile.lock.archived +0 -707
  206. data/data/gemfile/v1.5.23/Gemfile +0 -5
  207. data/data/gemfile/v1.5.23/Gemfile.lock.archived +0 -711
  208. data/data/gemfile/v1.5.24/Gemfile +0 -5
  209. data/data/gemfile/v1.5.24/Gemfile.lock.archived +0 -711
  210. data/data/gemfile/v1.5.3/Gemfile +0 -3
  211. data/data/gemfile/v1.5.3/Gemfile.lock.archived +0 -651
  212. data/data/gemfile/v1.5.4/Gemfile +0 -3
  213. data/data/gemfile/v1.5.4/Gemfile.lock.archived +0 -657
  214. data/data/gemfile/v1.5.5/Gemfile +0 -3
  215. data/data/gemfile/v1.5.5/Gemfile.lock.archived +0 -657
  216. data/data/gemfile/v1.5.6/Gemfile +0 -3
  217. data/data/gemfile/v1.5.6/Gemfile.lock.archived +0 -657
  218. data/data/gemfile/v1.5.7/Gemfile +0 -3
  219. data/data/gemfile/v1.5.7/Gemfile.lock.archived +0 -657
  220. data/data/gemfile/v1.5.8/Gemfile +0 -3
  221. data/data/gemfile/v1.5.8/Gemfile.lock.archived +0 -655
  222. data/data/gemfile/v1.5.9/Gemfile +0 -3
  223. data/data/gemfile/v1.5.9/Gemfile.lock.archived +0 -656
  224. data/data/gemfile/v1.6.1/Gemfile +0 -5
  225. data/data/gemfile/v1.6.1/Gemfile.lock.archived +0 -721
  226. data/data/gemfile/v1.6.10/Gemfile +0 -5
  227. data/data/gemfile/v1.6.10/Gemfile.lock.archived +0 -744
  228. data/data/gemfile/v1.6.11/Gemfile +0 -5
  229. data/data/gemfile/v1.6.11/Gemfile.lock.archived +0 -744
  230. data/data/gemfile/v1.6.12/Gemfile +0 -5
  231. data/data/gemfile/v1.6.12/Gemfile.lock.archived +0 -745
  232. data/data/gemfile/v1.6.13/Gemfile +0 -5
  233. data/data/gemfile/v1.6.13/Gemfile.lock.archived +0 -745
  234. data/data/gemfile/v1.6.14/Gemfile +0 -5
  235. data/data/gemfile/v1.6.14/Gemfile.lock.archived +0 -754
  236. data/data/gemfile/v1.6.15/Gemfile +0 -5
  237. data/data/gemfile/v1.6.15/Gemfile.lock.archived +0 -757
  238. data/data/gemfile/v1.6.2/Gemfile +0 -5
  239. data/data/gemfile/v1.6.2/Gemfile.lock.archived +0 -718
  240. data/data/gemfile/v1.6.3/Gemfile +0 -5
  241. data/data/gemfile/v1.6.3/Gemfile.lock.archived +0 -728
  242. data/data/gemfile/v1.6.4/Gemfile +0 -5
  243. data/data/gemfile/v1.6.4/Gemfile.lock.archived +0 -730
  244. data/data/gemfile/v1.6.5/Gemfile +0 -5
  245. data/data/gemfile/v1.6.5/Gemfile.lock.archived +0 -733
  246. data/data/gemfile/v1.6.6/Gemfile +0 -5
  247. data/data/gemfile/v1.6.6/Gemfile.lock.archived +0 -733
  248. data/data/gemfile/v1.6.7/Gemfile +0 -5
  249. data/data/gemfile/v1.6.7/Gemfile.lock.archived +0 -733
  250. data/data/gemfile/v1.6.9/Gemfile +0 -5
  251. data/data/gemfile/v1.6.9/Gemfile.lock.archived +0 -744
  252. data/data/gemfile/v1.7.0/Gemfile +0 -5
  253. data/data/gemfile/v1.7.0/Gemfile.lock.archived +0 -750
  254. data/data/gemfile/v1.7.1/Gemfile +0 -5
  255. data/data/gemfile/v1.7.1/Gemfile.lock.archived +0 -750
  256. data/data/gemfile/v1.7.2/Gemfile +0 -5
  257. data/data/gemfile/v1.7.2/Gemfile.lock.archived +0 -747
  258. data/data/gemfile/v1.7.3/Gemfile +0 -5
  259. data/data/gemfile/v1.7.3/Gemfile.lock.archived +0 -755
  260. data/data/gemfile/v1.7.4/Gemfile +0 -5
  261. data/data/gemfile/v1.7.4/Gemfile.lock.archived +0 -756
  262. data/data/gemfile/v1.7.5/Gemfile +0 -5
  263. data/data/gemfile/v1.7.5/Gemfile.lock.archived +0 -759
  264. data/data/gemfile/v1.7.6/Gemfile +0 -5
  265. data/data/gemfile/v1.7.6/Gemfile.lock.archived +0 -768
  266. data/data/gemfile/v1.8.10/Gemfile +0 -5
  267. data/data/gemfile/v1.8.10/Gemfile.lock.archived +0 -792
  268. data/data/gemfile/v1.8.11/Gemfile +0 -5
  269. data/data/gemfile/v1.8.11/Gemfile.lock.archived +0 -862
  270. data/data/gemfile/v1.8.3/Gemfile +0 -5
  271. data/data/gemfile/v1.8.3/Gemfile.lock.archived +0 -773
  272. data/data/gemfile/v1.8.4/Gemfile +0 -5
  273. data/data/gemfile/v1.8.4/Gemfile.lock.archived +0 -768
  274. data/data/gemfile/v1.8.5/Gemfile +0 -5
  275. data/data/gemfile/v1.8.5/Gemfile.lock.archived +0 -768
  276. data/data/gemfile/v1.8.6/Gemfile +0 -5
  277. data/data/gemfile/v1.8.6/Gemfile.lock.archived +0 -777
  278. data/data/gemfile/v1.8.7/Gemfile +0 -5
  279. data/data/gemfile/v1.8.7/Gemfile.lock.archived +0 -777
  280. data/data/gemfile/v1.8.8/Gemfile +0 -5
  281. data/data/gemfile/v1.8.8/Gemfile.lock.archived +0 -778
  282. data/data/gemfile/v1.8.9/Gemfile +0 -5
  283. data/data/gemfile/v1.8.9/Gemfile.lock.archived +0 -775
  284. data/data/gemfile/v1.9.0/Gemfile +0 -5
  285. data/data/gemfile/v1.9.0/Gemfile.lock.archived +0 -871
  286. data/data/gemfile/v1.9.1/Gemfile +0 -5
  287. data/data/gemfile/v1.9.1/Gemfile.lock.archived +0 -906
  288. data/data/gemfile/v1.9.2/Gemfile +0 -5
  289. data/data/gemfile/v1.9.2/Gemfile.lock.archived +0 -898
  290. data/data/gemfile/v1.9.3/Gemfile +0 -5
  291. data/data/gemfile/v1.9.3/Gemfile.lock.archived +0 -898
  292. data/data/gemfile/v1.9.4/Gemfile +0 -5
  293. data/data/gemfile/v1.9.4/Gemfile.lock.archived +0 -901
  294. data/data/gemfile/v1.9.5/Gemfile +0 -5
  295. data/data/gemfile/v1.9.5/Gemfile.lock.archived +0 -903
  296. data/data/gemfile/v1.9.6/Gemfile +0 -5
  297. data/data/gemfile/v1.9.6/Gemfile.lock.archived +0 -900
  298. data/data/gemfile/v1.9.7/Gemfile +0 -5
  299. data/data/gemfile/v1.9.7/Gemfile.lock.archived +0 -922
  300. data/data/gemfile/v1.9.8/Gemfile +0 -5
  301. data/data/gemfile/v1.9.8/Gemfile.lock.archived +0 -933
  302. data/data/gemfile/versions.yaml +0 -751
  303. data/data/homebrew/versions.yaml +0 -567
  304. data/data/snap/github_tags.json +0 -42
  305. data/data/snap/versions.yaml +0 -589
  306. data/snapcraft-list-copied-from-site.md +0 -101
data/README.adoc CHANGED
@@ -1,527 +1,270 @@
1
- = Metanorma Versions
1
+ = mnenv
2
2
 
3
- image:https://img.shields.io/github/license/metanorma/versions[License]
4
- image:https://github.com/metanorma/versions/actions/workflows/rake.yml/badge.svg[Rake]
3
+ image:https://img.shields.io/gem/v/mnenv.svg[RubyGems Version]
4
+ image:https://img.shields.io/github/license/metanorma/mnenv.svg[License]
5
+ image:https://github.com/metanorma/mnenv/actions/workflows/rake.yml/badge.svg["Build", link="https://github.com/metanorma/mnenv/actions/workflows/rake.yml"]
5
6
 
6
- Version discovery and management for Metanorma across multiple package sources.
7
+ Version manager for Metanorma, similar to rbenv/pyenv.
7
8
 
8
9
  == Purpose
9
10
 
10
- This repository provides a unified interface for discovering and managing Metanorma versions from various sources:
11
+ mnenv is a version manager for Metanorma that allows you to:
11
12
 
12
- * **Gemfile (Docker)** - Docker Hub images with Gemfile/Gemfile.lock.archived extraction
13
- * **Snap** - Snapcraft snap packages with revision tracking
14
- * **Homebrew** - macOS Homebrew formula versions from GitHub tags
15
- * **Chocolatey** - Windows Chocolatey packages
13
+ * Install and manage multiple Metanorma versions
14
+ * Switch between versions globally, per-project, or per-shell session
15
+ * Install from multiple sources: RubyGems (gemfile) or pre-built binaries
16
16
 
17
- This enables link:{https://github.com/metanorma/actions-mn/setup}[actions-mn/setup] to provide version selection across all platforms.
18
-
19
- === Historical Gemfile Lock Archive
20
-
21
- This repository also stores Gemfile and Gemfile.lock.archived files extracted from
22
- https://hub.docker.com/r/metanorma/metanorma[Docker Hub: metanorma/metanorma]
23
- Docker containers for each version of Metanorma.
24
-
25
- When deploying or using Metanorma, you may need to install the exact same gem
26
- versions that are used in a specific Docker container release. This repository
27
- provides the Gemfile and Gemfile.lock.archived files for each version of the
28
- metanorma/metanorma Docker image, allowing you to replicate the exact gem
29
- dependency set.
17
+ Version data is sourced from the
18
+ https://github.com/metanorma/versions[metanorma/versions] repository.
30
19
 
31
20
  == Features
32
21
 
33
- * *Unified CLI* - Single `mnenv` command to query and manage versions from all sources
34
- * *YAML Storage* - Version data stored in `data/` directory for easy inspection
35
- * *JSON Output* - CLI commands output JSON for GitHub Actions consumption
36
- * *Extraction Modes* - Incremental, replace, and revamp modes for Gemfile extraction
37
- * *Model-Driven OOP* - Built with lutaml-model for proper data serialization
22
+ * *Multiple Installation Sources* - Install from RubyGems (gemfile) or pre-built binaries
23
+ * *Version Switching* - Switch versions globally, per-project, or per-shell session
24
+ * *Shell Integration* - Automatic PATH management via shims
25
+ * *Cross-Platform* - Works on Linux, macOS, and Windows
26
+ * *Offline Capable* - Version data cached locally for fast operation
38
27
 
39
- == Setting Up
28
+ == Installation
40
29
 
41
- Clone this repository and install dependencies:
30
+ === As a Ruby gem
42
31
 
43
32
  [source,shell]
44
33
  ----
45
- git clone https://github.com/metanorma/versions.git
46
- cd versions
47
- bundle install
34
+ gem install mnenv
48
35
  ----
49
36
 
50
- == Usage
51
-
52
- === CLI commands
53
-
54
- The `mnenv` command provides subcommands for each platform:
37
+ === From source
55
38
 
56
39
  [source,shell]
57
40
  ----
58
- # List Gemfile (Ruby) versions
59
- bundle exec exe/mnenv gemfile list
60
-
61
- # List Snap versions
62
- bundle exec exe/mnenv snap list
63
-
64
- # List Homebrew versions
65
- bundle exec exe/mnenv homebrew list
66
-
67
- # List Chocolatey versions
68
- bundle exec exe/mnenv chocolatey list
69
-
70
- # List all versions in text format
71
- bundle exec exe/mnenv list-all
72
-
73
- # List all versions in JSON format
74
- bundle exec exe/mnenv list-all -f json
75
-
76
- # Get info for a specific version
77
- bundle exec exe/mnenv info gemfile 1.14.4
78
-
79
- # Show mnenv version
80
- bundle exec exe/mnenv version
41
+ git clone https://github.com/metanorma/mnenv.git
42
+ cd mnenv
43
+ bundle install
44
+ bundle exec rake install
81
45
  ----
82
46
 
83
- === Updating version data
47
+ === Shell setup
84
48
 
85
- Each platform supports three modes of updating version data:
49
+ After installation, add mnenv shims to your PATH:
86
50
 
87
- * *refresh* - Incremental mode: fetch only new versions not present locally
88
- * *revamp* - Re-fetch all versions, replacing existing data
89
- * *update VERSION* - Update a specific version
51
+ ==== Bash
90
52
 
91
- .Gemfile (Docker) updates
92
- [source,shell]
93
- ----
94
- # Extract only missing versions (incremental mode)
95
- bundle exec exe/mnenv gemfile refresh
96
-
97
- # Replace a single version
98
- bundle exec exe/mnenv gemfile update 1.14.4
99
-
100
- # Re-extract all versions
101
- bundle exec exe/mnenv gemfile revamp
102
- ----
53
+ Add to `~/.bashrc`:
103
54
 
104
- .Snap updates
105
55
  [source,shell]
106
56
  ----
107
- # Fetch and add new Snap versions (preserves historical data)
108
- bundle exec exe/mnenv snap refresh
109
-
110
- # Update a specific Snap version (updates all arch/channel combinations)
111
- bundle exec exe/mnenv snap update 1.14.4
112
-
113
- NOTE: Snap does not support 'revamp' mode because historical revision data
114
- would be lost. The YAML file (data/snap/versions.yaml) is the single source
115
- of truth containing both historical Snapcraft revisions and current API data.
116
- ----
117
-
118
- .Homebrew updates
119
- [source,shell]
57
+ export PATH="$HOME/.mnenv/shims:$PATH"
120
58
  ----
121
- # Fetch and add new Homebrew versions
122
- bundle exec exe/mnenv homebrew refresh
123
59
 
124
- # Update a specific Homebrew version
125
- bundle exec exe/mnenv homebrew update 1.13.0
60
+ ==== Zsh
126
61
 
127
- # Re-fetch all Homebrew versions
128
- bundle exec exe/mnenv homebrew revamp
129
- ----
62
+ Add to `~/.zshrc`:
130
63
 
131
- .Chocolatey updates
132
64
  [source,shell]
133
65
  ----
134
- # Fetch and add new Chocolatey versions
135
- bundle exec exe/mnenv chocolatey refresh
136
-
137
- # Update a specific Chocolatey version
138
- bundle exec exe/mnenv chocolatey update 1.14.4
139
-
140
- # Re-fetch all Chocolatey versions
141
- bundle exec exe/mnenv chocolatey revamp
66
+ export PATH="$HOME/.mnenv/shims:$PATH"
142
67
  ----
143
68
 
144
- .Extraction modes
145
-
146
- incremental:: Extract only versions that are not present locally. This is the default mode and is used for daily scheduled runs.
147
-
148
- replace:: Re-extract a single version, replacing any existing files. Use this to fix corrupted or outdated extractions.
149
-
150
- revamp:: Re-extract all versions, replacing all existing files. Use this when the data model changes or you need to refresh all versions.
151
-
152
- === Ruby API
153
-
154
- Query versions programmatically:
69
+ ==== Fish
155
70
 
156
- [source,ruby]
157
- ----
158
- require 'mnenv'
159
-
160
- # Gemfile versions
161
- gemfile_repo = Mnenv::GemfileRepository.new
162
- gemfile_versions = gemfile_repo.all
163
- gemfile_latest = gemfile_repo.latest
164
-
165
- # Snap versions
166
- snap_repo = Mnenv::SnapRepository.new
167
- snap_versions = snap_repo.all
168
-
169
- # Homebrew versions
170
- homebrew_repo = Mnenv::HomebrewRepository.new
171
- homebrew_versions = homebrew_repo.all
172
-
173
- # Chocolatey versions
174
- chocolatey_repo = Mnenv::ChocolateyRepository.new
175
- chocolatey_versions = chocolatey_repo.all
176
- ----
177
-
178
- === JSON output
179
-
180
- For GitHub Actions integration, output JSON format:
71
+ Add to `~/.config/fish/config.fish`:
181
72
 
182
73
  [source,shell]
183
74
  ----
184
- bundle exec exe/mnenv list-all -f json
185
- ----
186
-
187
- Returns:
188
-
189
- [source,json]
190
- ----
191
- {
192
- "gemfile": {
193
- "count": 124,
194
- "latest": "1.14.4",
195
- "versions": [...]
196
- },
197
- "snap": {
198
- "count": 14,
199
- "latest": "1.14.4",
200
- "versions": [...]
201
- },
202
- "homebrew": {
203
- "count": 56,
204
- "latest": "1.13.0",
205
- "versions": [...]
206
- },
207
- "chocolatey": {
208
- "count": 144,
209
- "latest": "1.14.4",
210
- "versions": [...]
211
- }
212
- }
75
+ set -gx PATH $HOME/.mnenv/shims $PATH
213
76
  ----
214
77
 
215
- == Direct Usage
78
+ ==== PowerShell (Windows)
216
79
 
217
- === Reading version data from YAML files
80
+ Add to your PowerShell profile:
218
81
 
219
- The version data is stored in YAML files under `data/` directory. You can read these files directly:
220
-
221
- [source,shell]
82
+ [source,powershell]
222
83
  ----
223
- # View all Gemfile versions
224
- cat data/gemfile/versions.yaml
225
-
226
- # View all Snap versions with revisions
227
- cat data/snap/versions.yaml
228
-
229
- # View all Homebrew versions
230
- cat data/homebrew/versions.yaml
231
-
232
- # View all Chocolatey versions
233
- cat data/chocolatey/versions.yaml
84
+ $env:PATH = "$env:USERPROFILE\.mnenv\shims;$env:PATH"
234
85
  ----
235
86
 
236
- .Parsing YAML with `yq`
87
+ == Usage
88
+
89
+ === List available versions
237
90
 
238
91
  [source,shell]
239
92
  ----
240
- # Get the latest version from each source
241
- yq '.metadata.latest_version' data/gemfile/versions.yaml
242
- yq '.metadata.latest_version' data/snap/versions.yaml
243
- yq '.metadata.latest_version' data/homebrew/versions.yaml
244
- yq '.metadata.latest_version' data/chocolatey/versions.yaml
245
-
246
- # Get version count
247
- yq '.metadata.count' data/gemfile/versions.yaml
248
-
249
- # Get all version numbers
250
- yq '.versions[].version' data/gemfile/versions.yaml
251
-
252
- # Get specific version info (Snap example with revision)
253
- yq '.versions[] | select(.version == "1.14.4")' data/snap/versions.yaml
93
+ mnenv install --list
94
+ # or
95
+ mnenv install -l
254
96
  ----
255
97
 
256
- .Parsing YAML with Ruby
98
+ Shows all available Metanorma versions with platform availability:
257
99
 
258
- [source,ruby]
259
100
  ----
260
- require 'yaml'
101
+ Available Metanorma versions:
102
+ (gemfile = source build, binary = prebuilt for specific platforms)
261
103
 
262
- # Load Gemfile versions
263
- data = YAML.load_file('data/gemfile/versions.yaml')
264
- puts "Latest: #{data['metadata']['latest_version']}"
265
- puts "Count: #{data['metadata']['count']}"
104
+ 1.14.4 (gemfile, binary [linux, macos*, windows])
105
+ 1.14.3 (gemfile, binary [linux, macos*, windows])
106
+ 1.14.1 (binary [linux, macos*])
107
+ ...
266
108
 
267
- # Find specific version
268
- version_1_14_4 = data['versions'].find { |v| v['version'] == '1.14.4' }
109
+ Legend:
110
+ * Current version / platform
111
+ [installed: ...] = Already installed locally
112
+ Detected platform: macos
269
113
  ----
270
114
 
271
- === CLI queries for specific use cases
115
+ === Install a version
272
116
 
273
117
  [source,shell]
274
118
  ----
275
- # Get the latest version across all sources
276
- bundle exec exe/mnenv list-all -f json | jq -r '.[].latest'
119
+ # Install from gemfile (source build, requires dev tools)
120
+ mnenv install 1.14.4 --source gemfile
277
121
 
278
- # Check if a specific version exists in Snap
279
- bundle exec exe/mnenv snap list | grep "1.14.4"
122
+ # Install from binary (pre-built, no dev tools needed)
123
+ mnenv install 1.14.4 --source binary
280
124
 
281
- # Get Snap revision for a specific version/arch
282
- bundle exec exe/mnenv snap list | grep "1.14.4" | grep "amd64"
125
+ # Interactive installation
126
+ mnenv install -i
283
127
 
284
- # List all versions newer than 1.10.0
285
- bundle exec exe/mnenv gemfile list | awk '/v1\.(1[4-9]|[2-9][0-9])/ {print}'
286
-
287
- # Count versions per source
288
- bundle exec exe/mnenv gemfile list | wc -l
289
- bundle exec exe/mnenv snap list | wc -l
128
+ # List versions before installing
129
+ mnenv install --list
290
130
  ----
291
131
 
292
- === Using version data in scripts
293
-
294
- .Bash script to check for new versions
132
+ === List installed versions
295
133
 
296
134
  [source,shell]
297
135
  ----
298
- #!/bin/bash
299
- # check_versions.sh - Check if a version exists across all sources
300
-
301
- VERSION=$1
302
-
303
- if [ -z "$VERSION" ]; then
304
- echo "Usage: $0 <version>"
305
- exit 1
306
- fi
307
-
308
- echo "Checking version $VERSION across all sources..."
309
-
310
- # Check Gemfile
311
- if bundle exec exe/mnenv gemfile list | grep -q "$VERSION"; then
312
- echo "✓ Gemfile: $VERSION found"
313
- else
314
- echo "✗ Gemfile: $VERSION not found"
315
- fi
316
-
317
- # Check Snap
318
- if bundle exec exe/mnenv snap list | grep -q "$VERSION"; then
319
- echo "✓ Snap: $VERSION found"
320
- else
321
- echo "✗ Snap: $VERSION not found"
322
- fi
323
-
324
- # Check Homebrew
325
- if bundle exec exe/mnenv homebrew list | grep -q "$VERSION"; then
326
- echo "✓ Homebrew: $VERSION found"
327
- else
328
- echo "✗ Homebrew: $VERSION not found"
329
- fi
330
-
331
- # Check Chocolatey
332
- if bundle exec exe/mnenv chocolatey list | grep -q "$VERSION"; then
333
- echo "✓ Chocolatey: $VERSION found"
334
- else
335
- echo "✗ Chocolatey: $VERSION not found"
336
- fi
136
+ mnenv versions
337
137
  ----
338
138
 
339
- .Get Snap revision for a specific version
139
+ === Set version
340
140
 
341
141
  [source,shell]
342
142
  ----
343
- #!/bin/bash
344
- # get_snap_revision.sh - Get Snap revision for version/arch
143
+ # Set global version (affects all projects)
144
+ mnenv global 1.14.4
345
145
 
346
- VERSION=$1
347
- ARCH=${2:-amd64}
348
- CHANNEL=${3:-stable}
146
+ # Set global version with source
147
+ mnenv global 1.14.4 --source binary
349
148
 
350
- if [ -z "$VERSION" ]; then
351
- echo "Usage: $0 <version> [arch] [channel]"
352
- exit 1
353
- fi
149
+ # Set local version (affects current directory)
150
+ mnenv local 1.14.4
354
151
 
355
- # Get revision from YAML
356
- yq ".versions[] | select(.version == \"$VERSION\" and .arch == \"$ARCH\" and .channel == \"$CHANNEL\") | .revision" data/snap/versions.yaml
152
+ # Set shell version (affects current shell session only)
153
+ mnenv use 1.14.4
357
154
  ----
358
155
 
359
- .Compare versions across sources
360
-
361
- [source,ruby]
362
- ----
363
- #!/usr/bin/env ruby
364
- # compare_versions.rb - Compare version availability
365
-
366
- require 'json'
367
- require 'yaml'
368
-
369
- SOURCES = %w[gemfile snap homebrew chocolatey].freeze
370
-
371
- def load_versions(source)
372
- yaml_path = "data/#{source}/versions.yaml"
373
- return [] unless File.exist?(yaml_path)
374
-
375
- data = YAML.load_file(yaml_path)
376
- data['versions'].map { |v| v['version'] }.uniq
377
- end
378
-
379
- def compare(version)
380
- puts "Version #{version} availability:"
381
- SOURCES.each do |source|
382
- versions = load_versions(source)
383
- status = versions.include?(version) ? '✓' : '✗'
384
- puts " #{status} #{source}"
385
- end
386
- end
387
-
388
- # Usage: ruby compare_versions.rb 1.14.4
389
- compare(ARGV[0])
390
- ----
391
-
392
- === Getting Gemfile files for a version
156
+ === Uninstall a version
393
157
 
394
158
  [source,shell]
395
159
  ----
396
- # List versions that have Gemfiles extracted
397
- bundle exec exe/mnenv gemfile list | grep -E "v[0-9]"
398
-
399
- # Check if a specific version has Gemfiles
400
- if [ -f "data/gemfile/v1.14.4/Gemfile" ]; then
401
- echo "Gemfile exists for 1.14.4"
402
- cat data/gemfile/v1.14.4/Gemfile
403
- fi
160
+ mnenv uninstall 1.14.4
404
161
 
405
- # Copy Gemfiles to your project
406
- cp data/gemfile/v1.14.4/Gemfile /path/to/project/
407
- cp data/gemfile/v1.14.4/Gemfile.lock.archived /path/to/project/Gemfile.lock
162
+ # Force uninstall without confirmation
163
+ mnenv uninstall 1.14.4 --force
408
164
  ----
409
165
 
410
- === Snap-specific queries
411
-
412
- Snap versions use composite keys (version-revision-arch-channel). Query them:
166
+ === Show mnenv version
413
167
 
414
168
  [source,shell]
415
169
  ----
416
- # List all Snap versions with their revisions
417
- bundle exec exe/mnenv snap list
418
-
419
- # Get all revisions for a specific version
420
- bundle exec exe/mnenv snap list | grep "1.14.4"
421
-
422
- # Get AMD64 stable revision for a version
423
- yq '.versions[] | select(.version == "1.14.4" and .arch == "amd64" and .channel == "stable") | .revision' data/snap/versions.yaml
424
-
425
- # Get all architectures for a version
426
- yq '.versions[] | select(.version == "1.14.4") | .arch' data/snap/versions.yaml | sort -u
427
-
428
- # Get all channels for a version
429
- yq '.versions[] | select(.version == "1.14.4") | .channel' data/snap/versions.yaml | sort -u
170
+ mnenv version
430
171
  ----
431
172
 
432
- === JSON output for automation
173
+ === Update version data
433
174
 
434
175
  [source,shell]
435
176
  ----
436
- # Get all versions as JSON
437
- bundle exec exe/mnenv list-all -f json > versions.json
438
-
439
- # Query JSON with jq
440
- jq '.gemfile.latest' versions.json
441
- jq '.snap.versions[] | select(.version == "1.14.4")' versions.json
442
- jq '.homebrew.count' versions.json
443
-
444
- # Use in scripts
445
- LATEST=$(bundle exec exe/mnenv list-all -f json | jq -r '.gemfile.latest')
446
- echo "Latest Gemfile version: $LATEST"
177
+ # Update version data from metanorma/versions repository
178
+ mnenv update
447
179
  ----
448
180
 
449
- == Data structure
181
+ == Version Sources
450
182
 
451
- Version data is stored in YAML files under `data/`:
183
+ mnenv supports two installation sources:
452
184
 
453
- ----
454
- data/
455
- ├── gemfile/
456
- │ ├── versions.yaml # Gemfile version metadata
457
- │ └── v1.14.4/ # Gemfile extraction per version
458
- │ ├── Gemfile
459
- │ └── Gemfile.lock.archived
460
- ├── snap/
461
- │ └── versions.yaml # Snap versions with revision data
462
- ├── homebrew/
463
- │ └── versions.yaml # Homebrew versions from tags
464
- └── chocolatey/
465
- └── versions.yaml # Chocolatey versions
466
- ----
467
-
468
- === Version object structure
185
+ [width="100%",cols="25%,75%"]
186
+ |===
187
+ | Source | Description
469
188
 
470
- Each version object contains:
189
+ | `gemfile`
190
+ | RubyGems installation using Gemfile.
191
+ Requires development tools (Ruby, bundler).
192
+ Faster startup with lazy loading.
471
193
 
472
- [source,ruby]
473
- ----
474
- {
475
- "version": "1.14.4",
476
- "published_at": "2025-01-15T10:30:00Z",
477
- "parsed_at": "2025-01-15T10:30:00Z"
478
- }
479
- ----
194
+ | `binary`
195
+ | Pre-compiled binaries from
196
+ https://github.com/metanorma/packed-mn[packed-mn] releases.
197
+ No development tools required.
198
+ Full memory load at startup.
199
+ |===
480
200
 
481
- Additional fields per source:
201
+ == Version Resolution
482
202
 
483
- * **Gemfile** - `gemfile_exists`, `gemfile_path`, `gemfile_lock_path`
484
- * **Snap** - `revision`, `arch`, `channel`
485
- * **Homebrew** - `tag_name`, `commit_sha`
486
- * **Chocolatey** - `package_name`, `is_pre_release`
203
+ mnenv resolves the active version in the following order:
487
204
 
488
- === Using lock files with Bundler
205
+ . `METANORMA_VERSION` environment variable
206
+ . `.metanorma-version` file in current directory (and parent directories)
207
+ . `~/.mnenv/version` file (global version)
489
208
 
490
- To install the exact gems from a specific Metanorma Docker version:
209
+ The source is resolved similarly:
491
210
 
492
- [source,sh]
493
- ----
494
- # Clone this repository
495
- git clone https://github.com/metanorma/versions.git
496
- cd versions
211
+ . `METANORMA_SOURCE` environment variable
212
+ . `.metanorma-source` file in current directory (and parent directories)
213
+ . `~/.mnenv/source` file (global source)
214
+ . Default: `gemfile`
497
215
 
498
- # Copy the files for your desired version
499
- cp data/gemfile/v1.14.4/Gemfile /path/to/your/project/
500
- cp data/gemfile/v1.14.4/Gemfile.lock.archived /path/to/your/project/Gemfile.lock
216
+ == Directory Structure
501
217
 
502
- # Install the exact gems
503
- cd /path/to/your/project
504
- bundle install
218
+ [source]
505
219
  ----
506
-
507
- === Finding the Docker image version
508
-
509
- To find which version of metanorma/metanorma Docker image corresponds to a
510
- metanorma-cli version:
511
-
512
- [source,sh]
220
+ ~/.mnenv/
221
+ ├── versions/ # Version data (cloned from metanorma/versions)
222
+ │ └── data/
223
+ │ ├── gemfile/versions.yaml
224
+ │ ├── binary/versions.yaml
225
+ │ └── ...
226
+ ├── installed/ # Installed Metanorma versions
227
+ │ └── 1.14.4/
228
+ │ ├── bin/metanorma # (gemfile source)
229
+ │ ├── metanorma # (binary source)
230
+ │ └── source # Records installation source
231
+ ├── shims/ # Shim executables
232
+ │ └── metanorma
233
+ ├── version # Global version file
234
+ └── source # Global source file
513
235
  ----
514
- # Inspect the Gemfile to see the metanorma-cli version
515
- cat data/gemfile/v1.14.4/Gemfile
516
236
 
517
- # Output: gem "metanorma-cli", "= 1.14.4"
518
- ----
519
-
520
- The Docker image tag is the same as the metanorma-cli version:
237
+ == Architecture
521
238
 
522
- [source,sh]
523
- ----
524
- docker pull metanorma/metanorma:1.14.4
239
+ mnenv follows a model-driven architecture:
240
+
241
+ [source]
242
+ ----
243
+ mnenv
244
+ ├── Cli # Thor CLI entry point
245
+ ├── Commands/
246
+ │ ├── InstallCommand # Install versions
247
+ │ ├── VersionCommand # Version switching (global, local, use, versions)
248
+ │ └── UninstallCommand # Uninstall versions
249
+ ├── Installers/
250
+ │ ├── Base # Abstract installer
251
+ │ ├── BinaryInstaller # Binary installation (downloads, extracts)
252
+ │ └── GemfileInstaller # Gemfile-based installation
253
+ ├── Shells/
254
+ │ ├── Base # Abstract shell
255
+ │ ├── Bash # Unix shells (bash, zsh, sh)
256
+ │ ├── PowerShell # Windows PowerShell
257
+ │ └── Cmd # Windows CMD
258
+ ├── Repositories/
259
+ │ ├── GemfileRepository # RubyGems version data
260
+ │ ├── BinaryRepository # Binary version data
261
+ │ └── ...
262
+ ├── ShimManager # Shim generation
263
+ ├── VersionsManager # Version data management
264
+ └── Models/
265
+ ├── ArtifactVersion # Base version model
266
+ ├── GemfileVersion # RubyGems version
267
+ └── BinaryVersion # Binary version
525
268
  ----
526
269
 
527
270
  == Development
@@ -530,18 +273,14 @@ docker pull metanorma/metanorma:1.14.4
530
273
 
531
274
  [source,shell]
532
275
  ----
533
- bundle exec rake test
276
+ bundle exec rake spec
534
277
  ----
535
278
 
536
- === Running Rake tasks
279
+ Or with RSpec directly:
537
280
 
538
281
  [source,shell]
539
282
  ----
540
- # List available Rake tasks
541
- bundle exec rake -T
542
-
543
- # Generate index
544
- bundle exec rake generate_index
283
+ bundle exec rspec
545
284
  ----
546
285
 
547
286
  === Code quality
@@ -552,53 +291,21 @@ bundle exec rake generate_index
552
291
  bundle exec rubocop
553
292
 
554
293
  # Auto-correct issues
555
- bundle exec rubocop --autocorrect
556
- ----
557
-
558
- == Architecture
559
-
560
- This repository follows a model-driven OOP architecture using lutaml-model:
561
-
562
- ----
563
- Mnenv
564
- ├── ArtifactVersion (base version class with LutaML serialization)
565
- ├── Repository (YAML CRUD operations)
566
- ├── Fetcher (API communication)
567
- ├── Logger (logging utility)
568
- ├── JsonFormatter (JSON output)
569
- └── Cli (Thor CLI with subcommands)
570
-
571
- Modules by platform:
572
- ├── Gemfile/
573
- │ ├── Version (Gemfile-specific with gemfile paths)
574
- │ ├── Repository (Gemfile YAML storage)
575
- │ ├── Fetcher (Docker Hub API)
576
- │ └── Extractor (Gemfile extraction from containers)
577
- ├── Snap/
578
- │ ├── Version (Snap-specific with revision/arch)
579
- │ ├── Repository (Snap YAML storage)
580
- │ └── Fetcher (Snapcraft API)
581
- ├── Homebrew/
582
- │ ├── Version (Homebrew-specific with tag/commit)
583
- │ ├── Repository (Homebrew YAML storage)
584
- │ └── Fetcher (GitHub tags API)
585
- └── Chocolatey/
586
- ├── Version (Chocolatey-specific with pre-release flag)
587
- ├── Repository (Chocolatey YAML storage)
588
- └── Fetcher (Chocolatey API)
294
+ bundle exec rubocop -A
589
295
  ----
590
296
 
591
297
  == Contributing
592
298
 
593
- 1. Fork the repository
594
- 2. Create your feature branch (`git checkout -b my-amazing-feature`)
595
- 3. Commit your changes (`git commit -am 'Add some amazing feature'`)
596
- 4. Push to the branch (`git push origin my-amazing-feature`)
597
- 5. Open a Pull Request
299
+ . Fork the repository
300
+ . Create your feature branch (`git checkout -b my-amazing-feature`)
301
+ . Commit your changes (`git commit -am 'Add some amazing feature'`)
302
+ . Push to the branch (`git push origin my-amazing-feature`)
303
+ . Open a Pull Request
598
304
 
599
305
  == License
600
306
 
601
- This repository is available as open source under the terms of the {file-license}[MIT License].
307
+ This project is available as open source under the terms of the
308
+ https://opensource.org/licenses/MIT[MIT License].
602
309
 
603
310
  == Copyright
604
311