devpack 0.4.1 → 0.4.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bc62279883bef6f044e47c419b853c89b33e76f699d7106575cd87869967b36d
4
- data.tar.gz: 48a959cbd1004dce6752b6fb723905ad40f92c02cf73cd8432b969309d94f5a8
3
+ metadata.gz: 2019c7650f694b42f7b6dc248cab53d227b3818aa126d91b64375ca305592622
4
+ data.tar.gz: a0084d6a265e4a30a36baf09f16f20c2665bae572b36af660dcd54a0ca7193b5
5
5
  SHA512:
6
- metadata.gz: a473937535208f922c6ceed0e137cfa758bf806bb39516e6f01906d748ef219c0fcb69fba33e195c49e95f045cf335267b7b997f300c30e6311792becba6a4ea
7
- data.tar.gz: 5e4247975b02ec3432344755432bb887ca7036cdb9792a3c8377d3a091dc5c92a464e0e8cf5dcda82248f2039e4c6ca0efedacf4761bec870d0d2fe6101cd254
6
+ metadata.gz: 78ecad5e11f27adcff1493669277001bf655457eb3eb30de370880efe6105f5dc0e0cb21efbbdd6c7a2a2981edf4db429ba67f00c6fc999310985aa04fa7eeca
7
+ data.tar.gz: f9a8f213d55ed153fdbc3c63adcb09b223a951e01a53cc01709135b58388c45bb718f565dfa1895ea69ab199d9f232d3e0e30b75fcb0022db5df05e68b8136b5
data/CHANGELOG.md CHANGED
@@ -39,3 +39,12 @@ Rename `DISABLE_DEVPACK` environment variable to `DEVPACK_DISABLE` for consisten
39
39
  ## 0.2.1
40
40
 
41
41
  Fully activate gem on load: add gem spec to `Gem.loaded_specs` and set instance variables `@loaded` and `@activated` to `true`. This mimics `Gem::Specification#activate` to ensure that anything that depends on these characteristics will function as normal.
42
+
43
+ ## 0.4.2
44
+
45
+ - Add support for gems which are not required automatically
46
+ - Fix requiring gems where a hyphen in the gem name corresponds to a path slash in the require.
47
+
48
+ ## 0.4.3
49
+
50
+ Locate gems via `Gem.path` instead of reading the `GEM_PATH`/`GEM_HOME` environment variables directly. When `BUNDLE_PATH` is configured (e.g. in Docker images), Bundler sets `GEM_PATH` to an empty string so that RubyGems searches only the bundle path — read literally, that meant no search path at all, so installed gems were never found. `Gem.path` resolves the same variables the way RubyGems does.
data/README.md CHANGED
@@ -14,6 +14,10 @@ better_errors
14
14
 
15
15
  # Optionally specify a version:
16
16
  pry:0.13.1
