Class: Decidim::GemManager
- Inherits:
-
Object
- Object
- Decidim::GemManager
- Defined in:
- lib/decidim/gem_manager.rb
Overview
Handles a decidim components.
Allows to perform custom operations on all modules in a given folder, or on specific module folders.
Potential operations are:
-
Running custom commands, via the ‘run` method, such as releasing it, or installing it locally.
-
Updating version files from the main ‘.decidim-version` file in the root of the repository.
Constant Summary collapse
- PARTICIPATORY_SPACES =
%w( participatory_processes assemblies consultations conferences ).freeze
- COMPONENTS =
%w( accountability budgets debates meetings pages proposals surveys sortitions blogs ).freeze
Class Method Summary collapse
- .all_dirs(include_root: true) ⇒ Object
- .capture(cmd, env: {}, with_stderr: true) ⇒ Object
- .fail_fast? ⇒ Boolean
- .install_all(out: $stdout) ⇒ Object
- .package_dirs ⇒ Object
- .patch_component_gemfile_generator ⇒ Object
- .plugins ⇒ Object
- .replace_file(name, regexp, replacement) ⇒ Object
- .replace_versions ⇒ Object
- .retry_times ⇒ Object
- .run(cmd, out: $stdout) ⇒ Object
- .run_all(command, out: $stdout, include_root: true) ⇒ Object
- .run_at(dir, command, out: $stdout) ⇒ Object
- .run_packages(command, out: $stdout) ⇒ Object
- .semver_friendly_version(a_version) ⇒ Object
- .test_component ⇒ Object
- .test_participatory_space ⇒ Object
- .uninstall_all(out: $stdout) ⇒ Object
- .version ⇒ Object
Instance Method Summary collapse
- #capture(command, env: {}, with_stderr: true) ⇒ Object
-
#initialize(dir) ⇒ GemManager
constructor
A new instance of GemManager.
- #replace_gem_version ⇒ Object
- #replace_package_version ⇒ Object
- #run(command, out: $stdout) ⇒ Object
- #short_name ⇒ Object
Constructor Details
#initialize(dir) ⇒ GemManager
Returns a new instance of GemManager.
41 42 43 |
# File 'lib/decidim/gem_manager.rb', line 41 def initialize(dir) @dir = File.(dir) end |
Class Method Details
.all_dirs(include_root: true) ⇒ Object
172 173 174 175 176 177 |
# File 'lib/decidim/gem_manager.rb', line 172 def all_dirs(include_root: true) dirs = plugins dirs << "./" if include_root dirs.each { |dir| yield(dir) } end |
.capture(cmd, env: {}, with_stderr: true) ⇒ Object
82 83 84 85 86 |
# File 'lib/decidim/gem_manager.rb', line 82 def capture(cmd, env: {}, with_stderr: true) return Open3.capture2e(env, cmd) if with_stderr Open3.capture2(env, cmd) end |
.fail_fast? ⇒ Boolean
193 194 195 |
# File 'lib/decidim/gem_manager.rb', line 193 def fail_fast? ENV.fetch("FAIL_FAST", nil) != "false" end |
.install_all(out: $stdout) ⇒ Object
110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/decidim/gem_manager.rb', line 110 def install_all(out: $stdout) run_all( "gem build %name && mv %name-%version.gem ..", include_root: false, out: out ) new(root).run( "gem build %name && gem install *.gem", out: out ) end |
.package_dirs ⇒ Object
179 180 181 182 183 |
# File 'lib/decidim/gem_manager.rb', line 179 def package_dirs dirs = Dir.glob("#{root}/packages/*") dirs.each { |dir| yield(dir) } end |
.patch_component_gemfile_generator ⇒ Object
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
# File 'lib/decidim/gem_manager.rb', line 201 def patch_component_gemfile_generator content = %(# frozen_string_literal: true <%# This file is automatically generated. Do not edit this file, it will be overwritten If you want to modify it you can do it in the Decidim::GemManager.patch_component_gemfile_generator method %> source "https://rubygems.org" ruby RUBY_VERSION gem "decidim", "~> #{version}" gem "decidim-<%= component_name %>", path: "." gem "puma", "#{fetch_gemfile_version("puma")}" gem "bootsnap", "#{fetch_gemfile_version("bootsnap")}" group :development, :test do gem "byebug", "#{fetch_gemfile_version("byebug")}", platform: :mri gem "decidim-dev", "~> #{version}" end group :development do gem "faker", "#{Gem.loaded_specs["decidim-dev"].dependencies.select { |a| a.name == "faker" }.first.requirement}" gem "letter_opener_web", "#{fetch_gemfile_version("letter_opener_web")}" gem "listen", "#{fetch_gemfile_version("listen")}" gem "spring", "#{fetch_gemfile_version("spring")}" gem "spring-watcher-listen", "#{fetch_gemfile_version("spring-watcher-listen")}" gem "web-console", "#{fetch_gemfile_version("web-console")}" end ) file_path = File.join(root, "decidim-generators/lib/decidim/generators/component_templates/Gemfile.erb") File.write(file_path, content) end |
.plugins ⇒ Object
185 186 187 |
# File 'lib/decidim/gem_manager.rb', line 185 def plugins Dir.glob("#{root}/decidim-*/") end |
.replace_file(name, regexp, replacement) ⇒ Object
166 167 168 169 170 |
# File 'lib/decidim/gem_manager.rb', line 166 def replace_file(name, regexp, replacement) new_content = File.read(name).gsub(regexp, replacement) File.write(name, new_content) end |
.replace_versions ⇒ Object
100 101 102 103 104 105 106 107 108 |
# File 'lib/decidim/gem_manager.rb', line 100 def replace_versions all_dirs do |dir| new(dir).replace_gem_version end package_dirs do |dir| new(dir).replace_package_version end end |
.retry_times ⇒ Object
197 198 199 |
# File 'lib/decidim/gem_manager.rb', line 197 def retry_times ENV.fetch("RETRY_TIMES", 10).to_i end |
.run(cmd, out: $stdout) ⇒ Object
88 89 90 |
# File 'lib/decidim/gem_manager.rb', line 88 def run(cmd, out: $stdout) system(cmd, out: out) end |
.run_all(command, out: $stdout, include_root: true) ⇒ Object
135 136 137 138 139 140 141 |
# File 'lib/decidim/gem_manager.rb', line 135 def run_all(command, out: $stdout, include_root: true) all_dirs(include_root: include_root) do |dir| status = run_at(dir, command, out: out) break if !status && fail_fast? end end |
.run_at(dir, command, out: $stdout) ⇒ Object
151 152 153 154 155 156 157 158 159 160 |
# File 'lib/decidim/gem_manager.rb', line 151 def run_at(dir, command, out: $stdout) attempts = 0 until (status = new(dir).run(command, out: out)) attempts += 1 break if attempts > Decidim::GemManager.retry_times end status end |
.run_packages(command, out: $stdout) ⇒ Object
143 144 145 146 147 148 149 |
# File 'lib/decidim/gem_manager.rb', line 143 def run_packages(command, out: $stdout) package_dirs do |dir| status = run_at(dir, command, out: out) break if !status && fail_fast? end end |
.semver_friendly_version(a_version) ⇒ Object
189 190 191 |
# File 'lib/decidim/gem_manager.rb', line 189 def semver_friendly_version(a_version) a_version.gsub(/\.pre/, "-pre").gsub(/\.dev/, "-dev").gsub(/.rc(\d*)/, "-rc\\1") end |
.test_component ⇒ Object
96 97 98 |
# File 'lib/decidim/gem_manager.rb', line 96 def test_component new("decidim-#{COMPONENTS.sample}").run("rake") end |
.test_participatory_space ⇒ Object
92 93 94 |
# File 'lib/decidim/gem_manager.rb', line 92 def test_participatory_space new("decidim-#{PARTICIPATORY_SPACES.sample}").run("rake") end |
.uninstall_all(out: $stdout) ⇒ Object
123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/decidim/gem_manager.rb', line 123 def uninstall_all(out: $stdout) run_all( "gem uninstall %name -v %version --executables --force", out: out ) new(root).run( "rm decidim-*.gem", out: out ) end |
.version ⇒ Object
162 163 164 |
# File 'lib/decidim/gem_manager.rb', line 162 def version @version ||= File.read(version_file).strip end |
Instance Method Details
#capture(command, env: {}, with_stderr: true) ⇒ Object
51 52 53 54 55 |
# File 'lib/decidim/gem_manager.rb', line 51 def capture(command, env: {}, with_stderr: true) interpolated_in_folder(command) do |cmd| self.class.capture(cmd, env: env, with_stderr: with_stderr) end end |
#replace_gem_version ⇒ Object
57 58 59 60 61 62 63 64 65 |
# File 'lib/decidim/gem_manager.rb', line 57 def replace_gem_version Dir.chdir(@dir) do replace_file( "lib/#{name.tr("-", "/")}/version.rb", /def self\.version(\s*)"[^"]*"/, "def self.version\\1\"#{version}\"" ) end end |
#replace_package_version ⇒ Object
67 68 69 70 71 72 73 74 75 |
# File 'lib/decidim/gem_manager.rb', line 67 def replace_package_version Dir.chdir(@dir) do replace_file( "package.json", /^ "version": "[^"]*"/, " \"version\": \"#{semver_friendly_version(version)}\"" ) end end |
#run(command, out: $stdout) ⇒ Object
45 46 47 48 49 |
# File 'lib/decidim/gem_manager.rb', line 45 def run(command, out: $stdout) interpolated_in_folder(command) do |cmd| self.class.run(cmd, out: out) end end |
#short_name ⇒ Object
77 78 79 |
# File 'lib/decidim/gem_manager.rb', line 77 def short_name name.gsub(/decidim-/, "") end |