stimpack 0.7.1 → 1.0.0.alpha1
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 +4 -4
- data/README.md +15 -106
- data/lib/stimpack/autoloaders.rb +11 -0
- data/lib/stimpack/instance.rb +14 -0
- data/lib/stimpack/integrations/factory_bot.rb +4 -4
- data/lib/stimpack/integrations/rspec.rb +4 -38
- data/lib/stimpack/integrations.rb +3 -2
- data/lib/stimpack/kernel.rb +11 -0
- data/lib/stimpack/package.rb +14 -0
- data/lib/stimpack/packages.rb +35 -0
- data/lib/stimpack/packs.rb +33 -24
- data/lib/stimpack/railtie.rb +6 -7
- data/lib/stimpack/require.rb +47 -0
- data/lib/stimpack/settings.rb +40 -0
- data/lib/stimpack/stim.rb +14 -17
- data/lib/stimpack/version.rb +1 -1
- data/lib/stimpack/zeitwerk_proxy.rb +24 -0
- data/lib/stimpack.rb +40 -24
- metadata +15 -83
- data/bin/tapioca +0 -29
- data/lib/stimpack/integrations/rails.rb +0 -53
- data/lib/stimpack/pack/configuration.rb +0 -30
- data/lib/stimpack/pack.rb +0 -28
- data/lib/stimpack/rspec.rb +0 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: aedf6786a9c8dce60f5d90bf3f9b97bea858d3faeac218c2991a5ed5dd61503e
|
|
4
|
+
data.tar.gz: 1b7c218dc706f75f77d4d1e6e099f174520c26ebbf573f985f05e6e28a343af8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: be4a82f48f0c966edfc9c86c096d4e8cbfe7f23177007ddd91bffe769ac7fab05921f6b7c2855b8fbadc49c54aede9024b1820f76ecbe988b492507adc3fc212
|
|
7
|
+
data.tar.gz: 889c48f4b28b1260e6387ba6205f5b586846630c33182f680bbbaf8bfe0a18f89529b16ef87c562991452da74bbd2191168189d1b7f4380e56448eabe586fae1
|
data/README.md
CHANGED
|
@@ -1,126 +1,35 @@
|
|
|
1
1
|
# Stimpack
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/stimpack`. To experiment with that code, run `bin/console` for an interactive prompt.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
```
|
|
7
|
-
package.yml # root level pack
|
|
8
|
-
app/ # Unpackaged code
|
|
9
|
-
models/
|
|
10
|
-
...
|
|
11
|
-
packs/
|
|
12
|
-
my_domain/
|
|
13
|
-
package.yml # See the packwerk docs for more info
|
|
14
|
-
deprecated_references.yml # See the packwerk docs for more info
|
|
15
|
-
app/
|
|
16
|
-
public/ # Recommended location for public API
|
|
17
|
-
my_domain.rb # creates the primary namespaces
|
|
18
|
-
my_domain/
|
|
19
|
-
my_subdomain.rb
|
|
20
|
-
services/ # Private services
|
|
21
|
-
my_domain/
|
|
22
|
-
some_private_class.rb
|
|
23
|
-
models/ # Private models
|
|
24
|
-
some_other_non_namespaced_private_model.rb # this works too
|
|
25
|
-
my_domain/
|
|
26
|
-
my_private_namespacd_model.rb
|
|
27
|
-
controllers/
|
|
28
|
-
views/
|
|
29
|
-
config/
|
|
30
|
-
initializers/ # Initializers can live in packs and load as expected
|
|
31
|
-
lib/
|
|
32
|
-
tasks/
|
|
33
|
-
spec/ # With stimpack, specs for a pack live next to the pack
|
|
34
|
-
public/
|
|
35
|
-
my_domain_spec.rb
|
|
36
|
-
my_domain/
|
|
37
|
-
my_subdomain_spec.rb
|
|
38
|
-
services/
|
|
39
|
-
my_domain/
|
|
40
|
-
some_private_class_spec.rb
|
|
41
|
-
models/
|
|
42
|
-
some_other_non_namespaced_private_model_spec.rb
|
|
43
|
-
my_domain/
|
|
44
|
-
my_private_namespaced_model_spec.rb
|
|
45
|
-
factories/ # Stimpack will automatically load pack factories into FactoryBot
|
|
46
|
-
my_domain/
|
|
47
|
-
my_private_namespaced_model_factory.rb
|
|
48
|
-
my_other_domain/
|
|
49
|
-
... # other pack's have a similar structure
|
|
50
|
-
my_other_other_domain/
|
|
51
|
-
...
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Usage
|
|
5
|
+
TODO: Delete this and the text above, and describe your gem
|
|
55
6
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
From there, you can create a `./packs` folder and structure it using the conventions listed above.
|
|
59
|
-
|
|
60
|
-
If you wish to use a different directory name, eg `components` instead of `packs`, you can customize this in your `config/application.rb` file:
|
|
61
|
-
|
|
62
|
-
```ruby
|
|
63
|
-
# Customize Stimpack's root directory. Note that this has to be done _before_ the Application
|
|
64
|
-
# class is declared.
|
|
65
|
-
Stimpack.config.root = "components"
|
|
66
|
-
|
|
67
|
-
module MyCoolApp
|
|
68
|
-
class Application < Rails::Application
|
|
69
|
-
# ...
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
```
|
|
7
|
+
## Installation
|
|
73
8
|
|
|
74
|
-
|
|
75
|
-
`stimpack` allows you to split your application routes for every pack. You just have to create a file describing your routes and then `draw` them in your root `config/routes.rb` file.
|
|
9
|
+
Add this line to your application's Gemfile:
|
|
76
10
|
|
|
77
11
|
```ruby
|
|
78
|
-
|
|
79
|
-
resources :my_resource
|
|
80
|
-
|
|
81
|
-
# config/routes.rb
|
|
82
|
-
draw(:my_domain)
|
|
12
|
+
gem "stimpack"
|
|
83
13
|
```
|
|
84
14
|
|
|
85
|
-
|
|
86
|
-
Add `engine: true` to your `package.yml` to make it an actual Rails engine:
|
|
87
|
-
```yml
|
|
88
|
-
# packs/my_pack/package.yml
|
|
89
|
-
enforce_dependencies: true
|
|
90
|
-
enforce_privacy: true
|
|
91
|
-
metadata:
|
|
92
|
-
engine: true
|
|
93
|
-
```
|
|
15
|
+
And then execute:
|
|
94
16
|
|
|
95
|
-
|
|
96
|
-
Simply add `--require stimpack/rspec` to your `.rspec`.
|
|
97
|
-
Or, if you'd like, pass it as an argument to `rspec`:
|
|
17
|
+
$ bundle install
|
|
98
18
|
|
|
99
|
-
|
|
100
|
-
$ rspec --require stimpack/rspec ...
|
|
101
|
-
```
|
|
19
|
+
Or install it yourself as:
|
|
102
20
|
|
|
103
|
-
|
|
104
|
-
```
|
|
105
|
-
# Run all specs in your entire application (packs and all):
|
|
106
|
-
rspec
|
|
21
|
+
$ gem install stimpack
|
|
107
22
|
|
|
108
|
-
|
|
109
|
-
rspec spec/some/specific_spec.rb
|
|
23
|
+
## Usage
|
|
110
24
|
|
|
111
|
-
|
|
112
|
-
rspec packs/foobar
|
|
25
|
+
TODO: Write usage instructions here
|
|
113
26
|
|
|
114
|
-
|
|
115
|
-
rspec packs/foobar pack/binbaz
|
|
27
|
+
## Development
|
|
116
28
|
|
|
117
|
-
|
|
118
|
-
rspec packs/foobar/spec
|
|
29
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
|
119
30
|
|
|
120
|
-
|
|
121
|
-
rspec packs/foobar/nested_pack
|
|
122
|
-
```
|
|
31
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
|
123
32
|
|
|
124
33
|
## Contributing
|
|
125
34
|
|
|
126
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
|
35
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/ngan/stimpack.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require "pathname"
|
|
2
|
+
require "active_support/inflector"
|
|
3
|
+
|
|
4
|
+
module Stimpack
|
|
5
|
+
class Instance
|
|
6
|
+
def initialize
|
|
7
|
+
Pathname.new("packages").glob("*/package.yml").each do |path|
|
|
8
|
+
path = path.realpath.dirname
|
|
9
|
+
name = ActiveSupport::Inflector.classify(path.basename)
|
|
10
|
+
Stimpack::Packages.create(name, path)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
module Stimpack
|
|
2
2
|
module Integrations
|
|
3
3
|
class FactoryBot
|
|
4
|
-
def
|
|
5
|
-
return unless
|
|
4
|
+
def self.install
|
|
5
|
+
return unless Rails.configuration.respond_to?(:factory_bot)
|
|
6
6
|
|
|
7
|
-
Packs.
|
|
8
|
-
|
|
7
|
+
Packs.each do |pack|
|
|
8
|
+
Rails.configuration.factory_bot.definition_file_paths << pack.settings.relative_path.join("spec/factories").to_s
|
|
9
9
|
end
|
|
10
10
|
end
|
|
11
11
|
end
|
|
@@ -1,46 +1,12 @@
|
|
|
1
1
|
module Stimpack
|
|
2
2
|
module Integrations
|
|
3
3
|
class RSpec
|
|
4
|
-
def
|
|
5
|
-
|
|
6
|
-
to_run = ::RSpec.configuration.instance_variable_get(:@files_or_directories_to_run)
|
|
7
|
-
default_path = ::RSpec.configuration.default_path
|
|
4
|
+
def self.install
|
|
5
|
+
return unless defined?(::RSpec)
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
# to the collection of directories to run.
|
|
12
|
-
|
|
13
|
-
pack_paths = Packs.all.map do |pack|
|
|
14
|
-
spec_path = pack.relative_path.join(default_path)
|
|
15
|
-
spec_path.to_s if spec_path.exist?
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
to_run.concat(pack_paths)
|
|
19
|
-
else
|
|
20
|
-
# This is when `rspec` is run with a list of directories or files. We scan this list to see
|
|
21
|
-
# if any of them matches a pack's directory. If it does, we concat the `default_path` to the
|
|
22
|
-
# end of it.
|
|
23
|
-
#
|
|
24
|
-
# packs/my_pack => packs/my_pack/spec
|
|
25
|
-
#
|
|
26
|
-
# If it doesn't match a pack path, we leave it alone.
|
|
27
|
-
|
|
28
|
-
to_run.map! do |path|
|
|
29
|
-
if pack = Packs.all_by_path[path]
|
|
30
|
-
[
|
|
31
|
-
pack,
|
|
32
|
-
*Packs.all(pack)
|
|
33
|
-
].map do |pack|
|
|
34
|
-
spec_path = pack.relative_path.join(default_path)
|
|
35
|
-
spec_path.to_s if spec_path.exist?
|
|
36
|
-
end
|
|
37
|
-
else
|
|
38
|
-
path
|
|
39
|
-
end
|
|
40
|
-
end
|
|
7
|
+
Packs.each do |pack|
|
|
8
|
+
::RSpec.configuration.pattern.concat(",#{pack.settings.relative_path.join("spec/**/*_spec.rb")}")
|
|
41
9
|
end
|
|
42
|
-
|
|
43
|
-
::RSpec.configuration.files_or_directories_to_run = to_run.flatten.compact.uniq
|
|
44
10
|
end
|
|
45
11
|
end
|
|
46
12
|
end
|
|
@@ -2,8 +2,9 @@ require "active_support"
|
|
|
2
2
|
|
|
3
3
|
module Stimpack
|
|
4
4
|
module Integrations
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
extend ActiveSupport::Autoload
|
|
6
|
+
|
|
7
7
|
autoload :RSpec, "stimpack/integrations/rspec"
|
|
8
|
+
autoload :FactoryBot, "stimpack/integrations/factory_bot"
|
|
8
9
|
end
|
|
9
10
|
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require "rails"
|
|
2
|
+
require "active_support/core_ext/module/delegation"
|
|
3
|
+
|
|
4
|
+
module Stimpack
|
|
5
|
+
class Package < ::Rails::Engine
|
|
6
|
+
class << self
|
|
7
|
+
delegate :subclasses, to: :superclass
|
|
8
|
+
|
|
9
|
+
def find_root(from)
|
|
10
|
+
Packages.paths[module_parent.name]
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require "rails"
|
|
2
|
+
|
|
3
|
+
module Stimpack
|
|
4
|
+
module Packages
|
|
5
|
+
def self.paths
|
|
6
|
+
@paths ||= {}
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.create(name, path)
|
|
10
|
+
paths[name] = path
|
|
11
|
+
|
|
12
|
+
class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
|
13
|
+
module ::#{name}
|
|
14
|
+
class Engine < ::Stimpack::Package
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
RUBY
|
|
18
|
+
|
|
19
|
+
engine = const_get("::#{name}::Engine")
|
|
20
|
+
# Isolate the package namespace.
|
|
21
|
+
engine.isolate_namespace(engine.module_parent)
|
|
22
|
+
|
|
23
|
+
# Disable Railtie initializers for Packages.
|
|
24
|
+
engine.paths["config/initializers"] = nil
|
|
25
|
+
|
|
26
|
+
engine.paths["lib/tasks"] = "tasks"
|
|
27
|
+
engine.paths["db/migrate"] = "migrations"
|
|
28
|
+
engine.paths["config/routes.rb"] = "routes.rb"
|
|
29
|
+
|
|
30
|
+
if engine.paths["db/migrate"].existent.any?
|
|
31
|
+
ActiveRecord::Migrator.migrations_paths << engine.paths["db/migrate"].first
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
data/lib/stimpack/packs.rb
CHANGED
|
@@ -1,47 +1,56 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
1
|
require "active_support"
|
|
2
|
+
require "pathname"
|
|
3
|
+
require "rails"
|
|
4
4
|
|
|
5
5
|
module Stimpack
|
|
6
6
|
module Packs
|
|
7
|
-
|
|
7
|
+
PATH = Pathname.new("packs").freeze
|
|
8
|
+
PACK_CLASS = "Pack".freeze
|
|
8
9
|
|
|
9
10
|
class << self
|
|
10
|
-
def
|
|
11
|
-
|
|
11
|
+
def resolve
|
|
12
|
+
PATH.glob("**/#{Settings::PACKWERK_PACKAGE_CONFIG}").each do |path|
|
|
13
|
+
path = path.dirname
|
|
14
|
+
create(path.relative_path_from(PATH).to_s, path.expand_path)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def create(name, path)
|
|
19
|
+
namespace = create_namespace(name)
|
|
20
|
+
stim = Stim.new(path)
|
|
21
|
+
@packs[name] = namespace.const_set(PACK_CLASS, Class.new(Rails::Engine)).include(stim)
|
|
12
22
|
end
|
|
13
23
|
|
|
14
24
|
def find(path)
|
|
15
|
-
@find_pack_paths ||= all_by_path.keys.sort_by(&:length).reverse!.map { |path| "#{path}/" }
|
|
16
25
|
path = "#{path}/"
|
|
17
|
-
|
|
18
|
-
|
|
26
|
+
|
|
27
|
+
@packs.values.find do |pack|
|
|
28
|
+
path.start_with?("#{pack.root}/")
|
|
19
29
|
end
|
|
20
30
|
end
|
|
21
31
|
|
|
22
|
-
def
|
|
23
|
-
@
|
|
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
|
+
def [](name)
|
|
33
|
+
@packs[name]
|
|
32
34
|
end
|
|
33
35
|
|
|
34
|
-
def
|
|
35
|
-
@
|
|
36
|
-
map[pack.relative_path.to_s] = pack
|
|
37
|
-
end
|
|
36
|
+
def each(*args, &block)
|
|
37
|
+
@packs.each_value(*args, &block)
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
private
|
|
41
41
|
|
|
42
|
-
def
|
|
43
|
-
|
|
42
|
+
def create_namespace(name)
|
|
43
|
+
namespace = ActiveSupport::Inflector.camelize(name)
|
|
44
|
+
namespace.split("::").reduce(Object) do |base, mod|
|
|
45
|
+
if base.const_defined?(mod)
|
|
46
|
+
base.const_get(mod)
|
|
47
|
+
else
|
|
48
|
+
base.const_set(mod, Module.new)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
44
51
|
end
|
|
45
52
|
end
|
|
53
|
+
|
|
54
|
+
@packs = {}
|
|
46
55
|
end
|
|
47
56
|
end
|
data/lib/stimpack/railtie.rb
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
require "rails
|
|
1
|
+
require "rails"
|
|
2
2
|
|
|
3
3
|
module Stimpack
|
|
4
4
|
class Railtie < Rails::Railtie
|
|
5
|
-
config.before_configuration do
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
config.before_configuration do
|
|
6
|
+
Stimpack.start!
|
|
7
|
+
end
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
ActiveSupport.run_load_hooks(:stimpack, Packs)
|
|
9
|
+
config.after_initialize do
|
|
10
|
+
Stimpack.finalize!
|
|
12
11
|
end
|
|
13
12
|
end
|
|
14
13
|
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Stimpack
|
|
4
|
+
class Require
|
|
5
|
+
IGNORED_PATH_PREFIXES = ["/", "./"].freeze
|
|
6
|
+
RUBY_EXTENSION = ".rb"
|
|
7
|
+
|
|
8
|
+
include Singleton
|
|
9
|
+
|
|
10
|
+
attr_accessor :enabled
|
|
11
|
+
|
|
12
|
+
def self.resolve(path)
|
|
13
|
+
instance.resolve(path)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.setup
|
|
17
|
+
instance.setup
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def initialize
|
|
21
|
+
@packs = {}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def setup
|
|
25
|
+
@setup = @setup ? return : true
|
|
26
|
+
|
|
27
|
+
Packs.each do |pack|
|
|
28
|
+
if pack.settings.implicit_namespace?
|
|
29
|
+
@packs["#{pack.settings.name}/"] = "#{pack.paths["lib"].first}/"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def resolve(path)
|
|
35
|
+
path = path.to_s
|
|
36
|
+
return if path.start_with?(*IGNORED_PATH_PREFIXES)
|
|
37
|
+
|
|
38
|
+
@packs.find do |pack_path, full_path|
|
|
39
|
+
if path.start_with?(pack_path)
|
|
40
|
+
full_pack_path = path.sub(pack_path, full_path)
|
|
41
|
+
full_pack_path.concat(RUBY_EXTENSION) unless full_pack_path.end_with?(RUBY_EXTENSION)
|
|
42
|
+
return File.exist?(full_pack_path) && full_pack_path
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Stimpack
|
|
4
|
+
class Settings
|
|
5
|
+
PACKWERK_PACKAGE_CONFIG = "package.yml"
|
|
6
|
+
|
|
7
|
+
def initialize(pack)
|
|
8
|
+
@pack = pack
|
|
9
|
+
|
|
10
|
+
package_config = YAML.load_file(pack.root.join(PACKWERK_PACKAGE_CONFIG)) || {}
|
|
11
|
+
@config = package_config.fetch("metadata", {}).freeze
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def path
|
|
15
|
+
@pack.called_from
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def relative_path
|
|
19
|
+
@relative_path ||= path.relative_path_from(Rails.root)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def name
|
|
23
|
+
@name ||= ActiveSupport::Inflector.underscore(namespace.name)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def namespace
|
|
27
|
+
@pack.module_parent
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# def implicit_namespace
|
|
31
|
+
# @config.fetch("implicit_namespace", true)
|
|
32
|
+
# end
|
|
33
|
+
# alias_method :implicit_namespace?, :implicit_namespace
|
|
34
|
+
|
|
35
|
+
def isolate_namespace
|
|
36
|
+
@config.fetch("isolate_namespace", true)
|
|
37
|
+
end
|
|
38
|
+
alias_method :isolate_namespace?, :isolate_namespace
|
|
39
|
+
end
|
|
40
|
+
end
|
data/lib/stimpack/stim.rb
CHANGED
|
@@ -1,35 +1,32 @@
|
|
|
1
1
|
module Stimpack
|
|
2
2
|
class Stim < Module
|
|
3
|
-
def initialize(
|
|
4
|
-
@
|
|
5
|
-
@namespace = namespace
|
|
3
|
+
def initialize(path)
|
|
4
|
+
@path = path
|
|
6
5
|
super()
|
|
7
6
|
end
|
|
8
7
|
|
|
9
8
|
def included(engine)
|
|
10
|
-
engine.called_from = @
|
|
9
|
+
engine.called_from = @path
|
|
11
10
|
engine.extend(ClassMethods)
|
|
12
|
-
engine.
|
|
11
|
+
settings = engine.settings
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
# isolation.
|
|
17
|
-
(Stimpack.config.paths +
|
|
18
|
-
# In addition to the paths we've delegated to the main app, we don't allow
|
|
19
|
-
# Engine Packs to have various capabilities.
|
|
20
|
-
%w(
|
|
21
|
-
config/environments
|
|
22
|
-
db/migrate
|
|
23
|
-
)
|
|
24
|
-
).uniq.each do |path|
|
|
25
|
-
engine.paths[path] = nil
|
|
13
|
+
if settings.isolate_namespace?
|
|
14
|
+
engine.isolate_namespace(settings.namespace)
|
|
26
15
|
end
|
|
16
|
+
|
|
17
|
+
# if settings.implicit_namespace?
|
|
18
|
+
# engine.paths["lib"].skip_load_path!
|
|
19
|
+
# end
|
|
27
20
|
end
|
|
28
21
|
|
|
29
22
|
module ClassMethods
|
|
30
23
|
def find_root(_from)
|
|
31
24
|
called_from
|
|
32
25
|
end
|
|
26
|
+
|
|
27
|
+
def settings
|
|
28
|
+
@settings ||= Stimpack::Settings.new(self)
|
|
29
|
+
end
|
|
33
30
|
end
|
|
34
31
|
end
|
|
35
32
|
end
|
data/lib/stimpack/version.rb
CHANGED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require "active_support"
|
|
2
|
+
|
|
3
|
+
module Stimpack
|
|
4
|
+
class ZeitwerkProxy
|
|
5
|
+
delegate_missing_to :@loader
|
|
6
|
+
|
|
7
|
+
def initialize(loader)
|
|
8
|
+
@loader = loader
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def push_dir(path, namespace: Object)
|
|
12
|
+
@loader.push_dir(path, namespace: _resolve_namespace(path) || namespace)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def _resolve_namespace(path)
|
|
18
|
+
pack = Packs.find(path)
|
|
19
|
+
return unless pack
|
|
20
|
+
|
|
21
|
+
pack.settings.namespace if pack.settings.implicit_namespace?
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
data/lib/stimpack.rb
CHANGED
|
@@ -1,42 +1,58 @@
|
|
|
1
1
|
require "active_support"
|
|
2
|
-
require "rails
|
|
2
|
+
require "rails"
|
|
3
3
|
|
|
4
4
|
module Stimpack
|
|
5
5
|
extend ActiveSupport::Autoload
|
|
6
6
|
|
|
7
7
|
autoload :Integrations
|
|
8
|
-
autoload :
|
|
8
|
+
autoload :Autoloaders
|
|
9
9
|
autoload :Packs
|
|
10
|
-
autoload :
|
|
10
|
+
autoload :Settings
|
|
11
11
|
autoload :Stim
|
|
12
|
+
autoload :Railtie
|
|
13
|
+
autoload :Require
|
|
14
|
+
autoload :ZeitwerkProxy
|
|
12
15
|
|
|
13
16
|
class Error < StandardError; end
|
|
14
17
|
|
|
15
18
|
class << self
|
|
16
|
-
|
|
19
|
+
def start!
|
|
20
|
+
@started = @started ? return : true
|
|
21
|
+
|
|
22
|
+
# Override Rails' autoloader accessors.
|
|
23
|
+
# Rails::Autoloaders.singleton_class.prepend(Autoloaders)
|
|
24
|
+
|
|
25
|
+
Packs.resolve
|
|
17
26
|
|
|
18
|
-
|
|
19
|
-
|
|
27
|
+
install_integrations
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def finalize!
|
|
31
|
+
@finalized = @finalized ? return : true
|
|
32
|
+
|
|
33
|
+
Require.setup
|
|
20
34
|
end
|
|
21
|
-
end
|
|
22
35
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
def autoloader(original)
|
|
37
|
+
return original if @finalized
|
|
38
|
+
|
|
39
|
+
@autoloader_proxies ||= {}
|
|
40
|
+
@autoloader_proxies[original] ||= ZeitwerkProxy.new(original)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def [](name)
|
|
44
|
+
Packs[name.to_s]
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
def install_integrations
|
|
50
|
+
Integrations::FactoryBot.install
|
|
51
|
+
Integrations::RSpec.install
|
|
52
|
+
end
|
|
53
|
+
end
|
|
40
54
|
end
|
|
41
55
|
|
|
42
56
|
require "stimpack/railtie"
|
|
57
|
+
# require "stimpack/require"
|
|
58
|
+
# require "stimpack/kernel"
|
metadata
CHANGED
|
@@ -1,31 +1,17 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: stimpack
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 1.0.0.alpha1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ngan Pham
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2021-02-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
|
-
name:
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - ">="
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: '0'
|
|
20
|
-
type: :runtime
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - ">="
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: '0'
|
|
27
|
-
- !ruby/object:Gem::Dependency
|
|
28
|
-
name: activesupport
|
|
14
|
+
name: rails
|
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
|
30
16
|
requirements:
|
|
31
17
|
- - ">="
|
|
@@ -66,64 +52,7 @@ dependencies:
|
|
|
66
52
|
- - ">="
|
|
67
53
|
- !ruby/object:Gem::Version
|
|
68
54
|
version: '0'
|
|
69
|
-
|
|
70
|
-
name: debug
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - ">="
|
|
74
|
-
- !ruby/object:Gem::Version
|
|
75
|
-
version: '0'
|
|
76
|
-
type: :development
|
|
77
|
-
prerelease: false
|
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
-
requirements:
|
|
80
|
-
- - ">="
|
|
81
|
-
- !ruby/object:Gem::Version
|
|
82
|
-
version: '0'
|
|
83
|
-
- !ruby/object:Gem::Dependency
|
|
84
|
-
name: sorbet
|
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
|
86
|
-
requirements:
|
|
87
|
-
- - ">="
|
|
88
|
-
- !ruby/object:Gem::Version
|
|
89
|
-
version: '0'
|
|
90
|
-
type: :development
|
|
91
|
-
prerelease: false
|
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
-
requirements:
|
|
94
|
-
- - ">="
|
|
95
|
-
- !ruby/object:Gem::Version
|
|
96
|
-
version: '0'
|
|
97
|
-
- !ruby/object:Gem::Dependency
|
|
98
|
-
name: tapioca
|
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
|
100
|
-
requirements:
|
|
101
|
-
- - ">="
|
|
102
|
-
- !ruby/object:Gem::Version
|
|
103
|
-
version: '0'
|
|
104
|
-
type: :development
|
|
105
|
-
prerelease: false
|
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
-
requirements:
|
|
108
|
-
- - ">="
|
|
109
|
-
- !ruby/object:Gem::Version
|
|
110
|
-
version: '0'
|
|
111
|
-
- !ruby/object:Gem::Dependency
|
|
112
|
-
name: rails
|
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
|
114
|
-
requirements:
|
|
115
|
-
- - ">="
|
|
116
|
-
- !ruby/object:Gem::Version
|
|
117
|
-
version: '0'
|
|
118
|
-
type: :development
|
|
119
|
-
prerelease: false
|
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
-
requirements:
|
|
122
|
-
- - ">="
|
|
123
|
-
- !ruby/object:Gem::Version
|
|
124
|
-
version: '0'
|
|
125
|
-
description: stimpack establishes and implements a set of conventions for splitting
|
|
126
|
-
up large monoliths.
|
|
55
|
+
description: Package your code.
|
|
127
56
|
email:
|
|
128
57
|
- gusto-opensource-buildkite@gusto.com
|
|
129
58
|
executables: []
|
|
@@ -133,19 +62,22 @@ files:
|
|
|
133
62
|
- README.md
|
|
134
63
|
- bin/console
|
|
135
64
|
- bin/setup
|
|
136
|
-
- bin/tapioca
|
|
137
65
|
- lib/stimpack.rb
|
|
66
|
+
- lib/stimpack/autoloaders.rb
|
|
67
|
+
- lib/stimpack/instance.rb
|
|
138
68
|
- lib/stimpack/integrations.rb
|
|
139
69
|
- lib/stimpack/integrations/factory_bot.rb
|
|
140
|
-
- lib/stimpack/integrations/rails.rb
|
|
141
70
|
- lib/stimpack/integrations/rspec.rb
|
|
142
|
-
- lib/stimpack/
|
|
143
|
-
- lib/stimpack/
|
|
71
|
+
- lib/stimpack/kernel.rb
|
|
72
|
+
- lib/stimpack/package.rb
|
|
73
|
+
- lib/stimpack/packages.rb
|
|
144
74
|
- lib/stimpack/packs.rb
|
|
145
75
|
- lib/stimpack/railtie.rb
|
|
146
|
-
- lib/stimpack/
|
|
76
|
+
- lib/stimpack/require.rb
|
|
77
|
+
- lib/stimpack/settings.rb
|
|
147
78
|
- lib/stimpack/stim.rb
|
|
148
79
|
- lib/stimpack/version.rb
|
|
80
|
+
- lib/stimpack/zeitwerk_proxy.rb
|
|
149
81
|
homepage: https://github.com/Gusto/stimpack
|
|
150
82
|
licenses: []
|
|
151
83
|
metadata:
|
|
@@ -163,11 +95,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
163
95
|
version: '2.7'
|
|
164
96
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
165
97
|
requirements:
|
|
166
|
-
- - "
|
|
98
|
+
- - ">"
|
|
167
99
|
- !ruby/object:Gem::Version
|
|
168
|
-
version:
|
|
100
|
+
version: 1.3.1
|
|
169
101
|
requirements: []
|
|
170
|
-
rubygems_version: 3.
|
|
102
|
+
rubygems_version: 3.1.2
|
|
171
103
|
signing_key:
|
|
172
104
|
specification_version: 4
|
|
173
105
|
summary: A Rails helper to package your code.
|
data/bin/tapioca
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
# frozen_string_literal: true
|
|
3
|
-
|
|
4
|
-
#
|
|
5
|
-
# This file was generated by Bundler.
|
|
6
|
-
#
|
|
7
|
-
# The application 'tapioca' is installed as part of a gem, and
|
|
8
|
-
# this file is here to facilitate running it.
|
|
9
|
-
#
|
|
10
|
-
|
|
11
|
-
require "pathname"
|
|
12
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
|
13
|
-
Pathname.new(__FILE__).realpath)
|
|
14
|
-
|
|
15
|
-
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
|
16
|
-
|
|
17
|
-
if File.file?(bundle_binstub)
|
|
18
|
-
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
|
19
|
-
load(bundle_binstub)
|
|
20
|
-
else
|
|
21
|
-
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
|
22
|
-
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
require "rubygems"
|
|
27
|
-
require "bundler/setup"
|
|
28
|
-
|
|
29
|
-
load Gem.bin_path("tapioca", "tapioca")
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require "active_support/inflections"
|
|
4
|
-
|
|
5
|
-
module Stimpack
|
|
6
|
-
module Integrations
|
|
7
|
-
class Rails
|
|
8
|
-
def initialize(app)
|
|
9
|
-
@app = app
|
|
10
|
-
|
|
11
|
-
Stimpack.config.paths.freeze
|
|
12
|
-
create_engines
|
|
13
|
-
inject_paths
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def create_engines
|
|
17
|
-
Packs.all.each do |pack|
|
|
18
|
-
next unless pack.config.engine?
|
|
19
|
-
|
|
20
|
-
pack.engine = create_engine(pack)
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def inject_paths
|
|
25
|
-
Packs.all.each do |pack|
|
|
26
|
-
Stimpack.config.paths.each do |path|
|
|
27
|
-
@app.paths[path] << pack.path.join(path)
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
private
|
|
33
|
-
|
|
34
|
-
def create_namespace(name)
|
|
35
|
-
namespace = ActiveSupport::Inflector.camelize(name)
|
|
36
|
-
namespace.split("::").reduce(Object) do |base, mod|
|
|
37
|
-
if base.const_defined?(mod, false)
|
|
38
|
-
base.const_get(mod, false)
|
|
39
|
-
else
|
|
40
|
-
base.const_set(mod, Module.new)
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def create_engine(pack)
|
|
46
|
-
name = pack.path.relative_path_from(Stimpack::Packs.root)
|
|
47
|
-
namespace = create_namespace(pack.name)
|
|
48
|
-
stim = Stim.new(pack, namespace)
|
|
49
|
-
namespace.const_set("Engine", Class.new(::Rails::Engine)).include(stim)
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
@@ -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
|
data/lib/stimpack/rspec.rb
DELETED