rexer 0.11.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 86612492af231c5ed6d00b8fe44c305a62013b2aeb3571bbb70c4d53e8ed6b30
4
- data.tar.gz: 1cf5c21eb32b9a30829c1dcc9b823902dd9a560190a44ae9976288f4c340e5f3
3
+ metadata.gz: 236c94fc48362e83c23049edb3b1b21311385622a66793fa19240f42fb702388
4
+ data.tar.gz: 7707f18ae6e414d9390080944292f8537a11b19f03ce93d6142dc106129f7e04
5
5
  SHA512:
6
- metadata.gz: da47f60be431db339d94dbaa944b4732495cc2f29088413826a3828c03c6e140fa438c967f38ed68881058f89d2caff0c3751adf569c9110579e508c29016135
7
- data.tar.gz: 4c48a3ebffb2341d93adde02983cb9019587e00f0be83060f57237967c07fa955a94e2ba34a129392d33be3bc862b557586b931dc02ad4e74135556f17dc239c
6
+ metadata.gz: 12a8e53ccdb53e9da0bbd66787eb4377031353e51d3d3785d3242006cbfe7445acbd5f136664bc5e681d76333ea8e082f7b92b8f1c0fe4923fb41a8a947526bd
7
+ data.tar.gz: f487865de3c6f4064f72e0dae4fca83c9a8c17a711d26e0fb1e2c78058db44b510930cc67d856a19d71059e9cf46f95aeb3d24821266157dfd3eb2e627bfae77
data/README.md CHANGED
@@ -16,8 +16,6 @@ Rexer is a command-line tool for managing Redmine Extension (Plugin and Theme).
16
16
 
17
17
  It is mainly aimed at helping with the development of Redmine and its plugins, allowing you to define extensions in a Ruby DSL and install, uninstall, update, and switch between different sets of the extensions.
18
18
 
