rexer 0.15.0 → 0.17.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: a65472e424f27d1a96fa1be7093fcb9eac2f59606dd9b93c907dfec412b8309d
4
- data.tar.gz: b56d1515e26fd98f800c772f64511bd241c83e1e0b706f4bbdd6b2cbf734a375
3
+ metadata.gz: 0aa31136277eb6010005efd6b949d33791f40c43cf2c10e4c59aaa63f7635874
4
+ data.tar.gz: 7782364e1ae8e1c068d89c416feb8f058f39babfa9a4bf949c238cf828f51975
5
5
  SHA512:
6
- metadata.gz: bdeb0d3f7855f8fef1710f0d7918ce2b24c39004ac2cc0fa3ddd3c1e201eb5bf3afef7c08531caa539842189eb95fa99fd11166bdbcfc8fbef4ea5345541d2c8
7
- data.tar.gz: 160d63e6239cd0d417443d2935c35a826340040cc917c28f29d3827e5e9db53bcacdc28a45c9a665f12e4087a88b436407258fe995dfd1ab08a30a25cd057783
6
+ metadata.gz: a657e3d3ace4b1134d455b05fc9dabc1905e96fb88870b41d0b771c4bd7e7803949b333a422a724a8d15937613cba04a692105a51c7332ba74f35dc996010459
7
+ data.tar.gz: ec8fed06a4d98da769d42c99266caa91f6250f738e71ca39536f66f0ed1a570594b8b3f5c96166ee4563137a9e7c6a008842582138af70412e96e6438a9ffcf2
data/README.md CHANGED
@@ -79,23 +79,24 @@ This command uninstalls the extensions and deletes the `.extensions.lock`.
79
79
  ```
80
80
  $ rex
81
81
  Commands:
82
- rex envs # Show the list of environments and their extensions defined in .extensions.rb
83
- rex help [COMMAND] # Describe available commands or one specific command
84
- rex init # Create a new .extensions.rb file
85
- rex install [ENV] # Install the definitions in .extensions.rb for the specified environment
86
- rex reinstall [PLUGIN or THEME] # Uninstall extensions for the currently installed environment and install them again
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 if extensions are updateable
91
- rex version # Show Rexer version
82
+ rex edit # Edit .extensions.rb
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 reinstall [extension] # Uninstall extensions for the currently installed environment and install them again
88
+ rex state # Show the current state of the installed extensions
89
+ rex switch [env] # Uninstall extensions for the currently installed environment and install extensions for the specified environment
90
+ rex uninstall # Uninstall extensions for the currently installed environment based on the state in .extensions.lock and remove the lock file
91
+ rex update [extensions...] # Update extensions for the currently installed environment to the latest version if extensions are updateable. If no extensions are specified, all extensions are updated
92
+ rex version # Show Rexer version
92
93
 
93
94
  Options:
94
95
  -v, [--verbose], [--no-verbose], [--skip-verbose] # Detailed output
95
96
  -q, [--quiet], [--no-quiet], [--skip-quiet] # Minimal output
96
97
  ```
97
98
 
98
- ### rex install [ENV]
99
+ ### rex install [env]
99
100
 
100
101
  Installs extensions in the specified ENV environment and makes them available for use. Specifically, it does the following:
101
102
 
