mnenv 0.1.0

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 (276) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +17 -0
  3. data/README.adoc +605 -0
  4. data/Rakefile +8 -0
  5. data/data/chocolatey/versions.yaml +812 -0
  6. data/data/gemfile/v1.1.6/Gemfile +4 -0
  7. data/data/gemfile/v1.1.6/Gemfile.lock.archived +232 -0
  8. data/data/gemfile/v1.1.7/Gemfile +4 -0
  9. data/data/gemfile/v1.1.7/Gemfile.lock.archived +235 -0
  10. data/data/gemfile/v1.1.8/Gemfile +4 -0
  11. data/data/gemfile/v1.1.8/Gemfile.lock.archived +238 -0
  12. data/data/gemfile/v1.10.0/Gemfile +5 -0
  13. data/data/gemfile/v1.10.0/Gemfile.lock.archived +930 -0
  14. data/data/gemfile/v1.10.1/Gemfile +5 -0
  15. data/data/gemfile/v1.10.1/Gemfile.lock.archived +929 -0
  16. data/data/gemfile/v1.10.10/Gemfile +5 -0
  17. data/data/gemfile/v1.10.10/Gemfile.lock.archived +973 -0
  18. data/data/gemfile/v1.10.11/Gemfile +5 -0
  19. data/data/gemfile/v1.10.11/Gemfile.lock.archived +975 -0
  20. data/data/gemfile/v1.10.2/Gemfile +5 -0
  21. data/data/gemfile/v1.10.2/Gemfile.lock.archived +939 -0
  22. data/data/gemfile/v1.10.3/Gemfile +5 -0
  23. data/data/gemfile/v1.10.3/Gemfile.lock.archived +946 -0
  24. data/data/gemfile/v1.10.5/Gemfile +5 -0
  25. data/data/gemfile/v1.10.5/Gemfile.lock.archived +958 -0
  26. data/data/gemfile/v1.10.6/Gemfile +5 -0
  27. data/data/gemfile/v1.10.6/Gemfile.lock.archived +969 -0
  28. data/data/gemfile/v1.10.7/Gemfile +5 -0
  29. data/data/gemfile/v1.10.7/Gemfile.lock.archived +969 -0
  30. data/data/gemfile/v1.10.8/Gemfile +5 -0
  31. data/data/gemfile/v1.10.8/Gemfile.lock.archived +968 -0
  32. data/data/gemfile/v1.10.9/Gemfile +5 -0
  33. data/data/gemfile/v1.10.9/Gemfile.lock.archived +972 -0
  34. data/data/gemfile/v1.11.0/Gemfile +5 -0
  35. data/data/gemfile/v1.11.0/Gemfile.lock.archived +971 -0
  36. data/data/gemfile/v1.11.1/Gemfile +5 -0
  37. data/data/gemfile/v1.11.1/Gemfile.lock.archived +975 -0
  38. data/data/gemfile/v1.11.4/Gemfile +5 -0
  39. data/data/gemfile/v1.11.4/Gemfile.lock.archived +1046 -0
  40. data/data/gemfile/v1.11.5/Gemfile +5 -0
  41. data/data/gemfile/v1.11.5/Gemfile.lock.archived +1047 -0
  42. data/data/gemfile/v1.12.10/Gemfile +3 -0
  43. data/data/gemfile/v1.12.10/Gemfile.lock.archived +1073 -0
  44. data/data/gemfile/v1.12.3/Gemfile +3 -0
  45. data/data/gemfile/v1.12.3/Gemfile.lock.archived +1050 -0
  46. data/data/gemfile/v1.12.4/Gemfile +3 -0
  47. data/data/gemfile/v1.12.4/Gemfile.lock.archived +1056 -0
  48. data/data/gemfile/v1.12.5/Gemfile +3 -0
  49. data/data/gemfile/v1.12.5/Gemfile.lock.archived +1054 -0
  50. data/data/gemfile/v1.12.6/Gemfile +3 -0
  51. data/data/gemfile/v1.12.6/Gemfile.lock.archived +1056 -0
  52. data/data/gemfile/v1.12.8/Gemfile +3 -0
  53. data/data/gemfile/v1.12.8/Gemfile.lock.archived +1063 -0
  54. data/data/gemfile/v1.13.0/Gemfile +3 -0
  55. data/data/gemfile/v1.13.0/Gemfile.lock.archived +1074 -0
  56. data/data/gemfile/v1.13.2/Gemfile +3 -0
  57. data/data/gemfile/v1.13.2/Gemfile.lock.archived +899 -0
  58. data/data/gemfile/v1.13.3/Gemfile +3 -0
  59. data/data/gemfile/v1.13.3/Gemfile.lock.archived +938 -0
  60. data/data/gemfile/v1.13.4/Gemfile +3 -0
  61. data/data/gemfile/v1.13.4/Gemfile.lock.archived +938 -0
  62. data/data/gemfile/v1.13.5/Gemfile +3 -0
  63. data/data/gemfile/v1.13.5/Gemfile.lock.archived +944 -0
  64. data/data/gemfile/v1.13.7/Gemfile +3 -0
  65. data/data/gemfile/v1.13.7/Gemfile.lock.archived +944 -0
  66. data/data/gemfile/v1.13.8/Gemfile +3 -0
  67. data/data/gemfile/v1.13.8/Gemfile.lock.archived +944 -0
  68. data/data/gemfile/v1.13.9/Gemfile +3 -0
  69. data/data/gemfile/v1.13.9/Gemfile.lock.archived +956 -0
  70. data/data/gemfile/v1.14.3/Gemfile +3 -0
  71. data/data/gemfile/v1.14.3/Gemfile.lock.archived +950 -0
  72. data/data/gemfile/v1.2.12/Gemfile +3 -0
  73. data/data/gemfile/v1.2.12/Gemfile.lock.archived +283 -0
  74. data/data/gemfile/v1.2.2/Gemfile +4 -0
  75. data/data/gemfile/v1.2.2/Gemfile.lock.archived +224 -0
  76. data/data/gemfile/v1.2.3/Gemfile +4 -0
  77. data/data/gemfile/v1.2.3/Gemfile.lock.archived +231 -0
  78. data/data/gemfile/v1.2.6/Gemfile +4 -0
  79. data/data/gemfile/v1.2.6/Gemfile.lock.archived +239 -0
  80. data/data/gemfile/v1.2.8/Gemfile +4 -0
  81. data/data/gemfile/v1.2.8/Gemfile.lock.archived +233 -0
  82. data/data/gemfile/v1.2.9/Gemfile +4 -0
  83. data/data/gemfile/v1.2.9/Gemfile.lock.archived +245 -0
  84. data/data/gemfile/v1.3.1/Gemfile +3 -0
  85. data/data/gemfile/v1.3.1/Gemfile.lock.archived +296 -0
  86. data/data/gemfile/v1.3.2/Gemfile +3 -0
  87. data/data/gemfile/v1.3.2/Gemfile.lock.archived +296 -0
  88. data/data/gemfile/v1.3.4/Gemfile +3 -0
  89. data/data/gemfile/v1.3.4/Gemfile.lock.archived +284 -0
  90. data/data/gemfile/v1.3.5/Gemfile +3 -0
  91. data/data/gemfile/v1.3.5/Gemfile.lock.archived +284 -0
  92. data/data/gemfile/v1.3.6/Gemfile +3 -0
  93. data/data/gemfile/v1.3.6/Gemfile.lock.archived +286 -0
  94. data/data/gemfile/v1.3.9/Gemfile +3 -0
  95. data/data/gemfile/v1.3.9/Gemfile.lock.archived +334 -0
  96. data/data/gemfile/v1.4.0/Gemfile +3 -0
  97. data/data/gemfile/v1.4.0/Gemfile.lock.archived +330 -0
  98. data/data/gemfile/v1.4.10/Gemfile +4 -0
  99. data/data/gemfile/v1.4.10/Gemfile.lock.archived +461 -0
  100. data/data/gemfile/v1.4.11/Gemfile +4 -0
  101. data/data/gemfile/v1.4.11/Gemfile.lock.archived +452 -0
  102. data/data/gemfile/v1.4.12/Gemfile +4 -0
  103. data/data/gemfile/v1.4.12/Gemfile.lock.archived +452 -0
  104. data/data/gemfile/v1.4.13/Gemfile +4 -0
  105. data/data/gemfile/v1.4.13/Gemfile.lock.archived +455 -0
  106. data/data/gemfile/v1.4.14/Gemfile +4 -0
  107. data/data/gemfile/v1.4.14/Gemfile.lock.archived +456 -0
  108. data/data/gemfile/v1.4.18/Gemfile +3 -0
  109. data/data/gemfile/v1.4.18/Gemfile.lock.archived +486 -0
  110. data/data/gemfile/v1.4.3/Gemfile +3 -0
  111. data/data/gemfile/v1.4.3/Gemfile.lock.archived +339 -0
  112. data/data/gemfile/v1.4.4/Gemfile +3 -0
  113. data/data/gemfile/v1.4.4/Gemfile.lock.archived +339 -0
  114. data/data/gemfile/v1.4.5/Gemfile +3 -0
  115. data/data/gemfile/v1.4.5/Gemfile.lock.archived +348 -0
  116. data/data/gemfile/v1.4.6/Gemfile +3 -0
  117. data/data/gemfile/v1.4.6/Gemfile.lock.archived +357 -0
  118. data/data/gemfile/v1.4.7/Gemfile +3 -0
  119. data/data/gemfile/v1.4.7/Gemfile.lock.archived +391 -0
  120. data/data/gemfile/v1.4.8/Gemfile +3 -0
  121. data/data/gemfile/v1.4.8/Gemfile.lock.archived +445 -0
  122. data/data/gemfile/v1.4.9/Gemfile +3 -0
  123. data/data/gemfile/v1.4.9/Gemfile.lock.archived +448 -0
  124. data/data/gemfile/v1.5.0/Gemfile +3 -0
  125. data/data/gemfile/v1.5.0/Gemfile.lock.archived +478 -0
  126. data/data/gemfile/v1.5.10/Gemfile +3 -0
  127. data/data/gemfile/v1.5.10/Gemfile.lock.archived +668 -0
  128. data/data/gemfile/v1.5.11/Gemfile +3 -0
  129. data/data/gemfile/v1.5.11/Gemfile.lock.archived +668 -0
  130. data/data/gemfile/v1.5.15/Gemfile +3 -0
  131. data/data/gemfile/v1.5.15/Gemfile.lock.archived +686 -0
  132. data/data/gemfile/v1.5.16/Gemfile +3 -0
  133. data/data/gemfile/v1.5.16/Gemfile.lock.archived +684 -0
  134. data/data/gemfile/v1.5.17/Gemfile +3 -0
  135. data/data/gemfile/v1.5.17/Gemfile.lock.archived +684 -0
  136. data/data/gemfile/v1.5.18/Gemfile +5 -0
  137. data/data/gemfile/v1.5.18/Gemfile.lock.archived +691 -0
  138. data/data/gemfile/v1.5.19/Gemfile +5 -0
  139. data/data/gemfile/v1.5.19/Gemfile.lock.archived +703 -0
  140. data/data/gemfile/v1.5.20/Gemfile +5 -0
  141. data/data/gemfile/v1.5.20/Gemfile.lock.archived +703 -0
  142. data/data/gemfile/v1.5.21/Gemfile +5 -0
  143. data/data/gemfile/v1.5.21/Gemfile.lock.archived +707 -0
  144. data/data/gemfile/v1.5.22/Gemfile +5 -0
  145. data/data/gemfile/v1.5.22/Gemfile.lock.archived +707 -0
  146. data/data/gemfile/v1.5.23/Gemfile +5 -0
  147. data/data/gemfile/v1.5.23/Gemfile.lock.archived +711 -0
  148. data/data/gemfile/v1.5.24/Gemfile +5 -0
  149. data/data/gemfile/v1.5.24/Gemfile.lock.archived +711 -0
  150. data/data/gemfile/v1.5.3/Gemfile +3 -0
  151. data/data/gemfile/v1.5.3/Gemfile.lock.archived +651 -0
  152. data/data/gemfile/v1.5.4/Gemfile +3 -0
  153. data/data/gemfile/v1.5.4/Gemfile.lock.archived +657 -0
  154. data/data/gemfile/v1.5.5/Gemfile +3 -0
  155. data/data/gemfile/v1.5.5/Gemfile.lock.archived +657 -0
  156. data/data/gemfile/v1.5.6/Gemfile +3 -0
  157. data/data/gemfile/v1.5.6/Gemfile.lock.archived +657 -0
  158. data/data/gemfile/v1.5.7/Gemfile +3 -0
  159. data/data/gemfile/v1.5.7/Gemfile.lock.archived +657 -0
  160. data/data/gemfile/v1.5.8/Gemfile +3 -0
  161. data/data/gemfile/v1.5.8/Gemfile.lock.archived +655 -0
  162. data/data/gemfile/v1.5.9/Gemfile +3 -0
  163. data/data/gemfile/v1.5.9/Gemfile.lock.archived +656 -0
  164. data/data/gemfile/v1.6.1/Gemfile +5 -0
  165. data/data/gemfile/v1.6.1/Gemfile.lock.archived +721 -0
  166. data/data/gemfile/v1.6.10/Gemfile +5 -0
  167. data/data/gemfile/v1.6.10/Gemfile.lock.archived +744 -0
  168. data/data/gemfile/v1.6.11/Gemfile +5 -0
  169. data/data/gemfile/v1.6.11/Gemfile.lock.archived +744 -0
  170. data/data/gemfile/v1.6.12/Gemfile +5 -0
  171. data/data/gemfile/v1.6.12/Gemfile.lock.archived +745 -0
  172. data/data/gemfile/v1.6.13/Gemfile +5 -0
  173. data/data/gemfile/v1.6.13/Gemfile.lock.archived +745 -0
  174. data/data/gemfile/v1.6.14/Gemfile +5 -0
  175. data/data/gemfile/v1.6.14/Gemfile.lock.archived +754 -0
  176. data/data/gemfile/v1.6.15/Gemfile +5 -0
  177. data/data/gemfile/v1.6.15/Gemfile.lock.archived +757 -0
  178. data/data/gemfile/v1.6.2/Gemfile +5 -0
  179. data/data/gemfile/v1.6.2/Gemfile.lock.archived +718 -0
  180. data/data/gemfile/v1.6.3/Gemfile +5 -0
  181. data/data/gemfile/v1.6.3/Gemfile.lock.archived +728 -0
  182. data/data/gemfile/v1.6.4/Gemfile +5 -0
  183. data/data/gemfile/v1.6.4/Gemfile.lock.archived +730 -0
  184. data/data/gemfile/v1.6.5/Gemfile +5 -0
  185. data/data/gemfile/v1.6.5/Gemfile.lock.archived +733 -0
  186. data/data/gemfile/v1.6.6/Gemfile +5 -0
  187. data/data/gemfile/v1.6.6/Gemfile.lock.archived +733 -0
  188. data/data/gemfile/v1.6.7/Gemfile +5 -0
  189. data/data/gemfile/v1.6.7/Gemfile.lock.archived +733 -0
  190. data/data/gemfile/v1.6.9/Gemfile +5 -0
  191. data/data/gemfile/v1.6.9/Gemfile.lock.archived +744 -0
  192. data/data/gemfile/v1.7.0/Gemfile +5 -0
  193. data/data/gemfile/v1.7.0/Gemfile.lock.archived +750 -0
  194. data/data/gemfile/v1.7.1/Gemfile +5 -0
  195. data/data/gemfile/v1.7.1/Gemfile.lock.archived +750 -0
  196. data/data/gemfile/v1.7.2/Gemfile +5 -0
  197. data/data/gemfile/v1.7.2/Gemfile.lock.archived +747 -0
  198. data/data/gemfile/v1.7.3/Gemfile +5 -0
  199. data/data/gemfile/v1.7.3/Gemfile.lock.archived +755 -0
  200. data/data/gemfile/v1.7.4/Gemfile +5 -0
  201. data/data/gemfile/v1.7.4/Gemfile.lock.archived +756 -0
  202. data/data/gemfile/v1.7.5/Gemfile +5 -0
  203. data/data/gemfile/v1.7.5/Gemfile.lock.archived +759 -0
  204. data/data/gemfile/v1.7.6/Gemfile +5 -0
  205. data/data/gemfile/v1.7.6/Gemfile.lock.archived +768 -0
  206. data/data/gemfile/v1.8.10/Gemfile +5 -0
  207. data/data/gemfile/v1.8.10/Gemfile.lock.archived +792 -0
  208. data/data/gemfile/v1.8.11/Gemfile +5 -0
  209. data/data/gemfile/v1.8.11/Gemfile.lock.archived +862 -0
  210. data/data/gemfile/v1.8.3/Gemfile +5 -0
  211. data/data/gemfile/v1.8.3/Gemfile.lock.archived +773 -0
  212. data/data/gemfile/v1.8.4/Gemfile +5 -0
  213. data/data/gemfile/v1.8.4/Gemfile.lock.archived +768 -0
  214. data/data/gemfile/v1.8.5/Gemfile +5 -0
  215. data/data/gemfile/v1.8.5/Gemfile.lock.archived +768 -0
  216. data/data/gemfile/v1.8.6/Gemfile +5 -0
  217. data/data/gemfile/v1.8.6/Gemfile.lock.archived +777 -0
  218. data/data/gemfile/v1.8.7/Gemfile +5 -0
  219. data/data/gemfile/v1.8.7/Gemfile.lock.archived +777 -0
  220. data/data/gemfile/v1.8.8/Gemfile +5 -0
  221. data/data/gemfile/v1.8.8/Gemfile.lock.archived +778 -0
  222. data/data/gemfile/v1.8.9/Gemfile +5 -0
  223. data/data/gemfile/v1.8.9/Gemfile.lock.archived +775 -0
  224. data/data/gemfile/v1.9.0/Gemfile +5 -0
  225. data/data/gemfile/v1.9.0/Gemfile.lock.archived +871 -0
  226. data/data/gemfile/v1.9.1/Gemfile +5 -0
  227. data/data/gemfile/v1.9.1/Gemfile.lock.archived +906 -0
  228. data/data/gemfile/v1.9.2/Gemfile +5 -0
  229. data/data/gemfile/v1.9.2/Gemfile.lock.archived +898 -0
  230. data/data/gemfile/v1.9.3/Gemfile +5 -0
  231. data/data/gemfile/v1.9.3/Gemfile.lock.archived +898 -0
  232. data/data/gemfile/v1.9.4/Gemfile +5 -0
  233. data/data/gemfile/v1.9.4/Gemfile.lock.archived +901 -0
  234. data/data/gemfile/v1.9.5/Gemfile +5 -0
  235. data/data/gemfile/v1.9.5/Gemfile.lock.archived +903 -0
  236. data/data/gemfile/v1.9.6/Gemfile +5 -0
  237. data/data/gemfile/v1.9.6/Gemfile.lock.archived +900 -0
  238. data/data/gemfile/v1.9.7/Gemfile +5 -0
  239. data/data/gemfile/v1.9.7/Gemfile.lock.archived +922 -0
  240. data/data/gemfile/v1.9.8/Gemfile +5 -0
  241. data/data/gemfile/v1.9.8/Gemfile.lock.archived +933 -0
  242. data/data/gemfile/versions.yaml +751 -0
  243. data/data/homebrew/versions.yaml +567 -0
  244. data/data/snap/github_tags.json +42 -0
  245. data/data/snap/versions.yaml +589 -0
  246. data/exe/mnenv +10 -0
  247. data/lib/mnenv/chocolatey/fetcher.rb +69 -0
  248. data/lib/mnenv/chocolatey_repository.rb +11 -0
  249. data/lib/mnenv/cli.rb +124 -0
  250. data/lib/mnenv/commands/chocolatey_command.rb +76 -0
  251. data/lib/mnenv/commands/gemfile_command.rb +57 -0
  252. data/lib/mnenv/commands/homebrew_command.rb +76 -0
  253. data/lib/mnenv/commands/snap_command.rb +89 -0
  254. data/lib/mnenv/commands.rb +6 -0
  255. data/lib/mnenv/fetcher.rb +30 -0
  256. data/lib/mnenv/gemfile/extractor.rb +140 -0
  257. data/lib/mnenv/gemfile/fetcher.rb +43 -0
  258. data/lib/mnenv/gemfile_repository.rb +13 -0
  259. data/lib/mnenv/homebrew/fetcher.rb +44 -0
  260. data/lib/mnenv/homebrew_repository.rb +11 -0
  261. data/lib/mnenv/json_formatter.rb +43 -0
  262. data/lib/mnenv/logger.rb +63 -0
  263. data/lib/mnenv/models/chocolatey_version.rb +18 -0
  264. data/lib/mnenv/models/gemfile_version.rb +40 -0
  265. data/lib/mnenv/models/homebrew_version.rb +23 -0
  266. data/lib/mnenv/models/snap_version.rb +22 -0
  267. data/lib/mnenv/models/version.rb +23 -0
  268. data/lib/mnenv/models.rb +9 -0
  269. data/lib/mnenv/repository.rb +105 -0
  270. data/lib/mnenv/snap/fetcher.rb +109 -0
  271. data/lib/mnenv/snap_repository.rb +70 -0
  272. data/lib/mnenv/version.rb +5 -0
  273. data/lib/mnenv.rb +8 -0
  274. data/mnenv.gemspec +43 -0
  275. data/snapcraft-list-copied-from-site.md +101 -0
  276. metadata +421 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2ceae10229bb0e66444311eeef2de11f97fb216e2d8ce67d9ba4c6f581ce9b0f
