upgrow 0.0.4 → 0.0.5

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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/test_unit/input/input_generator.rb +22 -0
  3. data/lib/generators/test_unit/input/templates/input_test.rb.tt +8 -0
  4. data/lib/generators/test_unit/install/install_generator.rb +48 -0
  5. data/lib/generators/test_unit/record/record_generator.rb +22 -0
  6. data/lib/generators/test_unit/record/templates/record_test.rb.tt +8 -0
  7. data/lib/generators/test_unit/repository/repository_generator.rb +23 -0
  8. data/lib/generators/test_unit/repository/templates/repository_test.rb.tt +8 -0
  9. data/lib/generators/upgrow.rb +54 -0
  10. data/lib/generators/upgrow/action/USAGE +13 -0
  11. data/lib/generators/upgrow/action/action_generator.rb +24 -0
  12. data/lib/generators/upgrow/action/templates/action.rb.tt +9 -0
  13. data/lib/generators/upgrow/input/USAGE +10 -0
  14. data/lib/generators/upgrow/input/input_generator.rb +26 -0
  15. data/lib/generators/upgrow/input/templates/input.rb.tt +6 -0
  16. data/lib/generators/upgrow/install/USAGE +25 -0
  17. data/lib/generators/upgrow/install/install_generator.rb +56 -0
  18. data/lib/generators/upgrow/install/templates/app/actions/application_action.rb.tt +4 -0
  19. data/lib/generators/upgrow/install/templates/app/inputs/application_input.rb.tt +4 -0
  20. data/lib/generators/upgrow/install/templates/app/models/application_model.rb.tt +4 -0
  21. data/lib/generators/upgrow/install/templates/app/repositories/application_repository.rb.tt +4 -0
  22. data/lib/generators/upgrow/model/USAGE +10 -0
  23. data/lib/generators/upgrow/model/model_generator.rb +24 -0
  24. data/lib/generators/upgrow/model/templates/model.rb.tt +6 -0
  25. data/lib/generators/upgrow/record/record_generator.rb +34 -0
  26. data/lib/generators/upgrow/record/templates/record.rb.tt +6 -0
  27. data/lib/generators/upgrow/repository/USAGE +10 -0
  28. data/lib/generators/upgrow/repository/repository_generator.rb +27 -0
  29. data/lib/generators/upgrow/repository/templates/repository.rb.tt +6 -0
  30. data/lib/upgrow.rb +3 -0
  31. data/lib/upgrow/active_record_conversion.rb +2 -3
  32. data/lib/upgrow/active_record_queries.rb +1 -2
  33. data/lib/upgrow/active_record_schema.rb +1 -3
  34. data/lib/upgrow/basic_model.rb +11 -0
  35. data/lib/upgrow/model.rb +2 -1
  36. data/lib/upgrow/naming.rb +40 -0
  37. data/lib/upgrow/railtie.rb +9 -0
  38. data/lib/upgrow/record.rb +121 -0
  39. data/test/dummy/app/records/application_record.rb +2 -0
  40. data/test/dummy/app/records/article_record.rb +2 -3
  41. data/test/dummy/app/records/comment_record.rb +2 -3
  42. data/test/dummy/app/records/user_record.rb +2 -4
  43. data/test/dummy/app/repositories/article_repository.rb +3 -3
  44. data/test/test_unit/generators/input_generator_test.rb +56 -0
  45. data/test/test_unit/generators/install_generator_test.rb +138 -0
  46. data/test/test_unit/generators/record_generator_test.rb +56 -0
  47. data/test/test_unit/generators/repository_generator_test.rb +57 -0
  48. data/test/upgrow/active_record_conversion_test.rb +2 -2
  49. data/test/upgrow/active_record_schema_test.rb +1 -1
  50. data/test/upgrow/basic_model_test.rb +85 -0
  51. data/test/upgrow/generators/action_generator_test.rb +59 -0
  52. data/test/upgrow/generators/helper_test.rb +86 -0
  53. data/test/upgrow/generators/input_generator_test.rb +65 -0
  54. data/test/upgrow/generators/install_generator_test.rb +158 -0
  55. data/test/upgrow/generators/model_generator_test.rb +39 -0
  56. data/test/upgrow/generators/record_generator_test.rb +65 -0
  57. data/test/upgrow/generators/repository_generator_test.rb +50 -0
  58. data/test/upgrow/naming_test.rb +22 -0
  59. data/test/upgrow/record_test.rb +176 -0
  60. metadata +60 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ee034f6fa4ddd317a01b6f80d4762259f205a6763cd06fdfa637cdac186f0063
