tetra 2.0.7 → 2.0.8

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 (222) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +3 -3
  3. data/README.md +5 -4
  4. data/bin/tetra +6 -4
  5. data/lib/template/bashrc +19 -14
  6. data/lib/template/bundled/apache-maven-3.9.12/LICENSE +616 -0
  7. data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/NOTICE +0 -6
  8. data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/bin/mvn +9 -0
  9. data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/bin/mvn.cmd +14 -0
  10. data/lib/template/bundled/{apache-maven-3.9.9/boot/plexus-classworlds-2.8.0.jar → apache-maven-3.9.12/boot/plexus-classworlds-2.9.0.jar} +0 -0
  11. data/lib/template/bundled/apache-maven-3.9.12/lib/asm-9.9.jar +0 -0
  12. data/lib/template/bundled/apache-maven-3.9.12/lib/asm.license +29 -0
  13. data/lib/template/bundled/apache-maven-3.9.12/lib/commons-cli-1.11.0.jar +0 -0
  14. data/lib/template/bundled/apache-maven-3.9.12/lib/commons-codec-1.20.0.jar +0 -0
  15. data/lib/template/bundled/apache-maven-3.9.12/lib/error_prone_annotations-2.41.0.jar +0 -0
  16. data/lib/template/bundled/apache-maven-3.9.12/lib/failureaccess-1.0.3.jar +0 -0
  17. data/lib/template/bundled/apache-maven-3.9.12/lib/gson-2.13.2.jar +0 -0
  18. data/lib/template/bundled/apache-maven-3.9.12/lib/guava-33.5.0-jre.jar +0 -0
  19. data/lib/template/bundled/apache-maven-3.9.12/lib/guice-5.1.0-classes.jar +0 -0
  20. data/lib/template/bundled/{apache-maven-3.9.9/lib/jansi-2.4.1.jar → apache-maven-3.9.12/lib/jansi-2.4.2.jar} +0 -0
  21. data/lib/template/bundled/{apache-maven-3.9.9/lib/jansi-native/Windows/arm64/libjansi.so → apache-maven-3.9.12/lib/jansi-native/Windows/arm64/jansi.dll} +0 -0
  22. data/lib/template/bundled/apache-maven-3.9.12/lib/jspecify-1.0.0.jar +0 -0
  23. data/lib/template/bundled/{apache-maven-3.9.9/lib/maven-artifact-3.9.9.jar → apache-maven-3.9.12/lib/maven-artifact-3.9.12.jar} +0 -0
  24. data/lib/template/bundled/{apache-maven-3.9.9/lib/maven-builder-support-3.9.9.jar → apache-maven-3.9.12/lib/maven-builder-support-3.9.12.jar} +0 -0
  25. data/lib/template/bundled/{apache-maven-3.9.9/lib/maven-compat-3.9.9.jar → apache-maven-3.9.12/lib/maven-compat-3.9.12.jar} +0 -0
  26. data/lib/template/bundled/{apache-maven-3.9.9/lib/maven-core-3.9.9.jar → apache-maven-3.9.12/lib/maven-core-3.9.12.jar} +0 -0
  27. data/lib/template/bundled/apache-maven-3.9.12/lib/maven-embedder-3.9.12.jar +0 -0
  28. data/lib/template/bundled/apache-maven-3.9.12/lib/maven-model-3.9.12.jar +0 -0
  29. data/lib/template/bundled/{apache-maven-3.9.9/lib/maven-model-builder-3.9.9.jar → apache-maven-3.9.12/lib/maven-model-builder-3.9.12.jar} +0 -0
  30. data/lib/template/bundled/apache-maven-3.9.12/lib/maven-plugin-api-3.9.12.jar +0 -0
  31. data/lib/template/bundled/apache-maven-3.9.12/lib/maven-repository-metadata-3.9.12.jar +0 -0
  32. data/lib/template/bundled/{apache-maven-3.9.9/lib/maven-resolver-api-1.9.22.jar → apache-maven-3.9.12/lib/maven-resolver-api-1.9.25.jar} +0 -0
  33. data/lib/template/bundled/apache-maven-3.9.12/lib/maven-resolver-connector-basic-1.9.25.jar +0 -0
  34. data/lib/template/bundled/{apache-maven-3.9.9/lib/maven-resolver-impl-1.9.22.jar → apache-maven-3.9.12/lib/maven-resolver-impl-1.9.25.jar} +0 -0
  35. data/lib/template/bundled/{apache-maven-3.9.9/lib/maven-resolver-named-locks-1.9.22.jar → apache-maven-3.9.12/lib/maven-resolver-named-locks-1.9.25.jar} +0 -0
  36. data/lib/template/bundled/{apache-maven-3.9.9/lib/maven-resolver-provider-3.9.9.jar → apache-maven-3.9.12/lib/maven-resolver-provider-3.9.12.jar} +0 -0
  37. data/lib/template/bundled/{apache-maven-3.9.9/lib/maven-resolver-spi-1.9.22.jar → apache-maven-3.9.12/lib/maven-resolver-spi-1.9.25.jar} +0 -0
  38. data/lib/template/bundled/apache-maven-3.9.12/lib/maven-resolver-transport-file-1.9.25.jar +0 -0
  39. data/lib/template/bundled/apache-maven-3.9.12/lib/maven-resolver-transport-http-1.9.25.jar +0 -0
  40. data/lib/template/bundled/{apache-maven-3.9.9/lib/maven-resolver-transport-wagon-1.9.22.jar → apache-maven-3.9.12/lib/maven-resolver-transport-wagon-1.9.25.jar} +0 -0
  41. data/lib/template/bundled/{apache-maven-3.9.9/lib/maven-resolver-util-1.9.22.jar → apache-maven-3.9.12/lib/maven-resolver-util-1.9.25.jar} +0 -0
  42. data/lib/template/bundled/apache-maven-3.9.12/lib/maven-settings-3.9.12.jar +0 -0
  43. data/lib/template/bundled/{apache-maven-3.9.9/lib/maven-settings-builder-3.9.9.jar → apache-maven-3.9.12/lib/maven-settings-builder-3.9.12.jar} +0 -0
  44. data/lib/template/bundled/{apache-maven-3.9.9/lib/maven-slf4j-provider-3.9.9.jar → apache-maven-3.9.12/lib/maven-slf4j-provider-3.9.12.jar} +0 -0
  45. data/lib/template/bundled/{apache-maven-3.9.9/lib/org.eclipse.sisu.inject-0.9.0.M3.jar → apache-maven-3.9.12/lib/org.eclipse.sisu.inject-0.9.0.M4.jar} +0 -0
  46. data/lib/template/bundled/{apache-maven-3.9.9/lib/org.eclipse.sisu.plexus-0.9.0.M3.jar → apache-maven-3.9.12/lib/org.eclipse.sisu.plexus-0.9.0.M4.jar} +0 -0
  47. data/lib/template/bundled/apache-maven-3.9.12/lib/plexus-component-annotations-2.2.0.jar +0 -0
  48. data/lib/template/bundled/{apache-maven-3.9.9/lib/plexus-interpolation-1.27.jar → apache-maven-3.9.12/lib/plexus-interpolation-1.29.jar} +0 -0
  49. data/lib/template/bundled/apache-maven-3.9.12/lib/plexus-sec-dispatcher.license +202 -0
  50. data/lib/template/bundled/apache-maven-3.9.12/lib/plexus-utils-3.6.0.jar +0 -0
  51. data/lib/template/bundled/apache-maven-3.9.12/lib/plexus-utils.license +202 -0
  52. data/lib/template/kit.spec +3 -3
  53. data/lib/template/package.spec +13 -10
  54. data/lib/tetra/constants.rb +10 -1
  55. data/lib/tetra/data/license_map.yml +124 -0
  56. data/lib/tetra/facades/ant.rb +4 -7
  57. data/lib/tetra/facades/bash.rb +28 -19
  58. data/lib/tetra/facades/git.rb +69 -34
  59. data/lib/tetra/facades/gradle.rb +3 -2
  60. data/lib/tetra/facades/mvn.rb +8 -8
  61. data/lib/tetra/facades/process_runner.rb +58 -37
  62. data/lib/tetra/facades/tar.rb +5 -4
  63. data/lib/tetra/facades/unzip.rb +5 -4
  64. data/lib/tetra/generatable.rb +4 -3
  65. data/lib/tetra/kit.rb +12 -6
  66. data/lib/tetra/license_mapper.rb +34 -0
  67. data/lib/tetra/logger.rb +7 -4
  68. data/lib/tetra/maven_website.rb +64 -27
  69. data/lib/tetra/packages/kit_package.rb +4 -4
  70. data/lib/tetra/packages/package.rb +47 -8
  71. data/lib/tetra/packages/scriptable.rb +12 -8
  72. data/lib/tetra/packages/speccable.rb +7 -1
  73. data/lib/tetra/pom.rb +38 -16
  74. data/lib/tetra/pom_getter.rb +55 -43
  75. data/lib/tetra/project.rb +14 -15
  76. data/lib/tetra/project_initer.rb +32 -20
  77. data/lib/tetra/ui/change_sources_subcommand.rb +13 -7
  78. data/lib/tetra/ui/dry_run_subcommand.rb +5 -3
  79. data/lib/tetra/ui/generate_all_subcommand.rb +1 -1
  80. data/lib/tetra/ui/generate_kit_subcommand.rb +2 -1
  81. data/lib/tetra/ui/generate_script_subcommand.rb +2 -3
  82. data/lib/tetra/ui/generate_spec_subcommand.rb +3 -2
  83. data/lib/tetra/ui/get_pom_subcommand.rb +17 -12
  84. data/lib/tetra/ui/init_subcommand.rb +12 -4
  85. data/lib/tetra/ui/main.rb +6 -1
  86. data/lib/tetra/ui/move_jars_to_kit_subcommand.rb +2 -2
  87. data/lib/tetra/ui/patch_subcommand.rb +1 -1
  88. data/lib/tetra/ui/subcommand.rb +37 -31
  89. data/lib/tetra/version.rb +2 -3
  90. data/lib/tetra/version_matcher.rb +62 -44
  91. data/lib/tetra.rb +10 -6
  92. metadata +184 -274
  93. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -26
  94. data/.github/ISSUE_TEMPLATE/feature_request.md +0 -15
  95. data/.github/dependabot.yml +0 -24
  96. data/.github/workflows/action-lint.yml +0 -15
  97. data/.github/workflows/codeql-analysis.yml +0 -94
  98. data/.github/workflows/dependency-review.yml +0 -17
  99. data/.github/workflows/markdown.yml +0 -23
  100. data/.github/workflows/rubocop.yml +0 -51
  101. data/.github/workflows/test.yml +0 -62
  102. data/.gitignore +0 -27
  103. data/.markdownlint.yaml +0 -11
  104. data/.rubocop.yml +0 -35
  105. data/.rubocop_todo.yml +0 -438
  106. data/.sonarcloud.properties +0 -4
  107. data/Gemfile +0 -6
  108. data/Gemfile.lock +0 -228
  109. data/Rakefile +0 -9
  110. data/lib/template/bundled/apache-maven-3.9.9/LICENSE +0 -760
  111. data/lib/template/bundled/apache-maven-3.9.9/lib/commons-cli-1.8.0.jar +0 -0
  112. data/lib/template/bundled/apache-maven-3.9.9/lib/commons-codec-1.17.1.jar +0 -0
  113. data/lib/template/bundled/apache-maven-3.9.9/lib/failureaccess-1.0.2.jar +0 -0
  114. data/lib/template/bundled/apache-maven-3.9.9/lib/guava-33.2.1-jre.jar +0 -0
  115. data/lib/template/bundled/apache-maven-3.9.9/lib/guice-5.1.0.jar +0 -0
  116. data/lib/template/bundled/apache-maven-3.9.9/lib/maven-embedder-3.9.9.jar +0 -0
  117. data/lib/template/bundled/apache-maven-3.9.9/lib/maven-model-3.9.9.jar +0 -0
  118. data/lib/template/bundled/apache-maven-3.9.9/lib/maven-plugin-api-3.9.9.jar +0 -0
  119. data/lib/template/bundled/apache-maven-3.9.9/lib/maven-repository-metadata-3.9.9.jar +0 -0
  120. data/lib/template/bundled/apache-maven-3.9.9/lib/maven-resolver-connector-basic-1.9.22.jar +0 -0
  121. data/lib/template/bundled/apache-maven-3.9.9/lib/maven-resolver-transport-file-1.9.22.jar +0 -0
  122. data/lib/template/bundled/apache-maven-3.9.9/lib/maven-resolver-transport-http-1.9.22.jar +0 -0
  123. data/lib/template/bundled/apache-maven-3.9.9/lib/maven-settings-3.9.9.jar +0 -0
  124. data/lib/template/bundled/apache-maven-3.9.9/lib/plexus-component-annotations-2.1.0.jar +0 -0
  125. data/lib/template/bundled/apache-maven-3.9.9/lib/plexus-utils-3.5.1.jar +0 -0
  126. data/lib/template/bundled/apache-maven-3.9.9/lib/plexus-xml-3.0.1.jar +0 -0
  127. data/lib/template/kit/.keep +0 -1
  128. data/lib/template/kit/jars/.keep +0 -1
  129. data/lib/template/packages/.keep +0 -1
  130. data/lib/template/src/.keep +0 -1
  131. data/spec/data/ant-super-simple-code/build/HW.class +0 -0
  132. data/spec/data/ant-super-simple-code/build/mypackage/HW.class +0 -0
  133. data/spec/data/ant-super-simple-code/build.xml +0 -133
  134. data/spec/data/ant-super-simple-code/dist/antsimple-20130618.jar +0 -0
  135. data/spec/data/ant-super-simple-code/lib/junit-4.11.jar +0 -0
  136. data/spec/data/ant-super-simple-code/lib/log4j-1.2.13.jar +0 -0
  137. data/spec/data/ant-super-simple-code/src/mypackage/HW.java +0 -15
  138. data/spec/data/antlr/antlr-2.7.2.jar +0 -0
  139. data/spec/data/antlr/pom.xml +0 -6
  140. data/spec/data/commons-collections4-4.5.0-M2-src.tar.gz +0 -0
  141. data/spec/data/commons-collections4-4.5.0-M2-src.zip +0 -0
  142. data/spec/data/commons-logging/commons-logging-1.3.4.jar +0 -0
  143. data/spec/data/commons-logging/parent_pom.xml +0 -1995
  144. data/spec/data/commons-logging/pom.xml +0 -833
  145. data/spec/data/nailgun/nailgun-0.7.1.jar +0 -0
  146. data/spec/data/nailgun/pom.xml +0 -153
  147. data/spec/data/struts-apps/pom.xml +0 -1147
  148. data/spec/data/tomcat/pom.xml +0 -33
  149. data/spec/lib/coarse/dry_run_subcommand_spec.rb +0 -59
  150. data/spec/lib/coarse/generate_all_subcommand_spec.rb +0 -132
  151. data/spec/lib/coarse/generate_spec_subcommand_spec.rb +0 -30
  152. data/spec/lib/coarse/init_subcommand_spec.rb +0 -101
  153. data/spec/lib/coarse/main_spec.rb +0 -21
  154. data/spec/lib/fine/ant_spec.rb +0 -25
  155. data/spec/lib/fine/git_spec.rb +0 -181
  156. data/spec/lib/fine/kit_package_spec.rb +0 -31
  157. data/spec/lib/fine/kit_spec.rb +0 -27
  158. data/spec/lib/fine/maven_website_spec.rb +0 -61
  159. data/spec/lib/fine/mvn_spec.rb +0 -27
  160. data/spec/lib/fine/package_spec.rb +0 -68
  161. data/spec/lib/fine/pom_getter_spec.rb +0 -36
  162. data/spec/lib/fine/pom_spec.rb +0 -98
  163. data/spec/lib/fine/project_spec.rb +0 -234
  164. data/spec/lib/fine/scriptable_spec.rb +0 -56
  165. data/spec/lib/fine/speccable_spec.rb +0 -93
  166. data/spec/lib/fine/tar_spec.rb +0 -22
  167. data/spec/lib/fine/unzip_spec.rb +0 -22
  168. data/spec/lib/fine/version_matcher_spec.rb +0 -64
  169. data/spec/spec_helper.rb +0 -90
  170. data/tetra.gemspec +0 -44
  171. data/utils/delete_nonet_user.sh +0 -8
  172. data/utils/setup_nonet_user.sh +0 -8
  173. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/README.txt +0 -0
  174. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/bin/m2.conf +0 -0
  175. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/bin/mvnDebug +0 -0
  176. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/bin/mvnDebug.cmd +0 -0
  177. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/bin/mvnyjp +0 -0
  178. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/boot/plexus-classworlds.license +0 -0
  179. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/conf/logging/simplelogger.properties +0 -0
  180. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/conf/settings.xml +0 -0
  181. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/conf/toolchains.xml +0 -0
  182. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/aopalliance-1.0.jar +0 -0
  183. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/aopalliance.license +0 -0
  184. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/commons-cli.license +0 -0
  185. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/commons-codec.license +0 -0
  186. /data/lib/template/bundled/{apache-maven-3.9.9/lib/failureaccess.license → apache-maven-3.9.12/lib/error_prone_annotations.license} +0 -0
  187. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/ext/README.txt +0 -0
  188. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/ext/hazelcast/README.txt +0 -0
  189. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/ext/redisson/README.txt +0 -0
  190. /data/lib/template/bundled/{apache-maven-3.9.9/lib/guava.license → apache-maven-3.9.12/lib/failureaccess.license} +0 -0
  191. /data/lib/template/bundled/{apache-maven-3.9.9/lib/guice.license → apache-maven-3.9.12/lib/gson.license} +0 -0
  192. /data/lib/template/bundled/{apache-maven-3.9.9/lib/httpclient.license → apache-maven-3.9.12/lib/guava.license} +0 -0
  193. /data/lib/template/bundled/{apache-maven-3.9.9/lib/httpcore.license → apache-maven-3.9.12/lib/guice.license} +0 -0
  194. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/httpclient-4.5.14.jar +0 -0
  195. /data/lib/template/bundled/{apache-maven-3.9.9/lib/jansi.license → apache-maven-3.9.12/lib/httpclient.license} +0 -0
  196. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/httpcore-4.4.16.jar +0 -0
  197. /data/lib/template/bundled/{apache-maven-3.9.9/lib/javax.inject.license → apache-maven-3.9.12/lib/httpcore.license} +0 -0
  198. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/jansi-native/README.txt +0 -0
  199. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/jansi-native/Windows/x86/jansi.dll +0 -0
  200. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/jansi-native/Windows/x86_64/jansi.dll +0 -0
  201. /data/lib/template/bundled/{apache-maven-3.9.9/lib/jcl-over-slf4j.license → apache-maven-3.9.12/lib/jansi.license} +0 -0
  202. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/javax.annotation-api-1.3.2.jar +0 -0
  203. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/javax.annotation-api.license +0 -0
  204. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/javax.inject-1.jar +0 -0
  205. /data/lib/template/bundled/{apache-maven-3.9.9/lib/plexus-cipher.license → apache-maven-3.9.12/lib/javax.inject.license} +0 -0
  206. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/jcl-over-slf4j-1.7.36.jar +0 -0
  207. /data/lib/template/bundled/{apache-maven-3.9.9/lib/plexus-component-annotations.license → apache-maven-3.9.12/lib/jcl-over-slf4j.license} +0 -0
  208. /data/lib/template/bundled/{apache-maven-3.9.9/lib/plexus-interpolation.license → apache-maven-3.9.12/lib/jspecify.license} +0 -0
  209. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/maven-shared-utils-3.4.2.jar +0 -0
  210. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/org.eclipse.sisu.inject.license +0 -0
  211. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/org.eclipse.sisu.plexus.license +0 -0
  212. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/plexus-cipher-2.0.jar +0 -0
  213. /data/lib/template/bundled/{apache-maven-3.9.9/lib/plexus-sec-dispatcher.license → apache-maven-3.9.12/lib/plexus-cipher.license} +0 -0
  214. /data/lib/template/bundled/{apache-maven-3.9.9/lib/plexus-utils.license → apache-maven-3.9.12/lib/plexus-component-annotations.license} +0 -0
  215. /data/lib/template/bundled/{apache-maven-3.9.9/lib/plexus-xml.license → apache-maven-3.9.12/lib/plexus-interpolation.license} +0 -0
  216. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/plexus-sec-dispatcher-2.0.jar +0 -0
  217. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/slf4j-api-1.7.36.jar +0 -0
  218. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/slf4j-api.license +0 -0
  219. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/wagon-file-3.5.3.jar +0 -0
  220. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/wagon-http-3.5.3.jar +0 -0
  221. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/wagon-http-shared-3.5.3.jar +0 -0
  222. /data/lib/template/bundled/{apache-maven-3.9.9 → apache-maven-3.9.12}/lib/wagon-provider-api-3.5.3.jar +0 -0
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Tetra
4
4
  # attempts to get java projects' pom file
