captive-release 0.4.3 → 0.5.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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/lib/captive_release/build_command.rb +52 -0
  3. data/lib/captive_release/build_config.rb +20 -0
  4. data/lib/captive_release/build_config_prompt.rb +31 -0
  5. data/lib/captive_release/build_dispatch_run.rb +35 -0
  6. data/lib/captive_release/changes_since.rb +18 -0
  7. data/lib/captive_release/cli.rb +27 -382
  8. data/lib/captive_release/config.rb +2 -44
  9. data/lib/captive_release/config_file.rb +30 -0
  10. data/lib/captive_release/config_loader.rb +34 -0
  11. data/lib/captive_release/config_writer.rb +45 -0
  12. data/lib/captive_release/framework_detector.rb +30 -0
  13. data/lib/captive_release/git_commands.rb +19 -26
  14. data/lib/captive_release/git_release.rb +24 -0
  15. data/lib/captive_release/github_api.rb +45 -0
  16. data/lib/captive_release/github_dispatch.rb +12 -27
  17. data/lib/captive_release/github_http.rb +34 -25
  18. data/lib/captive_release/github_release.rb +16 -32
  19. data/lib/captive_release/github_repo.rb +31 -0
  20. data/lib/captive_release/github_token.rb +18 -0
  21. data/lib/captive_release/help.rb +50 -0
  22. data/lib/captive_release/init_command.rb +44 -0
  23. data/lib/captive_release/menu.rb +33 -0
  24. data/lib/captive_release/options.rb +27 -0
  25. data/lib/captive_release/release_command.rb +50 -0
  26. data/lib/captive_release/release_preconditions.rb +24 -0
  27. data/lib/captive_release/release_publication.rb +30 -0
  28. data/lib/captive_release/repo_files.rb +35 -0
  29. data/lib/captive_release/shell.rb +20 -0
  30. data/lib/captive_release/terminal.rb +40 -0
  31. data/lib/captive_release/version.rb +1 -1
  32. data/lib/captive_release/version_choice.rb +56 -0
  33. data/lib/captive_release/version_detector.rb +26 -57
  34. data/lib/captive_release/version_file.rb +14 -79
  35. data/lib/captive_release/version_file_bootstrap.rb +25 -0
  36. data/lib/captive_release/version_file_selection.rb +53 -0
  37. data/lib/captive_release/version_files_argument.rb +21 -0
  38. data/lib/captive_release/version_files_writing.rb +22 -0
  39. data/lib/captive_release/version_format.rb +86 -0
  40. data/lib/captive_release.rb +30 -0
  41. metadata +30 -1
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ module CaptiveRelease
6
+ # Comment une version s'exprime dans un texte, format par format.
7
+ #
8
+ # Cette unité ne touche jamais au disque : elle lit et réécrit une chaîne. VersionFile se
9
+ # charge du fichier, de son existence et du message d'erreur qui nomme le chemin. Elle
10
+ # change quand un format gagne une forme, VersionFile quand les garde-fous changent.
11
+ class VersionFormat
12
+ attr_reader :expected
13
+
14
+ def initialize(read:, write:, expected:)
15
+ @read = read
16
+ @write = write
17
+ @expected = expected
18
+ end
19
+
20
+ # Rend nil plutôt que de lever : seul l'appelant connaît le chemin du fichier, donc lui
21
+ # seul peut composer un message qui dise où chercher.
22
+ def read(content) = @read.call(content)
23
+
24
+ def write(content, old_version, new_version) = @write.call(content, old_version, new_version)
25
+
26
+ # Quatre des six formats ne diffèrent que par le motif qui capture la version et par la
27
+ # forme du remplacement. Les décrire un par un faisait apparier leurs lambdas par Flay.
28
+ #
29
+ # Le motif qui retrouve la version à remplacer est dérivé de celui qui la capture : le
30
+ # réécrire à la main dupliquait chaque expression, et les deux pouvaient diverger sans
31
+ # que rien ne le signale.
32
+ def self.by_pattern(capture, expected, &replace)
33
+ new(read: ->(content) { content[capture, 1] },
34
+ write: lambda { |content, old, nouvelle|
35
+ content.gsub(locate(capture, old)) { |occurrence| replace.call(occurrence, nouvelle) }
36
+ },
37
+ expected: expected)
38
+ end
39
+
40
+ CAPTURE_GROUP = "(.+?)"
41
+
42
+ def self.locate(capture, old)
43
+ Regexp.new(capture.source.sub(CAPTURE_GROUP) { Regexp.escape(old) })
44
+ end
45
+
46
+ # app_config_js et android_gradle ne diffèrent que par l'étiquette qui précède la version
47
+ # et par ce qui l'en sépare.
48
+ def self.by_label(amorce, rendu)
49
+ by_pattern(/#{amorce}['"]#{CAPTURE_GROUP}['"]/, "#{rendu}'x.y.z'") \
50
+ { |_, nouvelle| "#{rendu}'#{nouvelle}'" }
51
+ end
52
+
53
+ PLIST_VALUE = %r{(?<=<string>).+?(?=</string>)}
54
+
55
+ FORMATS = {
56
+ "plain" => new(read: ->(content) { content.strip },
57
+ write: ->(_content, _old, nouvelle) { "#{nouvelle}\n" },
58
+ expected: "x.y.z"),
59
+ "package_json" => new(read: ->(content) { JSON.parse(content)["version"] },
60
+ write: lambda { |content, old, nouvelle|
61
+ content.gsub(/"version": "#{Regexp.escape(old)}"/,
62
+ %("version": "#{nouvelle}"))
63
+ },
64
+ expected: %("version": "x.y.z")),
65
+
66
+ # Le style de guillemets du fichier est conservé : réécrire en double quand le fichier
67
+ # écrit en simple produirait un diff plus large que le changement de version.
68
+ "ruby_version" => by_pattern(/VERSION\s*=\s*["'](.+?)["']/, %(VERSION = "x.y.z")) \
69
+ { |occurrence, nouvelle|
70
+ occurrence.include?('"') ? %(VERSION = "#{nouvelle}") : %(VERSION = '#{nouvelle}')
71
+ },
72
+
73
+ "app_config_js" => by_label(/version:\s*/, "version: "),
74
+ "android_gradle" => by_label(/versionName\s+/, "versionName "),
75
+
76
+ "ios_plist" => by_pattern(
77
+ %r{<key>CFBundleShortVersionString</key>\s*<string>(.+?)</string>},
78
+ "CFBundleShortVersionString key",
79
+ ) { |occurrence, nouvelle| occurrence.sub(PLIST_VALUE, nouvelle) },
80
+ }.freeze
81
+
82
+ def self.for(type) = FORMATS[type]
83
+
84
+ def self.types = FORMATS.keys
85
+ end
86
+ end
@@ -2,12 +2,42 @@
2
2
 
3
3
  require_relative "captive_release/version"
4
4
  require_relative "captive_release/version_bumper"
5
+ require_relative "captive_release/version_format"
5
6
  require_relative "captive_release/version_file"
7
+ require_relative "captive_release/build_config"
6
8
  require_relative "captive_release/config"
9
+ require_relative "captive_release/config_file"
10
+ require_relative "captive_release/repo_files"
11
+ require_relative "captive_release/framework_detector"
7
12
  require_relative "captive_release/version_detector"
13
+ require_relative "captive_release/shell"
8
14
  require_relative "captive_release/git_commands"
15
+ require_relative "captive_release/github_repo"
16
+ require_relative "captive_release/github_http"
17
+ require_relative "captive_release/github_api"
9
18
  require_relative "captive_release/github_release"
10
19
  require_relative "captive_release/github_dispatch"
20
+ require_relative "captive_release/terminal"
21
+ require_relative "captive_release/options"
22
+ require_relative "captive_release/config_loader"
23
+ require_relative "captive_release/github_token"
24
+ require_relative "captive_release/version_file_selection"
25
+ require_relative "captive_release/build_config_prompt"
26
+ require_relative "captive_release/config_writer"
27
+ require_relative "captive_release/version_files_argument"
28
+ require_relative "captive_release/version_file_bootstrap"
29
+ require_relative "captive_release/init_command"
30
+ require_relative "captive_release/build_dispatch_run"
31
+ require_relative "captive_release/build_command"
32
+ require_relative "captive_release/menu"
33
+ require_relative "captive_release/version_choice"
34
+ require_relative "captive_release/git_release"
35
+ require_relative "captive_release/changes_since"
36
+ require_relative "captive_release/release_publication"
37
+ require_relative "captive_release/version_files_writing"
38
+ require_relative "captive_release/release_preconditions"
39
+ require_relative "captive_release/release_command"
40
+ require_relative "captive_release/help"
11
41
  require_relative "captive_release/cli"
12
42
 
13
43
  module CaptiveRelease
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: captive-release
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Captive Studio
@@ -20,16 +20,45 @@ extra_rdoc_files: []
20
20
  files:
21
21
  - bin/captive-release
22
22
  - lib/captive_release.rb
23
+ - lib/captive_release/build_command.rb
24
+ - lib/captive_release/build_config.rb
25
+ - lib/captive_release/build_config_prompt.rb
26
+ - lib/captive_release/build_dispatch_run.rb
27
+ - lib/captive_release/changes_since.rb
23
28
  - lib/captive_release/cli.rb
24
29
  - lib/captive_release/config.rb
30
+ - lib/captive_release/config_file.rb
31
+ - lib/captive_release/config_loader.rb
32
+ - lib/captive_release/config_writer.rb
33
+ - lib/captive_release/framework_detector.rb
25
34
  - lib/captive_release/git_commands.rb
35
+ - lib/captive_release/git_release.rb
36
+ - lib/captive_release/github_api.rb
26
37
  - lib/captive_release/github_dispatch.rb
27
38
  - lib/captive_release/github_http.rb
28
39
  - lib/captive_release/github_release.rb
40
+ - lib/captive_release/github_repo.rb
41
+ - lib/captive_release/github_token.rb
42
+ - lib/captive_release/help.rb
43
+ - lib/captive_release/init_command.rb
44
+ - lib/captive_release/menu.rb
45
+ - lib/captive_release/options.rb
46
+ - lib/captive_release/release_command.rb
47
+ - lib/captive_release/release_preconditions.rb
48
+ - lib/captive_release/release_publication.rb
49
+ - lib/captive_release/repo_files.rb
50
+ - lib/captive_release/shell.rb
51
+ - lib/captive_release/terminal.rb
29
52
  - lib/captive_release/version.rb
30
53
  - lib/captive_release/version_bumper.rb
54
+ - lib/captive_release/version_choice.rb
31
55
  - lib/captive_release/version_detector.rb
32
56
  - lib/captive_release/version_file.rb
57
+ - lib/captive_release/version_file_bootstrap.rb
58
+ - lib/captive_release/version_file_selection.rb
59
+ - lib/captive_release/version_files_argument.rb
60
+ - lib/captive_release/version_files_writing.rb
61
+ - lib/captive_release/version_format.rb
33
62
  homepage: https://github.com/captive-studio/captive-release
34
63
  licenses:
35
64
  - MIT