4
- data.tar.gz: 82b9fa66aab3ca2b3bec78ef2c04415d5aa199c0eb9734216010ae0806bb5476
3
+ metadata.gz: 5b23ff76f5c5a26695d3b695084c7196938b758c924c433a9abf17f1918aa7c3
4
+ data.tar.gz: 6799c1a519cddbfa59f16817d4589a6b935c6a581fd7a9b34a58a1ded5399c92
5
5
  SHA512:
6
- metadata.gz: 720d3134774aac67239a7681e2e61dcc525fbd8e38852ebb07f2ec82b8be8cc61ac0b71bcaea13fd375e2fc027bd5092aae11fdd70269da1d1fb299325afbd42
7
- data.tar.gz: 0f16e74a9a07c2e186f10ec14806fc8c59890149204252f25ff2fbc083d8284625f1967a9a74db5e5d1dfb377f315aec864c739a39c8542071a622991bcf8bfb
6
+ metadata.gz: 5c239023970e3d67967420c64bcf836b6c7ae6e56034e04a676148aafb78e99f364a3ab821f11bcc1392e59ce7627f0d5c4c183e734a3631be74d6f5e0f46a8b
7
+ data.tar.gz: 75eb566265b8904dfffd8edb2069ebe4cc676a4e9150d7b0cc507a7c607d6049e4becd66c285a50ad8786336acbe3d7f05d386e9363dade2893a13c40ef6d544
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'generators/upgrow'
4
+
5
+ module TestUnit
6
+ module Generators
7
+ class InputGenerator < Rails::Generators::NamedBase
8
+ include Upgrow::Generators::Helper
9
+
10
+ def create_test_file
11
+ template('input_test.rb',
12
+ File.join('test/inputs', class_path, "#{file_name}_input_test.rb"))
13
+ end
14
+
15
+ private
16
+
17
+ def file_name
18
+ super.delete_suffix('_input')
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ <% module_namespacing do -%>
6
+ class <%= class_name %>InputTest < ActiveSupport::TestCase
7
+ end
8
+ <% end -%>
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'generators/upgrow'
4
+
5
+ module TestUnit
6
+ module Generators
7
+ class InstallGenerator < Rails::Generators::Base
8
+ include Upgrow::Generators::Helper
9
+
10
+ def move_existing_models
11
+ pattern = File.expand_path('test/models/**/*_test.rb', destination_root)
12
+ files = Dir.glob(pattern)
13
+
14
+ return if files.empty?
15
+
16
+ unless yes?('Would you like to convert existing model tests into '\
17
+ 'Record tests?', :blue)
18
+ say(
19
+ 'Please convert your model tests into Record tests manually by '\
20
+ 'moving them to the test/records directory and adding the '\
21
+ 'RecordTest suffix to their class names.',
22
+ :yellow
23
+ )
24
+ return
25
+ end
26
+
27
+ files.each do |original|
28
+ target = relative_to_original_destination_root(original)
29
+ .sub(%r{\Atest/models/}, 'test/records/')
30
+ .sub(/^(.+(?<!_record))_test\.rb\z/, '\1_record_test.rb')
31
+
32
+ move_file(original, target)
33
+
34
+ inject_into_file(
35
+ target, 'Record',
36
+ before: /(?<!Record)Test < /,
37
+ force: true,
38
+ verbose: false
39
+ )
40
+ end
41
+ end
42
+
43
+ def create_test_directories
44
+ directory('test')
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'generators/upgrow'
4
+
5
+ module TestUnit
6
+ module Generators
7
+ class RecordGenerator < Rails::Generators::NamedBase
8
+ include Upgrow::Generators::Helper
9
+
10
+ def create_test_file
11
+ template('record_test.rb',
12
+ File.join('test/records', class_path, "#{file_name}_record_test.rb"))
13
+ end
14
+
15
+ private
16
+
17
+ def file_name
18
+ super.delete_suffix('_record')
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ <% module_namespacing do -%>
6
+ class <%= class_name %>RecordTest < ActiveSupport::TestCase
7
+ end
8
+ <% end -%>
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'generators/upgrow'
4
+
5
+ module TestUnit
6
+ module Generators
7
+ class RepositoryGenerator < Rails::Generators::NamedBase
8
+ include Upgrow::Generators::Helper
9
+
10
+ def create_test_file
11
+ template('repository_test.rb',
12
+ File.join('test/repositories', class_path,
13
+ "#{file_name}_repository_test.rb"))
14
+ end
15
+
16
+ private
17
+
18
+ def file_name
19
+ super.delete_suffix('_repository')
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ <% module_namespacing do -%>
6
+ class <%= class_name %>RepositoryTest < ActiveSupport::TestCase
7
+ end
8
+ <% end -%>
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Upgrow
4
+ module Generators
5
+ module Helper
6
+ module ClassMethods
7
+ def base_root
8
+ __dir__
9
+ end
10
+ end
11
+
12
+ def self.included(base)
13
+ base.extend(ClassMethods)
14
+ end
15
+
16
+ def move_file(origin, destination)
17
+ origin = File.expand_path(origin, destination_root)
18
+ destination = File.expand_path(destination, destination_root)
19
+
20
+ say_status(
21
+ :move,
22
+ "#{relative_to_original_destination_root(origin)} -> " +
23
+ relative_to_original_destination_root(destination)
24
+ )
25
+
26
+ FileUtils.mkdir_p(File.dirname(destination))
27
+ FileUtils.mv(origin, destination)
28
+ end
29
+
30
+ def class_name
31
+ file_name.camelize
32
+ end
33
+
34
+ def module_namespacing(&block)
35
+ super do
36
+ content = capture(&block)
37
+ concat(namespace_content(class_path, content))
38
+ end
39
+ end
40
+
41
+ def namespace_content(namespaces, content)
42
+ namespace = namespaces.shift
43
+
44
+ content = namespace_content(namespaces, content) if namespaces.any?
45
+
46
+ if namespace
47
+ "module #{namespace.camelize}\n#{indent(content).chomp}\nend\n"
48
+ else
49
+ content
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,13 @@
1
+ Description:
2
+
3
+ Creates a new Action class with the given name under `app/actions`.
4
+
5
+ Since Actions are not expected to be unit tested, this generator does not
6
+ invoke the test framework generator. Action behaviour is supposed to be
7
+ tested with integration or system tests.
8
+
9
+ Example:
10
+
11
+ `bin/rails g upgrow:action articles/create`
12
+
13
+ create app/actions/articles/create_action.rb
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'generators/upgrow'
4
+
5
+ module Upgrow
6
+ module Generators
7
+ class ActionGenerator < Rails::Generators::NamedBase
8
+ include Helper
9
+
10
+ def create_action_file
11
+ template(
12
+ 'action.rb',
13
+ File.join('app/actions', class_path, "#{file_name}_action.rb")
14
+ )
15
+ end
16
+
17
+ private
18
+
19
+ def file_name
20
+ super.delete_suffix('_action')
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ <% module_namespacing do -%>
4
+ class <%= class_name %>Action < ApplicationAction
5
+ def perform(*args)
6
+ # Do something here.
7
+ end
8
+ end
9
+ <% end -%>
@@ -0,0 +1,10 @@
1
+ Description:
2
+
3
+ Creates a new Input class with the given name under `app/inputs`.
4
+
5
+ Example:
6
+
7
+ `bin/rails g upgrow:input article`
8
+
9
+ create app/inputs/article_input.rb
10
+ invoke test_unit
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'generators/upgrow'
4
+
5
+ module Upgrow
6
+ module Generators
7
+ class InputGenerator < Rails::Generators::NamedBase
8
+ include Helper
9
+
10
+ def create_input_file
11
+ template(
12
+ 'input.rb',
13
+ File.join('app/inputs', class_path, "#{file_name}_input.rb")
14
+ )
15
+ end
16
+
17
+ hook_for :test_framework
18
+
19
+ private
20
+
21
+ def file_name
22
+ super.delete_suffix('_input')
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ <% module_namespacing do -%>
4
+ class <%= class_name %>Input < ApplicationInput
5
+ end
6
+ <% end -%>
@@ -0,0 +1,25 @@
1
+ Description:
2
+
3
+ Creates the additional directories and files for development using the
4
+ Upgrow architecture. This generator will create the base classes for your
5
+ Actions, Inputs, Repositories, and Models. It will also ask if you would
6
+ like to convert your existing Ruby files under `app/models` into Upgrow
7
+ Records automatically. If you say yes, it will move those files to
8
+ `app/records` and change their class names to include the `Record` suffix.
9
+ In case an `ApplicationRecord` exists, the generator will assume this to be
10
+ the base class for all Records, and it will include the `Upgrow::Record`
11
+ module in it.
12
+
13
+ Example:
14
+
15
+ `bin/rails generate upgrow:install`
16
+
17
+ Would you like to convert all models into Records? yes
18
+ move app/models/application_record.rb -> app/records/application_record.rb
19
+ move app/models/article.rb -> app/records/article_record.rb
20
+ exist app
21
+ create app/actions/application_action.rb
22
+ create app/inputs/application_input.rb
23
+ create app/models/application_model.rb
24
+ create app/repositories/application_repository.rb
25
+ invoke test_unit
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'generators/upgrow'
4
+
5
+ module Upgrow
6
+ module Generators
7
+ class InstallGenerator < Rails::Generators::Base
8
+ include Helper
9
+
10
+ def move_existing_models
11
+ pattern = File.expand_path('app/models/**/*.rb', destination_root)
12
+ files = Dir.glob(pattern)
13
+
14
+ return if files.empty?
15
+
16
+ unless yes?('Would you like to convert all models into Records?', :blue)
17
+ say(
18
+ 'Please convert your existing models into Records manually. You '\
19
+ 'may move them to the app/records folder, add the Record suffix '\
20
+ 'to their class names, and include Upgrow::Record.',
21
+ :yellow
22
+ )
23
+ return
24
+ end
25
+
26
+ files.each do |original|
27
+ target = relative_to_original_destination_root(original)
28
+ .sub(%r{\Aapp/models/}, 'app/records/')
29
+ .sub(/^(.+(?<!_record))\.rb\z/, '\1_record.rb')
30
+
31
+ move_file(original, target)
32
+
33
+ inject_into_file(
34
+ target, 'Record',
35
+ after: /class (?!\w+Record\s)\w+/,
36
+ force: true,
37
+ verbose: false
38
+ )
39
+
40
+ inject_into_class(
41
+ target,
42
+ 'ApplicationRecord',
43
+ " include Upgrow::Record\n",
44
+ verbose: false
45
+ )
46
+ end
47
+ end
48
+
49
+ def create_app_files
50
+ directory('app')
51
+ end
52
+
53
+ hook_for :test_framework
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ApplicationAction < Upgrow::Action
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ApplicationInput < Upgrow::Input
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ApplicationModel < Upgrow::Model
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ApplicationRepository < Upgrow::Repository
4
+ end
@@ -0,0 +1,10 @@
1
+ Description:
2
+
3
+ Creates a new Model class with the given name under `app/models`.
4
+
5
+ Example:
6
+
7
+ `bin/rails g upgrow:model article`
8
+
9
+ create app/models/article.rb
10
+ invoke test_unit
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'generators/upgrow'
4
+
5
+ module Upgrow
6
+ module Generators
7
+ class ModelGenerator < Rails::Generators::NamedBase
8
+ include Helper
9
+
10
+ def create_model_file
11
+ template(
12
+ 'model.rb',
13
+ File.join('app/models', class_path, "#{file_name}.rb")
14
+ )
15
+ end
16
+
17
+ hook_for :repository, default: :upgrow, as: :repository
18
+
19
+ hook_for :record, default: :upgrow, as: :record
20
+
21
+ hook_for :test_framework
22
+ end
23
+ end
24
+ end