19
- [![demo](docs/demo-v0.8.0.gif)](https://asciinema.org/a/672754)
20
-
21
19
  ## What is Redmine Extension?
22
20
 
23
21
  Redmine [Plugin](https://www.redmine.org/projects/redmine/wiki/Plugins) and [Theme](https://www.redmine.org/projects/redmine/wiki/Themes) are called Redmine Extension in this tool.
@@ -80,15 +78,16 @@ This command uninstalls the extensions and deletes the `.extensions.lock`.
80
78
  ```
81
79
  $ rex
82
80
  Commands:
83
- rex envs # Show the list of environments and their extensions defined in .extensions.rb
84
- rex help [COMMAND] # Describe available commands or one specific command
85
- rex init # Create a new .extensions.rb file
86
- rex install [ENV] # Install the definitions in .extensions.rb for the specified environment
87
- rex state # Show the current state of the installed extensions
88
- rex switch [ENV] # Uninstall extensions for the currently installed environment and install extensions for the specified environment
89
- rex uninstall # Uninstall extensions for the currently installed environment based on the state in .extensions.lock and remove the lock file
90
- rex update # Update extensions for the currently installed environment to the latest version
91
- rex version # Show Rexer version
81
+ rex envs # Show the list of environments and their extensions defined in .extensions.rb
82
+ rex help [COMMAND] # Describe available commands or one specific command
83
+ rex init # Create a new .extensions.rb file
84
+ rex install [ENV] # Install the definitions in .extensions.rb for the specified environment
85
+ rex reinstall [PLUGIN or THEME] # Uninstall extensions for the currently installed environment and install them again
86
+ rex state # Show the current state of the installed extensions
87
+ rex switch [ENV] # Uninstall extensions for the currently installed environment and install extensions for the specified environment
88
+ rex uninstall # Uninstall extensions for the currently installed environment based on the state in .extensions.lock and remove the lock file
89
+ rex update # Update extensions for the currently installed environment to the latest version
90
+ rex version # Show Rexer version
92
91
 
93
92
  Options:
94
93
  -v, [--verbose], [--no-verbose], [--skip-verbose] # Detailed output
@@ -204,6 +203,25 @@ In the above case, the `bin/rails redmine:plugins:migrate` command is executed a
204
203
 
205
204
  ## Developing
206
205
 
206
+ ### Running the command
207
+
208
+ You can run the command in your local environment without installing the gem as follows.
209
+
210
+ Setting up the development environment.
211
+
212
+ ```
213
+ $ git clone <this repository>
214
+ $ cd rexer
215
+ $ bundle install
216
+ ```
217
+
218
+ Running the command.
219
+
220
+ ```
221
+ $ cd /path/to/your-local-redmine-source
222
+ $ /your-local-rexer-source/bin/dev state
223
+ ```
224
+
207
225
  ### Running tests
208
226
 
209
227
  First, you need to build the docker image for the integration tests.
@@ -233,6 +251,36 @@ rake standard
233
251
  rake standard:fix
234
252
  ```
235
253
 
254
+ ### Profiling
255
+
256
+ Print the call-stack profile.
257
+
258
+ ```
259
+ $ PROFILE=s /your-local-rexer-source/bin/dev state
260
+ ...
261
+
262
+ == Profile ==
263
+ ==================================
264
+ Mode: wall(1000)
265
+ Samples: 298 (1.97% miss rate)
266
+ GC: 36 (12.08%)
267
+ ==================================
268
+ TOTAL (pct) SAMPLES (pct) FRAME
269
+ 261 (87.6%) 147 (49.3%) Kernel#require
270
+ ...
271
+ ```
272
+
273
+ Print the benchmark.
274
+
275
+ ```
276
+ $ PROFILE=b /your-local-rexer-source/bin/dev state
277
+ ...
278
+
279
+ == Benchmark ==
280
+ user system total real
281
+ 0.253115 0.030599 0.283714 ( 0.283681)
282
+ ```
283
+
236
284
  ## Contributing
237
285
 
238
286
  Bug reports and pull requests are welcome on GitHub at https://github.com/hidakatsuya/rexer.
data/bin/dev CHANGED
@@ -2,4 +2,39 @@
2
2
 
3
3
  require_relative "../lib/rexer"
4
4
 
5
- Rexer::Cli.start(ARGV)
5
+ def with_profiling(profile = false)
6
+ case ENV["PROFILE"]
7
+
8
+ # PROFILE=s dev state
9
+ when "s", "stack"
10
+ require "stackprof"
11
+
12
+ profile = StackProf.run(mode: :wall, interval: 1000) do
13
+ yield
14
+ end
15
+
16
+ puts
17
+ puts "== Profile =="
18
+ StackProf::Report.new(profile).print_text
19
+
20
+ # PROFILE=b dev state
21
+ when "b", "bench"
22
+ require "benchmark"
23
+
24
+ bench = Benchmark.measure do
25
+ yield
26
+ end
27
+
28
+ puts
29
+ puts "== Benchmark =="
30
+ puts Benchmark::CAPTION
31
+ puts bench
32
+
33
+ else
34
+ yield
35
+ end
36
+ end
37
+
38
+ with_profiling(ENV["PROFILE"]) do
39
+ Rexer::Cli.start(ARGV)
40
+ end
data/lib/rexer/cli.rb CHANGED
@@ -24,6 +24,11 @@ module Rexer
24
24
  Commands::Uninstall.new.call
25
25
  end
26
26
 
27
+ desc "reinstall [PLUGIN or THEME]", "Uninstall extensions for the currently installed environment and install them again"
28
+ def reinstall(extension_name)
29
+ Commands::Reinstall.new.call(extension_name)
30
+ end
31
+
27
32
  desc "switch [ENV]", "Uninstall extensions for the currently installed environment and install extensions for the specified environment"
28
33
  def switch(env = "default")
29
34
  Commands::Switch.new.call(env&.to_sym)
@@ -1,5 +1,3 @@
1
- require "paint"
2
-
3
1
  module Rexer
4
2
  module Commands
5
3
  class Init
@@ -0,0 +1,53 @@
1
+ module Rexer
2
+ module Commands
3
+ class Reinstall
4
+ include ActionCallable
5
+
6
+ Action = Data.define(:install, :uninstall)
7
+
8
+ def initialize
9
+ @lock_definition = Definition::Lock.load_data
10
+ end
11
+
12
+ def call(extension_name)
13
+ return if no_lock_file_found
14
+
15
+ extension, action = find_extension_with_action(extension_name.to_sym)
16
+
17
+ if extension.nil?
18
+ puts "#{extension_name} is not installed"
19
+ return
20
+ end
21
+
22
+ reinstall(extension, action)
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :lock_definition
28
+
29
+ def find_extension_with_action(name)
30
+ lock_definition.plugins.find { _1.name == name }&.then do |plugin|
31
+ action = Action.new(Extension::Plugin::Install, Extension::Plugin::Uninstall)
32
+ return [plugin, action]
33
+ end
34
+
35
+ lock_definition.themes.find { _1.name == name }&.then do |theme|
36
+ action = Action.new(Extension::Theme::Install, Extension::Theme::Uninstall)
37
+ return [theme, action]
38
+ end
39
+ end
40
+
41
+ def reinstall(extension, action)
42
+ call_action action.uninstall, extension
43
+ call_action action.install, extension
44
+ end
45
+
46
+ def no_lock_file_found
47
+ lock_definition.nil?.tap { |result|
48
+ puts "No lock file found" if result
49
+ }
50
+ end
51
+ end
52
+ end
53
+ end
@@ -63,7 +63,7 @@ module Rexer
63
63
  end
64
64
 
65
65
  def build_source(opts)
66
- type = opts.keys.find { Rexer::Source.const_defined?(_1.capitalize) }
66
+ type = opts.keys.find { Rexer::Source.names.include?(_1) }
67
67
  Source.new(type, opts[type]) if type
68
68
  end
69
69
  end
@@ -1,6 +1,10 @@
1
1
  module Rexer
2
2
  module Source
3
3
  class Base
4
+ def self.inherited(subclass)
5
+ Source.names << subclass.name.split("::").last.downcase.to_sym
6
+ end
7
+
4
8
  # Load the source to the given path.
5
9
  def load(_path)
6
10
  raise "Not implemented"
data/lib/rexer/source.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  module Rexer
2
2
  module Source
3
+ def self.names = @names ||= []
4
+
3
5
  def self.from_definition(source)
4
6
  const_get(source.type.capitalize).new(**source.options)
5
7
  end
data/lib/rexer/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rexer
2
- VERSION = "0.11.0"
2
+ VERSION = "0.12.0"
3
3
  end
data/lib/rexer.rb CHANGED
@@ -32,3 +32,4 @@ require "zeitwerk"
32
32
 
33
33
  loader = Zeitwerk::Loader.for_gem
34
34
  loader.setup
35
+ loader.eager_load
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rexer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katsuya Hidaka
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-09-07 00:00:00.000000000 Z
11
+ date: 2024-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -115,6 +115,7 @@ files:
115
115
  - lib/rexer/commands/envs.rb
116
116
  - lib/rexer/commands/init.rb
117
117
  - lib/rexer/commands/install.rb
118
+ - lib/rexer/commands/reinstall.rb
118
119
  - lib/rexer/commands/state.rb
119
120
  - lib/rexer/commands/switch.rb
120
121
  - lib/rexer/commands/uninstall.rb