@@ -106,7 +107,7 @@ If the specified ENV is currently installed, it compares the current `.extension
106
107
  * Uninstalls deleted extensions (the `uninstalled` hook is executed).
107
108
  * Reload extensions whose source settings has changed (for example, the `branch` or `tag` has changed) and runs the database migration if necessary.
108
109
 
109
- ### rex update
110
+ ### rex update [extensions...]
110
111
 
111
112
  Loads `.extensions.lock` and updates the currently installed extensions to the latest version. `.extensions.rb` is NOT referenced in this command.
112
113
 
data/lib/rexer/cli.rb CHANGED
@@ -15,7 +15,7 @@ module Rexer
15
15
  Commands::Init.new.call
16
16
  end
17
17
 
18
- desc "install [ENV]", "Install the definitions in .extensions.rb for the specified environment"
18
+ desc "install [env]", "Install the definitions in .extensions.rb for the specified environment"
19
19
  def install(env = "default")
20
20
  Commands::Install.new.call(env&.to_sym)
21
21
  end
@@ -25,19 +25,19 @@ module Rexer
25
25
  Commands::Uninstall.new.call
26
26
  end
27
27
 
28
- desc "reinstall [PLUGIN or THEME]", "Uninstall extensions for the currently installed environment and install them again"
28
+ desc "reinstall [extension]", "Uninstall extensions for the currently installed environment and install them again"
29
29
  def reinstall(extension_name)
30
30
  Commands::Reinstall.new.call(extension_name)
31
31
  end
32
32
 
33
- desc "switch [ENV]", "Uninstall extensions for the currently installed environment and install extensions for the specified environment"
33
+ desc "switch [env]", "Uninstall extensions for the currently installed environment and install extensions for the specified environment"
34
34
  def switch(env = "default")
35
35
  Commands::Switch.new.call(env&.to_sym)
36
36
  end
37
37
 
38
- desc "update", "Update extensions for the currently installed environment to the latest version if extensions are updateable"
39
- def update
40
- Commands::Update.new.call
38
+ desc "update [extensions...]", "Update extensions for the currently installed environment to the latest version if extensions are updateable. If no extensions are specified, all extensions are updated"
39
+ def update(*extension_names)
40
+ Commands::Update.new.call(extension_names)
41
41
  end
42
42
 
43
43
  desc "state", "Show the current state of the installed extensions"
@@ -50,6 +50,11 @@ module Rexer
50
50
  Commands::Envs.new.call
51
51
  end
52
52
 
53
+ desc "edit", "Edit .extensions.rb"
54
+ def edit
55
+ Commands::Edit.new.call
56
+ end
57
+
53
58
  desc "version", "Show Rexer version"
54
59
  def version
55
60
  puts Rexer::VERSION
@@ -0,0 +1,28 @@
1
+ require "shellwords"
2
+
3
+ module Rexer
4
+ module Commands
5
+ class Edit
6
+ def call
7
+ definition_file = Definition.file
8
+
9
+ if editor.to_s.empty?
10
+ puts Paint["Please set your $VISUAL or $EDITOR environment variable.", :red]
11
+ exit 1
12
+ end
13
+
14
+ edit_system_editor(definition_file.to_s)
15
+ end
16
+
17
+ private
18
+
19
+ def editor
20
+ ENV["VISUAL"].to_s.empty? ? ENV["EDITOR"] : ENV["VISUAL"]
21
+ end
22
+
23
+ def edit_system_editor(file_path)
24
+ system(*Shellwords.split(editor), file_path)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -2,7 +2,12 @@ module Rexer
2
2
  module Commands
3
3
  class Init
4
4
  def call
5
- definition_file = Definition.file
5
+ unless redmine_root_dir?
6
+ puts Paint["Please run in the Redmine root directory.", :red]
7
+ exit 1
8
+ end
9
+
10
+ definition_file = Pathname.new(Rexer.definition_file)
6
11
 
7
12
  if definition_file.exist?
8
13
  puts Paint["#{definition_file.basename} already exists", :red]
@@ -34,6 +39,10 @@ module Rexer
34
39
 
35
40
  TEMPLATE
36
41
  end
42
+
43
+ def redmine_root_dir?
44
+ Pathname.new("README.rdoc").then { _1.exist? && _1.read.include?("Redmine") }
45
+ end
37
46
  end
38
47
  end
39
48
  end
@@ -7,29 +7,37 @@ module Rexer
7
7
  @lock_definition = Definition::Lock.load_data
8
8
  end
9
9
 
10
- def call
10
+ def call(extension_names)
11
11
  return if no_lock_file_found
12
12
 
13
- update_themes
14
- update_plugins
13
+ extension_names ||= []
14
+ extension_names.map!(&:to_sym)
15
+
16
+ update_themes(extension_names)
17
+ update_plugins(extension_names)
15
18
  end
16
19
 
17
20
  private
18
21
 
19
22
  attr_reader :lock_definition
20
23
 
21
- def update_plugins
22
- lock_definition.plugins.each do
24
+ def update_plugins(extension_names)
25
+ filter_by_name(lock_definition.plugins, extension_names).each do
23
26
  call_action Extension::Plugin::Update, _1
24
27
  end
25
28
  end
26
29
 
27
- def update_themes
28
- lock_definition.themes.each do
30
+ def update_themes(extension_names)
31
+ filter_by_name(lock_definition.themes, extension_names).each do
29
32
  call_action Extension::Theme::Update, _1
30
33
  end
31
34
  end
32
35
 
36
+ def filter_by_name(extensions, extension_names)
37
+ return extensions unless extension_names.any?
38
+ extensions.select { extension_names.include?(_1.name) }
39
+ end
40
+
33
41
  def no_lock_file_found
34
42
  lock_definition.nil?.tap { |result|
35
43
  puts "No lock file found" if result
@@ -2,7 +2,7 @@ module Rexer
2
2
  module Definition
3
3
  module Lock
4
4
  def self.file
5
- @file ||= Pathname.new(Rexer.definition_lock_file)
5
+ @file ||= Definition.dir.join(Rexer.definition_lock_file)
6
6
  end
7
7
 
8
8
  def self.load_data
@@ -10,6 +10,8 @@ module Rexer
10
10
 
11
11
  dsl = Dsl.new.tap { _1.instance_eval(file.read) }
12
12
  dsl.to_data
13
+ rescue DefinitionFileNotFound
14
+ nil
13
15
  end
14
16
 
15
17
  def self.create_file(env)
@@ -10,6 +10,12 @@ module Rexer
10
10
  end
11
11
  end
12
12
 
13
+ class DefinitionFileNotFound < StandardError
14
+ def initialize
15
+ super("No definition file (#{Rexer.definition_file}) found")
16
+ end
17
+ end
18
+
13
19
  Source = ::Data.define(:type, :options)
14
20
 
15
21
  Plugin = ::Data.define(:name, :source, :hooks, :env) do
@@ -20,13 +26,32 @@ module Rexer
20
26
  include ExtensionComparable
21
27
  end
22
28
 
29
+ def self.dir
30
+ @dir ||= find_difinition_dir
31
+ end
32
+
23
33
  def self.file
24
- @file ||= Pathname.new(Rexer.definition_file)
34
+ @file ||= dir.join(Rexer.definition_file)
25
35
  end
26
36
 
27
37
  def self.load_data
28
38
  dsl = Dsl.new.tap { _1.instance_eval(file.read) }
29
39
  dsl.to_data
40
+ rescue DefinitionFileNotFound
41
+ nil
42
+ end
43
+
44
+ def self.find_difinition_dir
45
+ definition_file = Rexer.definition_file
46
+ dir = Pathname.pwd
47
+
48
+ until dir.join(definition_file).exist?
49
+ raise DefinitionFileNotFound if dir.root?
50
+ dir = dir.parent
51
+ end
52
+
53
+ dir
30
54
  end
55
+ private_class_method :find_difinition_dir
31
56
  end
32
57
  end
@@ -1,11 +1,7 @@
1
- require "active_support/core_ext/class/attribute"
2
-
3
1
  module Rexer
4
2
  module Extension
5
3
  module Entity
6
4
  class Base
7
- class_attribute :root_dir
8
-
9
5
  def initialize(definition)
10
6
  @definition = definition
11
7
  @hooks = definition.hooks || {}
@@ -14,6 +10,8 @@ module Rexer
14
10
 
15
11
  attr_reader :hooks, :name
16
12
 
13
+ def root_dir = raise "Not implemented"
14
+
17
15
  def exist?
18
16
  path.exist? && !path.empty?
19
17
  end
@@ -36,7 +34,9 @@ module Rexer
36
34
  end
37
35
 
38
36
  class Plugin < Base
39
- self.root_dir = Pathname.new("plugins")
37
+ def root_dir
38
+ @root_dir ||= Rexer.redmine_root_dir.join("plugins")
39
+ end
40
40
 
41
41
  def contains_db_migrations?
42
42
  path.join("db", "migrate").then { _1.exist? && !_1.empty? }
@@ -48,7 +48,9 @@ module Rexer
48
48
  end
49
49
 
50
50
  class Theme < Base
51
- self.root_dir = Pathname.new("themes")
51
+ def root_dir
52
+ @root_dir ||= Rexer.redmine_root_dir.join("themes")
53
+ end
52
54
  end
53
55
  end
54
56
  end
@@ -16,12 +16,8 @@ module Rexer
16
16
 
17
17
  attr_reader :plugin
18
18
 
19
- def needs_db_migration?
20
- plugin.contains_db_migrations?
21
- end
22
-
23
19
  def run_db_migrate(extra_envs = {})
24
- return unless needs_db_migration?
20
+ return unless plugin.contains_db_migrations?
25
21
 
26
22
  envs = {"NAME" => plugin.name.to_s}.merge(extra_envs)
27
23
  cmds = build_cmd("bundle", "exec", "rake", Rexer.verbosity.debug? ? nil : "-q", "redmine:plugins:migrate", envs:)
@@ -35,7 +35,7 @@ module Rexer
35
35
  end
36
36
 
37
37
  def call_installed_hook
38
- plugin.hooks[:installed]&.call
38
+ Rexer.redmine_root_dir { plugin.hooks[:installed]&.call }
39
39
  end
40
40
  end
41
41
  end
@@ -28,7 +28,7 @@ module Rexer
28
28
  end
29
29
 
30
30
  def call_uninstalled_hook
31
- plugin.hooks[:uninstalled]&.call
31
+ Rexer.redmine_root_dir { plugin.hooks[:uninstalled]&.call }
32
32
  end
33
33
  end
34
34
  end
@@ -23,7 +23,7 @@ module Rexer
23
23
  end
24
24
 
25
25
  def call_installed_hook
26
- theme.hooks[:installed]&.call
26
+ Rexer.redmine_root_dir { theme.hooks[:installed]&.call }
27
27
  end
28
28
  end
29
29
  end
@@ -23,7 +23,7 @@ module Rexer
23
23
  end
24
24
 
25
25
  def call_uninstalled_hook
26
- theme.hooks[:uninstalled]&.call
26
+ Rexer.redmine_root_dir { theme.hooks[:uninstalled]&.call }
27
27
  end
28
28
  end
29
29
  end
data/lib/rexer/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rexer
2
- VERSION = "0.15.0"
2
+ VERSION = "0.17.0"
3
3
  end
data/lib/rexer.rb CHANGED
@@ -21,6 +21,14 @@ module Rexer
21
21
  ".extensions.lock"
22
22
  end
23
23
 
24
+ def redmine_root_dir
25
+ if block_given?
26
+ Dir.chdir(Definition.dir) { yield }
27
+ else
28
+ Definition.dir
29
+ end
30
+ end
31
+
24
32
  def config
25
33
  @config ||= Config.new(command_prefix: ENV["REXER_COMMAND_PREFIX"])
26
34
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rexer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katsuya Hidaka
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2024-11-27 00:00:00.000000000 Z
10
+ date: 2025-02-16 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: thor
@@ -126,6 +125,7 @@ files:
126
125
  - lib/rexer.rb
127
126
  - lib/rexer/cli.rb
128
127
  - lib/rexer/commands.rb
128
+ - lib/rexer/commands/edit.rb
129
129
  - lib/rexer/commands/envs.rb
130
130
  - lib/rexer/commands/init.rb
131
131
  - lib/rexer/commands/install.rb
@@ -160,7 +160,6 @@ licenses:
160
160
  - MIT
161
161
  metadata:
162
162
  source_code_uri: https://github.com/hidakatsuya/rexer
163
- post_install_message:
164
163
  rdoc_options: []
165
164
  require_paths:
166
165
  - lib
@@ -168,15 +167,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
168
167
  requirements:
169
168
  - - ">="
170
169
  - !ruby/object:Gem::Version
171
- version: 3.0.0
170
+ version: 3.1.0
172
171
  required_rubygems_version: !ruby/object:Gem::Requirement
173
172
  requirements:
174
173
  - - ">="
175
174
  - !ruby/object:Gem::Version
176
175
  version: '0'
177
176
  requirements: []
178
- rubygems_version: 3.5.11
179
- signing_key:
177
+ rubygems_version: 3.6.2
180
178
  specification_version: 4
181
179
  summary: A command-line tool for managing Redmine Plugins and Themes
182
180
  test_files: []