@@ -8,11 +8,13 @@ module Tetra
8
8
  # saves a jar poms in <jar_filename>.pom
9
9
  # returns filename and status if found, else nil
10
10
  def get_pom(filename)
11
- content, status = get_pom_from_jar(filename) || get_pom_from_sha1(filename) || get_pom_from_heuristic(filename)
11
+ content, status = get_pom_from_jar(filename) ||
12
+ get_pom_from_sha1(filename) ||
13
+ get_pom_from_heuristic(filename)
12
14
  return unless content
13
15
 
14
16
  pom_filename = filename.sub(/(\.jar)?$/, ".pom")
15
- File.open(pom_filename, "w") { |io| io.write(content) }
17
+ File.binwrite(pom_filename, content)
16
18
  [pom_filename, status]
17
19
  end
18
20
 
@@ -21,7 +23,11 @@ module Tetra
21
23
  log.debug("Attempting unpack of #{file} to find a POM")
22
24
  begin
23
25
  Zip::File.foreach(file) do |entry|
24
- if entry.name =~ %r{/pom.xml$}
26
+ # Security check (Zip Slip)
27
+ next if entry.name.include?("..") || entry.name.start_with?("/")
28
+
29
+ # PERFORMANCE: end_with? is much faster than Regexp for simple suffixes
30
+ if entry.name.end_with?("/pom.xml") || entry.name == "pom.xml"
25
31
  log.info("pom.xml found in #{file}##{entry.name}")