4
+ data.tar.gz: 216aecbe5a260dc838005eeb7e29b702308d9f7d1c31777f3226b0698136a337
5
+ SHA512:
6
+ metadata.gz: bceb22cfa76a3575d86fc82917dd33dd260dd6c3385378ba9e95c8d6499fd603e55b2a3f21be19311d0c68626dae3cbcc031252efb38dd8edd2ee371761738df
7
+ data.tar.gz: ef9173a972487ed8448196191fa62f6e0b7b127c2b5bd85e82ed287ddebc53155d6f7eb7a862d1d8cc571decf4cdb1ce00fb11abb49383624ffcd2318e011f5c
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'activesupport'
6
+ gem 'lutaml-model', '~> 0.7'
7
+ gem 'lutaml-xsd', '~> 1.0'
8
+ gem 'moxml'
9
+ gem 'nokogiri'
10
+ gem 'paint'
11
+ gem 'thor'
12
+
13
+ group :development do
14
+ gem 'rake'
15
+ gem 'rspec'
16
+ gem 'rubocop'
17
+ end
data/README.adoc ADDED
@@ -0,0 +1,605 @@
1
+ = Metanorma Versions
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]
5
+
6
+ Version discovery and management for Metanorma across multiple package sources.
7
+
8
+ == Purpose
9
+
10
+ This repository provides a unified interface for discovering and managing Metanorma versions from various sources:
11
+
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
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.
30
+
31
+ == Features
32
+
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
38
+
39
+ == Setting Up
40
+
41
+ Clone this repository and install dependencies:
42
+
43
+ [source,shell]
44
+ ----
45
+ git clone https://github.com/metanorma/versions.git
46
+ cd versions
47
+ bundle install
48
+ ----
49
+
50
+ == Usage
51
+
52
+ === CLI commands
53
+
54
+ The `mnenv` command provides subcommands for each platform:
55
+
56
+ [source,shell]
57
+ ----
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
81
+ ----
82
+
83
+ === Updating version data
84
+
85
+ Each platform supports three modes of updating version data:
86
+
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
90
+
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
+ ----
103
+
104
+ .Snap updates
105
+ [source,shell]
106
+ ----
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]
120
+ ----
121
+ # Fetch and add new Homebrew versions
122
+ bundle exec exe/mnenv homebrew refresh
123
+
124
+ # Update a specific Homebrew version
125
+ bundle exec exe/mnenv homebrew update 1.13.0
126
+
127
+ # Re-fetch all Homebrew versions
128
+ bundle exec exe/mnenv homebrew revamp
129
+ ----
130
+
131
+ .Chocolatey updates
132
+ [source,shell]
133
+ ----
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
142
+ ----
143
+
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:
155
+
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:
181
+
182
+ [source,shell]
183
+ ----
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
+ }
213
+ ----
214
+
215
+ == Direct Usage
216
+
217
+ === Reading version data from YAML files
218
+
219
+ The version data is stored in YAML files under `data/` directory. You can read these files directly:
220
+
221
+ [source,shell]
222
+ ----
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
234
+ ----
235
+
236
+ .Parsing YAML with `yq`
237
+
238
+ [source,shell]
239
+ ----
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
254
+ ----
255
+
256
+ .Parsing YAML with Ruby
257
+
258
+ [source,ruby]
259
+ ----
260
+ require 'yaml'
261
+
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']}"
266
+
267
+ # Find specific version
268
+ version_1_14_4 = data['versions'].find { |v| v['version'] == '1.14.4' }
269
+ ----
270
+
271
+ === CLI queries for specific use cases
272
+
273
+ [source,shell]
274
+ ----
275
+ # Get the latest version across all sources
276
+ bundle exec exe/mnenv list-all -f json | jq -r '.[].latest'
277
+
278
+ # Check if a specific version exists in Snap
279
+ bundle exec exe/mnenv snap list | grep "1.14.4"
280
+
281
+ # Get Snap revision for a specific version/arch
282
+ bundle exec exe/mnenv snap list | grep "1.14.4" | grep "amd64"
283
+
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
290
+ ----
291
+
292
+ === Using version data in scripts
293
+
294
+ .Bash script to check for new versions
295
+
296
+ [source,shell]
297
+ ----
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
337
+ ----
338
+
339
+ .Get Snap revision for a specific version
340
+
341
+ [source,shell]
342
+ ----
343
+ #!/bin/bash
344
+ # get_snap_revision.sh - Get Snap revision for version/arch
345
+
346
+ VERSION=$1
347
+ ARCH=${2:-amd64}
348
+ CHANNEL=${3:-stable}
349
+
350
+ if [ -z "$VERSION" ]; then
351
+ echo "Usage: $0 <version> [arch] [channel]"
352
+ exit 1
353
+ fi
354
+
355
+ # Get revision from YAML
356
+ yq ".versions[] | select(.version == \"$VERSION\" and .arch == \"$ARCH\" and .channel == \"$CHANNEL\") | .revision" data/snap/versions.yaml
357
+ ----
358
+
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
393
+
394
+ [source,shell]
395
+ ----
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
404
+
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
408
+ ----
409
+
410
+ === Snap-specific queries
411
+
412
+ Snap versions use composite keys (version-revision-arch-channel). Query them:
413
+
414
+ [source,shell]
415
+ ----
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
430
+ ----
431
+
432
+ === JSON output for automation
433
+
434
+ [source,shell]
435
+ ----
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"
447
+ ----
448
+
449
+ == Data structure
450
+
451
+ Version data is stored in YAML files under `data/`:
452
+
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
469
+
470
+ Each version object contains:
471
+
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
+ ----
480
+
481
+ Additional fields per source:
482
+
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`
487
+
488
+ === Using lock files with Bundler
489
+
490
+ To install the exact gems from a specific Metanorma Docker version:
491
+
492
+ [source,sh]
493
+ ----
494
+ # Clone this repository
495
+ git clone https://github.com/metanorma/versions.git
496
+ cd versions
497
+
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
501
+
502
+ # Install the exact gems
503
+ cd /path/to/your/project
504
+ bundle install
505
+ ----
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]
513
+ ----
514
+ # Inspect the Gemfile to see the metanorma-cli version
515
+ cat data/gemfile/v1.14.4/Gemfile
516
+
517
+ # Output: gem "metanorma-cli", "= 1.14.4"
518
+ ----
519
+
520
+ The Docker image tag is the same as the metanorma-cli version:
521
+
522
+ [source,sh]
523
+ ----
524
+ docker pull metanorma/metanorma:1.14.4
525
+ ----
526
+
527
+ == Development
528
+
529
+ === Running tests
530
+
531
+ [source,shell]
532
+ ----
533
+ bundle exec rake test
534
+ ----
535
+
536
+ === Running Rake tasks
537
+
538
+ [source,shell]
539
+ ----
540
+ # List available Rake tasks
541
+ bundle exec rake -T
542
+
543
+ # Generate index
544
+ bundle exec rake generate_index
545
+ ----
546
+
547
+ === Code quality
548
+
549
+ [source,shell]
550
+ ----
551
+ # Run Rubocop
552
+ bundle exec rubocop
553
+
554
+ # 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)
589
+ ----
590
+
591
+ == Contributing
592
+
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
598
+
599
+ == License
600
+
601
+ This repository is available as open source under the terms of the {file-license}[MIT License].
602
+
603
+ == Copyright
604
+
605
+ Copyright (c) 2025 Ribose Inc.
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rspec/core/rake_task'
4
+ require 'bundler/gem_tasks'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task default: :spec