rage_arch 0.1.0

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.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +190 -0
  4. data/lib/generators/rage_arch/ar_dep_generator.rb +74 -0
  5. data/lib/generators/rage_arch/dep_generator.rb +120 -0
  6. data/lib/generators/rage_arch/dep_switch_generator.rb +224 -0
  7. data/lib/generators/rage_arch/install_generator.rb +64 -0
  8. data/lib/generators/rage_arch/scaffold_generator.rb +133 -0
  9. data/lib/generators/rage_arch/templates/ar_dep.rb.tt +46 -0
  10. data/lib/generators/rage_arch/templates/dep.rb.tt +16 -0
  11. data/lib/generators/rage_arch/templates/rage_arch.rb.tt +15 -0
  12. data/lib/generators/rage_arch/templates/scaffold/api_controller.rb.tt +39 -0
  13. data/lib/generators/rage_arch/templates/scaffold/controller.rb.tt +56 -0
  14. data/lib/generators/rage_arch/templates/scaffold/create.rb.tt +14 -0
  15. data/lib/generators/rage_arch/templates/scaffold/destroy.rb.tt +15 -0
  16. data/lib/generators/rage_arch/templates/scaffold/list.rb.tt +13 -0
  17. data/lib/generators/rage_arch/templates/scaffold/new.rb.tt +13 -0
  18. data/lib/generators/rage_arch/templates/scaffold/post_repo.rb.tt +35 -0
  19. data/lib/generators/rage_arch/templates/scaffold/show.rb.tt +14 -0
  20. data/lib/generators/rage_arch/templates/scaffold/update.rb.tt +15 -0
  21. data/lib/generators/rage_arch/templates/use_case.rb.tt +18 -0
  22. data/lib/generators/rage_arch/use_case_generator.rb +33 -0
  23. data/lib/rage_arch/container.rb +38 -0
  24. data/lib/rage_arch/controller.rb +22 -0
  25. data/lib/rage_arch/dep.rb +9 -0
  26. data/lib/rage_arch/dep_scanner.rb +95 -0
  27. data/lib/rage_arch/deps/active_record.rb +45 -0
  28. data/lib/rage_arch/event_publisher.rb +59 -0
  29. data/lib/rage_arch/fake_event_publisher.rb +37 -0
  30. data/lib/rage_arch/railtie.rb +23 -0
  31. data/lib/rage_arch/result.rb +31 -0
  32. data/lib/rage_arch/rspec_matchers.rb +94 -0
  33. data/lib/rage_arch/use_case.rb +252 -0
  34. data/lib/rage_arch/version.rb +5 -0
  35. data/lib/rage_arch.rb +97 -0
  36. metadata +133 -0
