stimpack 0.7.1 → 0.8.1

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: be1d3fa462f2ec696d5c72721fd96cead8a0bb2c08f238f2ffab9af6ce753ea9
4
- data.tar.gz: 2a09c371fea45fca32c6d386ec6588887a04326ee306b81199edeb7e4ffa2cb3
3
+ metadata.gz: 46d22ca966c49e9a2f424291c0c44caec1ea24664c3239f1cca1fa4e218e91bf
4
+ data.tar.gz: 5a393fa3f27d5b9bcab1edf0d193f9a4cf7d64410d4184725b6cc26ac6e66679
5
5
  SHA512:
6
- metadata.gz: 56a878d5ccc64a91ab8366759d6900758e80a59f0a4ad60b8c8397849e975f2043e46926bff5ac6ec1745aad5d69fd78ba5cc7dcce2242f45aeb374a5483863a
7
- data.tar.gz: 8767f7b944326da96773793170b32b5e880bfebc1ad0e8ab657e2d84154a874c9a50603ebd0c1e9e5bd4fead7c13810e5e93e10e6072e40e99fa9485d550fa09
6
+ metadata.gz: 97ab5bfa795b0cd6008a13df1bb297e51191b5da2e561421e64b1fef71a80724709ffed50fdb66504102ca4625d532afb77564744564b8f77919c2aa3ff68b1b
7
+ data.tar.gz: 70eb5b61e2739cd657f31bd0ec79bc221f12ac3c0507365fec6701fda7deaae4839d0c127c6bab423ac3083b35852e03d0b5b0e4fd042245c894e45e48dce166
data/README.md CHANGED
@@ -46,7 +46,7 @@ packs/
46
46
  my_domain/
47
47
  my_private_namespaced_model_factory.rb
48
48
  my_other_domain/
49
- ... # other pack's have a similar structure
49
+ ... # other packs have a similar structure
50
50
  my_other_other_domain/
51
51
  ...
52
52
  ```
@@ -83,7 +83,7 @@ draw(:my_domain)
83
83
  ```
84
84
 
85
85
  ### Making your Package an Engine