17
+
18
+ # Or add an asterisk at the start of a line to not require the gem automatically:
19
+ # (equivalent to adding `require: false` to the gem's entry in the Gemfile)
20
+ *brakeman
17
21
  ```
18
22
 
19
23
  Add _Devpack_ to any project's `Gemfile`:
@@ -17,6 +17,7 @@ module Devpack
17
17
  File.readlines(devpack_path)
18
18
  .map(&filter_comments)
19
19
  .compact
20
+ .map { |line| GemRef.parse(line) }
20
21
  end
21
22
 
22
23
  def devpack_path
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Devpack
4
- # Locates gems by searching in paths listed in GEM_PATH
4
+ # Locates gems by searching in RubyGems' effective search path (Gem.path)
5
5
  class GemGlob
6
6
  def find(name)
7
7
  matched_paths(name)
@@ -15,10 +15,13 @@ module Devpack
15
15
  @glob ||= gem_paths.map { |path| Dir.glob(path.join('gems', '*')) }.flatten
16
16
  end
17
17
 
18
+ # Gem.path rather than the GEM_PATH/GEM_HOME environment variables:
19
+ # Bundler sets GEM_PATH to an empty string when BUNDLE_PATH is configured
20
+ # (so RubyGems searches only the bundle path), which read literally is no
21
+ # search path at all. Gem.path resolves the same variables the way
22
+ # RubyGems does.
18
23
  def gem_paths
19
- return [] if gem_path.nil?
20
-
21
- gem_path.split(':').map { |path| Pathname.new(path) }
24
+ Gem.path.map { |path| Pathname.new(path) }
22
25
  end
23
26
 
24
27
  def match?(name_with_version, basename)
@@ -42,12 +45,5 @@ module Devpack
42
45
  def version(path)
43
46
  Gem::Version.new(File.split(path).last.rpartition('-').last)
44
47
  end
45
-
46
- def gem_path
47
- return ENV.fetch('GEM_PATH', nil) if ENV.key?('GEM_PATH')
48
- return ENV.fetch('GEM_HOME', nil) if ENV.key?('GEM_HOME')
49
-
50
- nil
51
- end
52
48
  end
53
49
  end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Devpack
4
+ # Provides extended syntax for gem definitions, allowing `require: false` semantics via an
5
+ # asterisrk prefix in `.devpack` file, e.g. `*my_gem`
6
+ class GemRef
7
+ def self.parse(line)
8
+ name, _, version = line.partition(':')
9
+ no_require = name.start_with?('*')
10
+ name = name.sub('*', '') if no_require
11
+ new(name: name, version: version.empty? ? nil : Gem::Requirement.new(version), no_require: no_require)
12
+ end
13
+
14
+ def initialize(name:, version: nil, no_require: false)
15
+ @name = name
16
+ @version = version
17
+ @no_require = no_require
18
+ end
19
+
20
+ attr_reader :name, :version
21
+
22
+ def require?
23
+ !@no_require
24
+ end
25
+
26
+ def eql?(other)
27
+ name == other.name && version == other.version && require? == other.require?
28
+ end
29
+
30
+ def to_s
31
+ "#{require? ? '*' : ''}#{@name}:#{@version}"
32
+ end
33
+ end
34
+ end
data/lib/devpack/gems.rb CHANGED
@@ -34,14 +34,14 @@ module Devpack
34
34
  end
35
35
 
36
36
  def load_devpack
37
- @config.requested_gems.map do |requested|
38
- name, _, version = requested.partition(':')
39
- load_gem(name, version.empty? ? nil : Gem::Requirement.new(version))
37
+ @config.requested_gems.map do |gem|
38
+ load_gem(gem)
40
39
  end.compact
41
40
  end
42
41
 
43
- def load_gem(name, requirement)
44
- [name, activate(name, requirement)]
42
+ def load_gem(gem)
43
+ name = gem.name
44
+ [name, activate(gem)]
45
45
  rescue LoadError => e
46
46
  deactivate(name)
47
47
  nil.tap { @failures << { name: name, message: load_error_message(e) } }
@@ -51,18 +51,27 @@ module Devpack
51
51
  nil.tap { @incompatible << e.meta }
52
52
  end
53
53
 
54
- def activate(name, version)
55
- spec = GemSpec.new(@gem_glob, name, version)
54
+ def activate(gem)
55
+ spec = GemSpec.new(@gem_glob, gem.name, gem.version)
56
56
  update_load_path(spec.require_paths)
57
57
  # NOTE: do this before we require, because some gems use the gemspec to
58
58
  # declare their version...
59
- Gem.loaded_specs[name] = spec.gemspec
60
- loaded = Kernel.require(name)
59
+ Gem.loaded_specs[gem.name] = spec.gemspec
60
+ loaded = require_gem(gem.name) if gem.require?
61
61
  spec.gemspec&.activated = true
62
62
  spec.gemspec&.instance_variable_set(:@loaded, true)
63
63
  loaded
64
64
  end
65
65
 
66
+ def require_gem(name)
67
+ Kernel.require(name)
68
+ rescue LoadError => e
69
+ raise e unless name.include?('-')
70
+
71
+ namespaced_file = name.tr('-', '/')
72
+ Kernel.require namespaced_file
73
+ end
74
+
66
75
  def deactivate(name)
67
76
  Gem.loaded_specs.delete(name)
68
77
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Devpack
4
- VERSION = '0.4.1'
4
+ VERSION = '0.4.3'
5
5
  end
data/lib/devpack.rb CHANGED
@@ -6,6 +6,7 @@ require 'set'
6
6
 
7
7
  require 'devpack/timeable'
8
8
  require 'devpack/config'
9
+ require 'devpack/gem_ref'
9
10
  require 'devpack/gems'
10
11
  require 'devpack/gem_glob'
11
12
  require 'devpack/gem_spec'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devpack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bob Farrell
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-01-01 00:00:00.000000000 Z
11
+ date: 2026-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: byebug
@@ -121,6 +121,7 @@ files:
121
121
  - lib/devpack/config.rb
122
122
  - lib/devpack/exec.rb
123
123
  - lib/devpack/gem_glob.rb
124
+ - lib/devpack/gem_ref.rb
124
125
  - lib/devpack/gem_spec.rb
125
126
  - lib/devpack/gems.rb
126
127
  - lib/devpack/initializers.rb
@@ -152,7 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
152
153
  - !ruby/object:Gem::Version
153
154
  version: '0'
154
155
  requirements: []
155
- rubygems_version: 3.2.3
156
+ rubygems_version: 3.5.22
156
157
  signing_key:
157
158
  specification_version: 4
158
159
  summary: Conveniently tailor your development environment