data/lib/rage_arch.rb ADDED
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "rage_arch/version"
4
+ require_relative "rage_arch/result"
5
+ require_relative "rage_arch/container"
6
+ require_relative "rage_arch/dep"
7
+ require_relative "rage_arch/event_publisher"
8
+ require_relative "rage_arch/use_case"
9
+ require_relative "rage_arch/deps/active_record"
10
+ require_relative "rage_arch/dep_scanner"
11
+
12
+ module RageArch
13
+ class << self
14
+ def register(symbol, implementation = nil, &block)
15
+ Container.register(symbol, implementation, &block)
16
+ end
17
+
18
+ # Registers a dep that uses Active Record for the given model.
19
+ # Example: Rage.register_ar(:user_store, User)
20
+ def register_ar(symbol, model_class)
21
+ register(symbol, Deps::ActiveRecord.for(model_class))
22
+ end
23
+
24
+ def resolve(symbol)
25
+ Container.resolve(symbol)
26
+ end
27
+
28
+ def registered?(symbol)
29
+ Container.registered?(symbol)
30
+ end
31
+
32
+ # Verifies that all deps and use_cases declared by registered use cases are
33
+ # available before the app handles any request. Call after all initializers run
34
+ # (done automatically by the Railtie unless config.rage.verify_deps = false).
35
+ #
36
+ # Raises RuntimeError listing every missing dep/use_case if any are absent.
37
+ # Returns true when everything is wired correctly.
38
+ def verify_deps!
39
+ errors = []
40
+ scanned_methods = DepScanner.new.scan
41
+
42
+ UseCase::Base.registry.each do |uc_symbol, klass|
43
+ klass.declared_deps.uniq.each do |dep_sym|
44
+ next if klass.ar_deps.key?(dep_sym) # ar_deps fall back to ActiveRecord, optional
45
+
46
+ unless Container.registered?(dep_sym)
47
+ errors << " UseCase :#{uc_symbol} (#{klass}) declares dep :#{dep_sym} — not registered in container"
48
+ next
49
+ end
50
+
51
+ required_methods = scanned_methods[dep_sym]
52
+ next if required_methods.nil? || required_methods.empty?
53
+
54
+ entry = Container.registry[dep_sym]
55
+ impl =
56
+ if entry.is_a?(Class)
57
+ entry
58
+ elsif entry.is_a?(Proc)
59
+ nil # skip: calling a Proc may have side effects
60
+ else
61
+ entry
62
+ end
63
+
64
+ next if impl.nil?
65
+
66
+ impl_name = impl.is_a?(Class) ? impl.name : impl.class.name
67
+
68
+ required_methods.each do |method_name|
69
+ has_method =
70
+ if impl.is_a?(Class)
71
+ impl.method_defined?(method_name) || impl.respond_to?(method_name)
72
+ else
73
+ impl.respond_to?(method_name)
74
+ end
75
+
76
+ unless has_method
77
+ errors << " UseCase :#{uc_symbol} (#{klass}) calls dep :#{dep_sym}##{method_name} — #{impl_name} does not implement ##{method_name}"
78
+ end
79
+ end
80
+ end
81
+
82
+ klass.declared_use_cases.uniq.each do |ref_sym|
83
+ next if UseCase::Base.registry.key?(ref_sym)
84
+
85
+ errors << " UseCase :#{uc_symbol} (#{klass}) declares use_cases :#{ref_sym} — not registered in use case registry"
86
+ end
87
+ end
88
+
89
+ raise "RageArch boot verification failed:\n#{errors.join("\n")}" if errors.any?
90
+
91
+ true
92
+ end
93
+ end
94
+ end
95
+
96
+ require_relative "rage_arch/controller" if defined?(Rails)
97
+ require "rage_arch/railtie" if defined?(Rails)
metadata ADDED
@@ -0,0 +1,133 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rage_arch
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Rage Corp
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: activesupport
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '5.2'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '5.2'
26
+ - !ruby/object:Gem::Dependency
27
+ name: railties
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '5.2'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '5.2'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rake
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '13.0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '13.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rspec
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.0'
68
+ description: Gem to structure Rails apps with use cases, dependencies injectable by
69
+ symbol, and Result object (success/failure). Includes container, use case base,
70
+ and rails g rage_arch:use_case generator.
71
+ email:
72
+ - ''
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - LICENSE
78
+ - README.md
79
+ - lib/generators/rage_arch/ar_dep_generator.rb
80
+ - lib/generators/rage_arch/dep_generator.rb
81
+ - lib/generators/rage_arch/dep_switch_generator.rb
82
+ - lib/generators/rage_arch/install_generator.rb
83
+ - lib/generators/rage_arch/scaffold_generator.rb
84
+ - lib/generators/rage_arch/templates/ar_dep.rb.tt
85
+ - lib/generators/rage_arch/templates/dep.rb.tt
86
+ - lib/generators/rage_arch/templates/rage_arch.rb.tt
87
+ - lib/generators/rage_arch/templates/scaffold/api_controller.rb.tt
88
+ - lib/generators/rage_arch/templates/scaffold/controller.rb.tt
89
+ - lib/generators/rage_arch/templates/scaffold/create.rb.tt
90
+ - lib/generators/rage_arch/templates/scaffold/destroy.rb.tt
91
+ - lib/generators/rage_arch/templates/scaffold/list.rb.tt
92
+ - lib/generators/rage_arch/templates/scaffold/new.rb.tt
93
+ - lib/generators/rage_arch/templates/scaffold/post_repo.rb.tt
94
+ - lib/generators/rage_arch/templates/scaffold/show.rb.tt
95
+ - lib/generators/rage_arch/templates/scaffold/update.rb.tt
96
+ - lib/generators/rage_arch/templates/use_case.rb.tt
97
+ - lib/generators/rage_arch/use_case_generator.rb
98
+ - lib/rage_arch.rb
99
+ - lib/rage_arch/container.rb
100
+ - lib/rage_arch/controller.rb
101
+ - lib/rage_arch/dep.rb
102
+ - lib/rage_arch/dep_scanner.rb
103
+ - lib/rage_arch/deps/active_record.rb
104
+ - lib/rage_arch/event_publisher.rb
105
+ - lib/rage_arch/fake_event_publisher.rb
106
+ - lib/rage_arch/railtie.rb
107
+ - lib/rage_arch/result.rb
108
+ - lib/rage_arch/rspec_matchers.rb
109
+ - lib/rage_arch/use_case.rb
110
+ - lib/rage_arch/version.rb
111
+ homepage: https://github.com/rage-corp/rage_arch
112
+ licenses:
113
+ - MIT
114
+ metadata:
115
+ homepage_uri: https://github.com/rage-corp/rage_arch
116
+ rdoc_options: []
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: 2.7.0
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ requirements: []
130
+ rubygems_version: 4.0.3
131
+ specification_version: 4
132
+ summary: 'Clean Architecture Light for Rails: use cases, injectable deps, Result.'
133
+ test_files: []