devpack 0.4.1 → 0.4.2

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: bc62279883bef6f044e47c419b853c89b33e76f699d7106575cd87869967b36d
4
- data.tar.gz: 48a959cbd1004dce6752b6fb723905ad40f92c02cf73cd8432b969309d94f5a8
3
+ metadata.gz: a1e05e13ceb910b6601399b116f59d3b11e62af8c7e34f8f6f1fc031c1b74fc4
4
+ data.tar.gz: fbca64d53a5a5085befabca5d649b5668ebd84bed67dd1668936ae7e28e9e845
5
5
  SHA512:
6
- metadata.gz: a473937535208f922c6ceed0e137cfa758bf806bb39516e6f01906d748ef219c0fcb69fba33e195c49e95f045cf335267b7b997f300c30e6311792becba6a4ea
7
- data.tar.gz: 5e4247975b02ec3432344755432bb887ca7036cdb9792a3c8377d3a091dc5c92a464e0e8cf5dcda82248f2039e4c6ca0efedacf4761bec870d0d2fe6101cd254
6
+ metadata.gz: 9a9e01ed128597f605fbd6d0225d3535e2eb8a7d333d9bc280f8047ee6f60c27878d565337c6cded53877995f27611679fa201a6c9d9076c43b58e94d0749224
7
+ data.tar.gz: 6f251f060455124c56fb4b19adb278d505af10cc9d008a55f3bab3d2cbc23d8756231c52d9eec21cc41a372ad5cbe2bb95c3cc5759a299da39fae2f9425bf91d
data/CHANGELOG.md CHANGED
@@ -39,3 +39,8 @@ 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.
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
@@ -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.2'
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.2
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: 2024-03-05 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