26
32
  return entry.get_input_stream.read, :found_in_jar
27
33
  end
@@ -37,19 +43,22 @@ module Tetra
37
43
  # returns a pom from search.maven.org with a jar sha1 search
38
44
  def get_pom_from_sha1(file)
39
45
  log.debug("Attempting SHA1 POM lookup for #{file}")
46
+ return unless File.file?(file)
47
+
40
48
  begin
41
- if File.file?(file)
42
- site = MavenWebsite.new
43
- sha1 = Digest::SHA1.hexdigest File.read(file)
44
- results = site.search_by_sha1(sha1).select { |result| result["ec"].include?(".pom") }
45
- result = results.first
46
- unless result.nil?
47
- log.info("pom.xml for #{file} found on search.maven.org for sha1 #{sha1}\
48
- (#{result['g']}:#{result['a']}:#{result['v']})"
49
- )
50
- group_id, artifact_id, version = site.get_maven_id_from result
51
- return site.download_pom(group_id, artifact_id, version), :found_via_sha1
52
- end
49
+ site = MavenWebsite.new
50
+ # PERFORMANCE: Streams the file calculation instead of loading entire file into RAM
51
+ sha1 = Digest::SHA1.file(file).hexdigest
52
+
53
+ results = site.search_by_sha1(sha1)
54
+ found_doc = results.find { |doc| doc["ec"].include?(".pom") }
55
+
56
+ if found_doc
57
+ log.info("pom.xml for #{file} found on search.maven.org for sha1 #{sha1} " \
58
+ "(#{found_doc['g']}:#{found_doc['a']}:#{found_doc['v']})")
59
+
60
+ group_id, artifact_id, version = site.get_maven_id_from(found_doc)
61
+ return site.download_pom(group_id, artifact_id, version), :found_via_sha1
53
62
  end
54
63
  rescue NotFoundOnMavenWebsiteError
55
64
  log.warn("Got a 404 error while looking for #{file}'s SHA1 in search.maven.org")
@@ -59,37 +68,40 @@ module Tetra
59
68
 
60
69
  # returns a pom from search.maven.org with a heuristic name search
61
70
  def get_pom_from_heuristic(filename)
71
+ log.debug("Attempting heuristic POM search for #{filename}")
62
72
  begin
63
- log.debug("Attempting heuristic POM search for #{filename}")
64
73
  site = MavenWebsite.new
65
- filename = cleanup_name(filename)
74
+ clean_name = cleanup_name(filename)
75
+
66
76
  version_matcher = VersionMatcher.new
67
- my_artifact_id, my_version = version_matcher.split_version(filename)
77
+ my_artifact_id, my_version = version_matcher.split_version(clean_name)
68
78
  log.debug("Guessed artifact id: #{my_artifact_id}, version: #{my_version}")
69
79
 
70
- result = site.search_by_name(my_artifact_id).first
71
- log.debug("Artifact id search result: #{result}")
72
- unless result.nil?
73
- group_id, artifact_id, = site.get_maven_id_from result
74
- results = site.search_by_group_id_and_artifact_id(group_id, artifact_id)
75
- log.debug("All versions: #{results}")
76
- their_versions = results.map { |doc| doc["v"] }
77
- best_matched_version = (
78
- if !my_version.nil?
79
- version_matcher.best_match(my_version, their_versions)
80
- else
81
- their_versions.max
82
- end
83
- )
84
- best_matched_result = results.select { |r| r["v"] == best_matched_version }.first
85
-
86
- group_id, artifact_id, version = site.get_maven_id_from(best_matched_result)
87
- log.warn("pom.xml for #{filename} found on search.maven.org with heuristic search\
88
- (#{group_id}:#{artifact_id}:#{version})"
89
- )
90
-
91
- return site.download_pom(group_id, artifact_id, version), :found_via_heuristic
92
- end
80
+ first_result = site.search_by_name(my_artifact_id).first
81
+ log.debug("Artifact id search result: #{first_result}")
82
+
83
+ return unless first_result
84
+
85
+ group_id, artifact_id, = site.get_maven_id_from(first_result)
86
+ results = site.search_by_group_id_and_artifact_id(group_id, artifact_id)
87
+ log.debug("All versions: #{results}")
88
+
89
+ their_versions = results.map { |doc| doc["v"] }
90
+
91
+ best_matched_version = if my_version
92
+ version_matcher.best_match(my_version, their_versions)
93
+ else
94
+ their_versions.max
95
+ end
96
+
97
+ best_matched_doc = results.find { |r| r["v"] == best_matched_version }
98
+ return unless best_matched_doc
99
+
100
+ group_id, artifact_id, version = site.get_maven_id_from(best_matched_doc)
101
+ log.warn("pom.xml for #{filename} found on search.maven.org with heuristic search " \
102
+ "(#{group_id}:#{artifact_id}:#{version})")
103
+
104
+ return site.download_pom(group_id, artifact_id, version), :found_via_heuristic
93
105
  rescue NotFoundOnMavenWebsiteError
94
106
  log.warn("Got a 404 error while looking for #{filename} heuristically in search.maven.org")
95
107
  end
@@ -98,7 +110,7 @@ module Tetra
98
110
 
99
111
  # get a heuristic name from a path
100
112
  def cleanup_name(path)
101
- Pathname.new(path).basename.to_s.sub(/.jar$/, "")
113
+ Pathname.new(path).basename.to_s.sub(/\.jar$/, "")
102
114
  end
103
115
  end
104
116
  end
data/lib/tetra/project.rb CHANGED
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Tetra
4
4
  # encapsulates a Tetra project directory
@@ -7,7 +7,7 @@ module Tetra
7
7
  include Logging
8
8
 
9
9
  # path of the project template files
10
- TEMPLATE_PATH = File.join(File.dirname(__FILE__), "..", "template")
10
+ TEMPLATE_PATH = File.join(__dir__, "..", "template")
11
11
 
12
12
  attr_reader :full_path
13
13
 
@@ -54,13 +54,14 @@ module Tetra
54
54
  def dry_run
55
55
  current_directory = Pathname.new(Dir.pwd).relative_path_from(Pathname.new(@full_path))
56
56
 
57
- @git.commit_directories(%w(src kit), "Dry-run started\n\ntetra: dry-run-started: #{current_directory}")
57
+ @git.commit_directories(%w[src kit], "Dry-run started\n\ntetra: dry-run-started: #{current_directory}")
58
58
  end
59
59
 
60
60
  # returns true iff we are currently dry-running
61
61
  def dry_running?
62
62
  latest_comment = @git.latest_comment("tetra: dry-run-")
63
- !latest_comment.nil? && !(latest_comment =~ /tetra: dry-run-finished/)
63
+ # MODERNIZATION: Use match? instead of =~
64
+ !latest_comment.nil? && !latest_comment.match?(/tetra: dry-run-finished/)
64
65
  end
65
66
 
66
67
  # ends a dry-run assuming a successful build:
@@ -87,7 +88,7 @@ module Tetra
87
88
  # ends a dry-run assuming the build went wrong
88
89
  # reverts src/ and kit/ directories
89
90
  def abort
90
- @git.revert_directories(%w(src kit), @git.latest_id("tetra: dry-run-started"))
91
+ @git.revert_directories(%w[src kit], @git.latest_id("tetra: dry-run-started"))
91
92
  @git.undo_last_commit
92
93
  end
93
94
 
@@ -185,12 +186,9 @@ module Tetra
185
186
  # returns the name of the source archive file, if any
186
187
  def src_archive
187
188
  from_directory do
188
- Find.find(File.join("packages", name)) do |file|
189
- if File.file?(file) && file.match(/\.(spec)|(sh)|(patch)$/).nil?
190
- return File.basename(file)
191
- end
192
- end
193
- nil
189
+ Dir.glob(File.join("packages", name, "*")).find do |file|
190
+ File.file?(file) && !file.match?(/\.(spec|sh|patch)$/)
191
+ end&.then { |f| File.basename(f) }
194
192
  end
195
193
  end
196
194
 
@@ -210,14 +208,15 @@ module Tetra
210
208
  def purge_jars
211
209
  from_directory do
212
210
  result = []
213
- Find.find("src") do |file|
214
- next unless file =~ /.jar$/ && !File.symlink?(file)
211
+ Dir.glob("src/**/*.jar").each do |file|
212
+ next if File.symlink?(file)
215
213
 
216
- new_location = File.join("kit", "jars", Pathname.new(file).split[1])
214
+ new_location = File.join("kit", "jars", File.basename(file))
217
215
  FileUtils.mv(file, new_location)
218
216
 
217
+ # Calculate relative path for symlink
219
218
  link_target = Pathname.new(new_location)
220
- .relative_path_from(Pathname.new(file).split.first)
219
+ .relative_path_from(Pathname.new(file).dirname)
221
220
  .to_s
222
221
 
223
222
  File.symlink(link_target, file)
@@ -1,22 +1,26 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Tetra
4
- # takes care of intiializing a tetra project
4
+ # takes care of initializing a tetra project
5
5
  module ProjectIniter
6
6
  include Logging
7
7
 
8
8
  # path of the project template files
9
- TEMPLATE_PATH = File.join(File.dirname(__FILE__), "..", "template")
9
+ TEMPLATE_PATH = File.join(__dir__, "..", "template")
10
10
 
11
11
  # includers get class methods defined in ClassMethods
12
12
  def self.included(base)
13
13
  base.extend(ClassMethods)
14
14
  end
15
+
15
16
  # class methods container
16
17
  module ClassMethods
17
18
  # returns true if the specified directory is a valid tetra project
18
19
  def project?(dir)
19
- Tetra::Logger.instance.debug "Checking for tetra project: #{dir}, contents: #{Dir.new(dir).to_a}"
20
+ # Use a block for logging so we don't list files unless debug is on.
21
+ # Dir.children is faster/cleaner than Dir.new(dir).to_a
22
+ Tetra::Logger.instance.debug { "Checking for tetra project: #{dir}, contents: #{Dir.children(dir)}" }
23
+
20
24
  File.directory?(File.join(dir, "src")) &&
21
25
  File.directory?(File.join(dir, "kit")) &&
22
26
  File.directory?(File.join(dir, ".git"))
@@ -25,23 +29,29 @@ module Tetra
25
29
  # inits a new project directory structure
26
30
  def init(dir, include_bundled_software = true)
27
31
  Dir.mkdir(dir)
28
- Dir.chdir(dir) do
29
- git = Tetra::Git.new(".")
30
32
 
31
- git.init
33
+ # Avoid Dir.chdir(dir). Use absolute paths instead.
34
+ # Initialize Git facade with the full path
35
+ git = Tetra::Git.new(dir)
36
+ git.init
32
37
 
33
- FileUtils.mkdir_p("src")
34
- FileUtils.mkdir_p("kit")
38
+ FileUtils.mkdir_p(File.join(dir, "src"))
39
+ FileUtils.mkdir_p(File.join(dir, "kit"))
35
40
 
36
- # populate the project with templates and commit it
37
- project = Project.new(".")
41
+ # Create a project instance (now that the dir structure exists)
42
+ project = Project.new(dir)
38
43
 
39
- project.template_files(include_bundled_software).each do |source, destination|
40
- FileUtils.cp_r(File.join(TEMPLATE_PATH, source), destination)
41
- end
44
+ project.template_files(include_bundled_software).each do |source, destination|
45
+ # Source is relative to TEMPLATE_PATH
46
+ src_path = File.join(TEMPLATE_PATH, source)
47
+ # Destination is relative to the new project directory
48
+ dst_path = File.join(dir, destination)
42
49
 
43
- git.commit_directories(["."], "Template files added")
50
+ FileUtils.cp_r(src_path, dst_path)
44
51
  end
52
+
53
+ # Commit "." (Git facade handles context, "." means "all changes in repo")
54
+ git.commit_directories(["."], "Template files added")
45
55
  end
46
56
  end
47
57
 
@@ -55,10 +65,10 @@ module Tetra
55
65
  }
56
66
 
57
67
  if include_bundled_software
58
- Dir.chdir(TEMPLATE_PATH) do
59
- Dir.glob(File.join("bundled", "*")).each do |file|
60
- result[file] = "kit"
61
- end
68
+ # Use 'base:' argument to avoid unsafe Dir.chdir
69
+ # This globs files inside TEMPLATE_PATH without changing global state
70
+ Dir.glob(File.join("bundled", "*"), base: TEMPLATE_PATH).each do |file|
71
+ result[file] = "kit"
62
72
  end
63
73
  end
64
74
 
@@ -75,13 +85,15 @@ module Tetra
75
85
  FileUtils.cp(file, result_path)
76
86
  @git.commit_file(result_path, "Source archive added")
77
87
 
78
- unarchiver = if file =~ /\.zip$/
88
+ unarchiver = if /\.zip$/.match?(file)
79
89
  Tetra::Unzip.new
80
90
  else
81
91
  Tetra::Tar.new
82
92
  end
83
93
 
94
+ # Glob cleaning is safer than rm_rf with wildcards in shell
84
95
  Dir.glob(File.join("src", "*")).each { |f| FileUtils.rm_rf(f) }
96
+
85
97
  unarchiver.decompress(file, "src")
86
98
  commit_sources(message, true)
87
99
  end
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Tetra
4
4
  # tetra change-sources
@@ -9,19 +9,25 @@ module Tetra
9
9
  default: false
10
10
 
11
11
  def execute
12
- if source_archive.nil? && no_archive? == false
13
- signal_usage_error "please specify a source archive file or use \"--no-archive\" (see SPECIAL_CASES.md)."
14
- end
15
-
16
12
  checking_exceptions do
13
+ # Ensure the user provided an archive OR explicitly opted out
14
+ if source_archive.nil? && !no_archive?
15
+ signal_usage_error "please specify a source archive file or use \"--no-archive\" (see SPECIAL_CASES.md)."
16
+ end
17
+
17
18
  project = Tetra::Project.new(".")
18
19
  ensure_dry_running(:is_not_in_progress, project) do
19
- if no_archive? == false
20
- project.commit_source_archive(File.expand_path(source_archive), message)
20
+ if !no_archive?
21
+ # CASE 1: Updating from a new archive file
22
+ full_archive_path = File.expand_path(source_archive)
23
+ project.commit_source_archive(full_archive_path, message)
24
+
21
25
  puts "New sources committed."
22
26
  puts "Please delete any stale source archives from packages/ before proceeding."
23
27
  else
28
+ # CASE 2: Updating from manual changes in src/
24
29
  project.commit_sources(message, true)
30
+
25
31
  puts "New sources committed."
26
32
  puts "Please copy source archive(s) corresponding to src/ in packages/ before proceeding."
27
33
  end
@@ -1,9 +1,10 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Tetra
4
4
  # tetra dry-run
5
5
  class DryRunSubcommand < Tetra::Subcommand
6
6
  option ["-s", "--script"], "SCRIPT", "Run these commands to build the project instead of the interactive shell"
7
+
7
8
  def execute
8
9
  checking_exceptions do
9
10
  project = Tetra::Project.new(".")
@@ -15,14 +16,15 @@ module Tetra
15
16
  puts "Dry run not started."
16
17
  else
17
18
  project.dry_run
19
+
18
20
  if script
19
21
  puts "Scripted dry-run started."
20
22
  else
21
23
  puts "Dry-run started in a new bash shell. Build your project now!"
22
24
  puts "Note that:"
23
25
  puts " - \"mvn\" and \"ant\" are already bundled by tetra"
24
- puts " - you have to use \"gradlew\" instad of \"./gradlew\" to launch a Gradle wrapper"
25
- puts "If the build succeedes end this dry run with ^D (Ctrl+D),"
26
+ puts " - you have to use \"gradlew\" instead of \"./gradlew\" to launch a Gradle wrapper"
27
+ puts "If the build succeeds end this dry run with ^D (Ctrl+D),"
26
28
  puts "if the build does not succeed use ^C^D to abort and undo any change"
27
29
  end
28
30
 
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Tetra
4
4
  # tetra generate-all
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Tetra
4
4
  # tetra generate-kit
@@ -8,6 +8,7 @@ module Tetra
8
8
  project = Tetra::Project.new(".")
9
9
  ensure_dry_running(:has_finished, project) do
10
10
  kit = Tetra::KitPackage.new(project)
11
+
11
12
  result_path, conflict_count = kit.to_spec
12
13
  print_generation_result(project, result_path, conflict_count)
13
14
 
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Tetra
4
4
  # tetra generate-script
@@ -7,8 +7,7 @@ module Tetra
7
7
  checking_exceptions do
8
8
  project = Tetra::Project.new(".")
9
9
  ensure_dry_running(:has_finished, project) do
10
- result_path, conflict_count =
11
- Tetra::Package.new(project).to_script
10
+ result_path, conflict_count = Tetra::Package.new(project).to_script
12
11
  print_generation_result(project, result_path, conflict_count)
13
12
  end
14
13
  end
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Tetra
4
4
  # tetra generate-spec
@@ -19,7 +19,8 @@ module Tetra
19
19
 
20
20
  result_path, conflict_count = package.to_spec
21
21
  print_generation_result(project, result_path, conflict_count)
22
- puts "Warning: #{pom} not found, some spec fields will be left blank" unless File.file?(pom)
22
+
23
+ puts "Warning: #{pom} not found, some spec fields will be left blank" unless File.exist?(pom)
23
24
  puts "Warning: source archive not found, package will not build" unless project.src_archive
24
25
  end
25
26
  end
@@ -1,4 +1,6 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
+
3
+ require "uri"
2
4
 
3
5
  module Tetra
4
6
  # tetra get-pom
@@ -10,23 +12,26 @@ module Tetra
10
12
  project = Tetra::Project.new(".")
11
13
  ensure_dry_running(:is_not_in_progress, project) do
12
14
  pom_getter = Tetra::PomGetter.new
13
-
14
15
  path, status = pom_getter.get_pom(name)
16
+
15
17
  if path
16
- text_status = (
17
- if status == :found_in_jar
18
- "was inside the jar"
19
- elsif status == :found_via_sha1
20
- "found by sha1 search from search.maven.org"
21
- elsif status == :found_via_heuristic
22
- "found by heuristic search from search.maven.org"
23
- end
24
- )
18
+ text_status = case status
19
+ when :found_in_jar
20
+ "was inside the jar"
21
+ when :found_via_sha1
22
+ "found by sha1 search from search.maven.org"
23
+ when :found_via_heuristic
24
+ "found by heuristic search from search.maven.org"
25
+ end
25
26
 
26
27
  puts "#{format_path(path, project)} written, #{text_status}"
27
28
  else
28
29
  puts "#{name}'s pom not found. Try:"
29
- puts "http://google.com/#q=#{URI.encode(pom_getter.cleanup_name(name) + ' pom')}"
30
+
31
+ # URI.encode_www_form_component correctly escapes spaces to '+' for query params.
32
+ clean_name = pom_getter.cleanup_name(name)
33
+ query = "#{clean_name} pom"
34
+ puts "http://google.com/#q=#{URI.encode_www_form_component(query)}"
30
35
  end
31
36
  end
32
37
  end
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Tetra
4
4
  # tetra init
@@ -10,10 +10,13 @@ module Tetra
10
10
 
11
11
  def execute
12
12
  checking_exceptions do
13
- if source_archive.nil? && no_archive? == false
13
+ # Ensure the user provided an archive OR explicitly opted out
14
+ if source_archive.nil? && !no_archive?
14
15
  signal_usage_error "please specify a source archive file or use \"--no-archive\" (see SPECIAL_CASES.md)."
15
16
  end
16
- if !source_archive.nil? && !File.readable?(source_archive)
17
+
18
+ # Ensure the file exists if provided
19
+ if source_archive && !File.readable?(source_archive)
17
20
  signal_usage_error "#{source_archive} is not a file or it is not readable."
18
21
  end
19
22
 
@@ -23,11 +26,16 @@ module Tetra
23
26
 
24
27
  if source_archive
25
28
  puts "Decompressing sources..."
26
- project.commit_source_archive(File.expand_path(source_archive), "Inital sources added from archive")
29
+ # Expand path immediately to ensure we reference the correct file
30
+ # relative to where the command was run, not inside the new project dir.
31
+ full_archive_path = File.expand_path(source_archive)
32
+
33
+ project.commit_source_archive(full_archive_path, "Initial sources added from archive")
27
34
  puts "Sources decompressed in #{package_name}/src/, original archive copied in #{package_name}/packages/."
28
35
  else
29
36
  puts "Use \"tetra change-sources\" to add sources to this project."
30
37
  end
38
+
31
39
  puts "Please add any other precompiled build dependency to kit/."
32
40
  puts "When you are ready to test a build, use \"tetra dry-run\" from the project directory"
33
41
  end
data/lib/tetra/ui/main.rb CHANGED
@@ -1,8 +1,13 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Tetra
4
4
  # program entry point
5
5
  class MainCommand < Clamp::Command
6
+ option ["-v", "--version"], :flag, "print the version and exit" do
7
+ puts Tetra::VERSION
8
+ exit(0)
9
+ end
10
+
6
11
  subcommand(
7
12
  "init",
8
13
  "Inits a tetra project in the current directory",
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Tetra
4
4
  # tetra move-jars-to-kit
@@ -9,7 +9,7 @@ module Tetra
9
9
 
10
10
  ensure_dry_running(:is_not_in_progress, project) do
11
11
  project.purge_jars.each do |original, final|
12
- puts "Replaced #{original} with symlink pointing to to #{final}"
12
+ puts "Replaced #{original} with symlink pointing to #{final}"
13
13
  end
14
14
  end
15
15
  end
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Tetra
4
4
  # tetra patch