86
- Add `engine: true` to your `package.yml` to make it an actual Rails engine:
86
+ Add `engine: true` to your `package.yml` to make it an actual Rails engine ([read more about what this means here](https://guides.rubyonrails.org/engines.html)):
87
87
  ```yml
88
88
  # packs/my_pack/package.yml
89
89
  enforce_dependencies: true
@@ -92,6 +92,8 @@ metadata:
92
92
  engine: true
93
93
  ```
94
94
 
95
+ ## Ecosystem and Integrations
96
+
95
97
  ### RSpec Integration
96
98
  Simply add `--require stimpack/rspec` to your `.rspec`.
97
99
  Or, if you'd like, pass it as an argument to `rspec`:
@@ -121,6 +123,27 @@ rspec packs/foobar/spec
121
123
  rspec packs/foobar/nested_pack
122
124
  ```
123
125
 
126
+ #### parallel_tests
127
+
128
+ `parallel_tests` has it its own spec discovery mechanism, so Stimpack's RSpec integration doesn't do anything when you use them together.
129
+ To make them work, you'll need to explicitly specify the spec paths:
130
+
131
+ ```bash
132
+ RAILS_ENV=test bundle exec parallel_test spec packs/**/spec -t rspec <other_options>
133
+ ```
134
+
135
+ #### Knapsack (Pro)
136
+
137
+ Similarly, Knapsack (and its Pro version) has its own spec discovery mechanism and the API will find and queue the relevant specs.
138
+ To make it discover your pack tests as well, you'll need to configure the following variables:
139
+
140
+ ```yaml
141
+ KNAPSACK_PRO_TEST_DIR: spec
142
+ KNAPSACK_PRO_TEST_FILE_PATTERN: '{spec,packs}/**{,/*/**}/*_spec.rb'
143
+ ```
144
+
145
+ Setting `KNAPSACK_PRO_TEST_FILE_PATTERN` will tell Knapsack where your specs are located, while setting `KNAPSACK_PRO_TEST_DIR` is necessary because otherwise an incorrect value is sent to rspec via the `--default-path` option.
146
+
124
147
  ## Contributing
125
148
 
126
149
  Bug reports and pull requests are welcome on GitHub at https://github.com/Gusto/stimpack.
@@ -1,3 +1,5 @@
1
+ # typed: true
2
+
1
3
  module Stimpack
2
4
  module Integrations
3
5
  class FactoryBot
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  require "active_support/inflections"
4
5
 
@@ -14,17 +15,21 @@ module Stimpack
14
15
  end
15
16
 
16
17
  def create_engines
18
+ # Ideally, the user just does `Packs.configure { |config| config.roots = '...' }`
19
+ # But that would be a public API change and can come later
20
+ Packs.configure { |config| config.roots = Array(Stimpack.config.root) }
21
+
17
22
  Packs.all.each do |pack|
18
- next unless pack.config.engine?
23
+ next unless pack.metadata['engine']
19
24
 
20
- pack.engine = create_engine(pack)
25
+ create_engine(pack)
21
26
  end
22
27
  end
23
28
 
24
29
  def inject_paths
25
30
  Packs.all.each do |pack|
26
31
  Stimpack.config.paths.each do |path|
27
- @app.paths[path] << pack.path.join(path)
32
+ @app.paths[path] << pack.relative_path.join(path)
28
33
  end
29
34
  end
30
35
  end
@@ -43,8 +48,8 @@ module Stimpack
43
48
  end
44
49
 
45
50
  def create_engine(pack)
46
- name = pack.path.relative_path_from(Stimpack::Packs.root)
47
- namespace = create_namespace(pack.name)
51
+ name = pack.last_name
52
+ namespace = create_namespace(name)
48
53
  stim = Stim.new(pack, namespace)
49
54
  namespace.const_set("Engine", Class.new(::Rails::Engine)).include(stim)
50
55
  end
@@ -1,6 +1,10 @@
1
+ # typed: true
2
+
1
3
  module Stimpack
2
4
  module Integrations
3
5
  class RSpec
6
+ extend T::Sig
7
+
4
8
  def initialize
5
9
  # This is the list of directories RSpec was told to run.
6
10
  to_run = ::RSpec.configuration.instance_variable_get(:@files_or_directories_to_run)
@@ -10,6 +14,7 @@ module Stimpack
10
14
  # This is the default case when you run `rspec`. We want to add all the pack's spec paths
11
15
  # to the collection of directories to run.
12
16
 
17
+ Packs.configure { |config| config.roots = Array(Stimpack.config.root) }
13
18
  pack_paths = Packs.all.map do |pack|
14
19
  spec_path = pack.relative_path.join(default_path)
15
20
  spec_path.to_s if spec_path.exist?
@@ -26,10 +31,10 @@ module Stimpack
26
31
  # If it doesn't match a pack path, we leave it alone.
27
32
 
28
33
  to_run.map! do |path|
29
- if pack = Packs.all_by_path[path]
34
+ if pack = Packs.find(path)
30
35
  [
31
36
  pack,
32
- *Packs.all(pack)
37
+ *nested_packs_for(pack)
33
38
  ].map do |pack|
34
39
  spec_path = pack.relative_path.join(default_path)
35
40
  spec_path.to_s if spec_path.exist?
@@ -42,6 +47,13 @@ module Stimpack
42
47
 
43
48
  ::RSpec.configuration.files_or_directories_to_run = to_run.flatten.compact.uniq
44
49
  end
50
+
51
+ sig { params(parent_pack: Packs::Pack).returns(T::Array[Packs::Pack]) }
52
+ def nested_packs_for(parent_pack)
53
+ Packs.all.select do |pack|
54
+ pack.name != parent_pack.name && pack.name.include?(parent_pack.name)
55
+ end
56
+ end
45
57
  end
46
58
  end
47
59
  end
data/lib/stimpack/stim.rb CHANGED
@@ -1,5 +1,10 @@
1
+ # typed: true
2
+
1
3
  module Stimpack
2
4
  class Stim < Module
5
+ extend T::Sig
6
+
7
+ sig { params(pack: Packs::Pack, namespace: Module).void }
3
8
  def initialize(pack, namespace)
4
9
  @pack = pack
5
10
  @namespace = namespace
@@ -7,7 +12,7 @@ module Stimpack
7
12
  end
8
13
 
9
14
  def included(engine)
10
- engine.called_from = @pack.path
15
+ engine.called_from = @pack.relative_path
11
16
  engine.extend(ClassMethods)
12
17
  engine.isolate_namespace(@namespace)
13
18
 
@@ -28,7 +33,7 @@ module Stimpack
28
33
 
29
34
  module ClassMethods
30
35
  def find_root(_from)
31
- called_from
36
+ T.unsafe(self).called_from
32
37
  end
33
38
  end
34
39
  end
@@ -1,3 +1,3 @@
1
1
  module Stimpack
2
- VERSION = "0.7.1".freeze
2
+ VERSION = "0.8.1".freeze
3
3
  end
data/lib/stimpack.rb CHANGED
@@ -1,12 +1,12 @@
1
+ require 'packs'
1
2
  require "active_support"
2
3
  require "rails/application"
4
+ require 'sorbet-runtime'
3
5
 
4
6
  module Stimpack
5
7
  extend ActiveSupport::Autoload
6
8
 
7
9
  autoload :Integrations
8
- autoload :Pack
9
- autoload :Packs
10
10
  autoload :Railtie
11
11
  autoload :Stim
12
12
 
@@ -21,7 +21,8 @@ module Stimpack
21
21
  end
22
22
 
23
23
  @config = ActiveSupport::OrderedOptions.new
24
- @config.root = "packs".freeze
24
+ # Should this allow a plural version to be set? What are semantics of that?
25
+ @config.root = Array("packs".freeze)
25
26
  @config.paths = %w(
26
27
  app
27
28
  app/controllers
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stimpack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ngan Pham
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-09-08 00:00:00.000000000 Z
11
+ date: 2022-12-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: packs
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -139,9 +153,6 @@ files:
139
153
  - lib/stimpack/integrations/factory_bot.rb
140
154
  - lib/stimpack/integrations/rails.rb
141
155
  - lib/stimpack/integrations/rspec.rb
142
- - lib/stimpack/pack.rb
143
- - lib/stimpack/pack/configuration.rb
144
- - lib/stimpack/packs.rb
145
156
  - lib/stimpack/railtie.rb
146
157
  - lib/stimpack/rspec.rb
147
158
  - lib/stimpack/stim.rb
@@ -167,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
178
  - !ruby/object:Gem::Version
168
179
  version: '0'
169
180
  requirements: []
170
- rubygems_version: 3.3.7
181
+ rubygems_version: 3.1.6
171
182
  signing_key:
172
183
  specification_version: 4
173
184
  summary: A Rails helper to package your code.
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "yaml"
4
-
5
- module Stimpack
6
- class Pack
7
- class Configuration
8
- KEY = "metadata"
9
-
10
- def initialize(path)
11
- @path = path
12
- end
13
-
14
- def engine
15
- data.fetch("engine", false)
16
- end
17
- alias_method :engine?, :engine
18
-
19
- private
20
-
21
- def data
22
- @data ||= begin
23
- contents = YAML.respond_to?(:safe_load_file) ? YAML.safe_load_file(@path) : YAML.load_file(@path)
24
- contents ||= {}
25
- contents.fetch(KEY, {}).freeze
26
- end
27
- end
28
- end
29
- end
30
- end
data/lib/stimpack/pack.rb DELETED
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "pathname"
4
-
5
- module Stimpack
6
- class Pack
7
- PACKAGE_FILE = "package.yml"
8
-
9
- autoload :Configuration, "stimpack/pack/configuration"
10
-
11
- attr_reader :path
12
- attr_reader :name
13
- attr_accessor :engine
14
-
15
- def initialize(path)
16
- @path = path
17
- @name = path.basename.to_s
18
- end
19
-
20
- def relative_path
21
- @relative_path ||= path.relative_path_from(Stimpack.root)
22
- end
23
-
24
- def config
25
- @config ||= Configuration.new(path.join(PACKAGE_FILE))
26
- end
27
- end
28
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_support"
4
-
5
- module Stimpack
6
- module Packs
7
- PACKAGE_GLOB_PATTERN = "*/#{Pack::PACKAGE_FILE}"
8
-
9
- class << self
10
- def root
11
- @root ||= Stimpack.root.join(Stimpack.config.root)
12
- end
13
-
14
- def find(path)
15
- @find_pack_paths ||= all_by_path.keys.sort_by(&:length).reverse!.map { |path| "#{path}/" }
16
- path = "#{path}/"
17
- @find_pack_paths.find do |pack_path|
18
- path.start_with?(pack_path)
19
- end
20
- end
21
-
22
- def all(parent = nil)
23
- @all ||= resolve(root).each_with_object({}) do |pack, map|
24
- map[pack] = resolve(pack.path).freeze
25
- end.freeze
26
-
27
- if parent
28
- @all[parent]
29
- else
30
- @all.keys + @all.values.flatten
31
- end
32
- end
33
-
34
- def all_by_path
35
- @all_by_path ||= all.each_with_object({}) do |pack, map|
36
- map[pack.relative_path.to_s] = pack
37
- end
38
- end
39
-
40
- private
41
-
42
- def resolve(directory)
43
- directory.glob(PACKAGE_GLOB_PATTERN).map { |path| Pack.new(path.dirname) }
44
- end
45
- end
46
- end
47
- end