rails_services 2.0.0 → 3.0.1

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
- SHA1:
3
- metadata.gz: 9ed6fbb385562ade48621df44d26cc9a792f2e8a
4
- data.tar.gz: 8584883d0e3aedc95d8c824b340d0e020d671831
2
+ SHA256:
3
+ metadata.gz: a03e068552adcb9e44d914b7387aee0823352a97344f5fedd2235769c9422d60
4
+ data.tar.gz: f4497409f14385d5dc43a31838aebbb634c545dcc4a1e9b589b76269e84b0219
5
5
  SHA512:
6
- metadata.gz: c926ddb834d4b593e5f4a1871bc614c202b9663cd07bee5ed6979348936c7f036ff3a38f3c76281c7eb9adaafbe8cfa9d020f9dce77176bc79600d11bd9171a8
7
- data.tar.gz: e20de587c99ca41564f44d7dd6a1ae7d6485c31e7f4355729915341eae1bc0dd9336ee56478018c85a022f66e5163c23059e457c568bdd1f2592944c34932e88
6
+ metadata.gz: f140478c96620b1a44b90a06594ac4f376c9e97f0e970067cdcac4e30facecab51a4f6f75b2805492dd90ccb99fc19d97d8728490fa7e0ffc416fd25489db07b
7
+ data.tar.gz: f1361bdc5334403134e7989790abf87a68273d7592e3c1ac380581a3eeed4eea9e24671067357a7f61f75f7008af6e185df6a4062b619731490473d40ac6c150
data/CHANGELOG.md CHANGED
@@ -2,6 +2,27 @@
2
2
  All notable changes to this project will be documented in this file.
3
3
  This project adheres to [Semantic Versioning](http://semver.org/).
4
4
 
5
+ ## [3.0.1] - 2021-12-21
6
+ ### Added
7
+ - Updated gem spec to just require Rails (no more specific versions)
8
+
9
+ ## [3.0.0] - 2020-04-12
10
+ ### Added
11
+ - Added Form object option,
12
+ - Updated for Rails 6
13
+
14
+ ## [2.5.0] - 2019-02-14
15
+ ### Fixed
16
+ - Miscellaneous bug fixes
17
+
18
+ ## [2.0.1] - 2017-07-16
19
+ ### Added
20
+ - Updating gem for the Rails verions 4 AND 5
21
+
22
+ ## [2.0.0] - 2016-05-29
23
+ ### Added
24
+ - Alters service object from one that was class-based to one that is instance-based (vis-a-vis methods, etc.)
25
+
5
26
  ## [1.1.3] - 2016-05-03
6
27
  ### Fixed
7
28
  - Fixed the name of the class in the Minitest test class
data/README.md CHANGED
@@ -1,17 +1,14 @@
1
1
  # RailsServices
2
2
 
3
3
  [![Code Climate](https://codeclimate.com/github/imageaid/rails_service_generator.png)](https://codeclimate.com/github/imageaid/rails_service_generator)
4
- [![Test Coverage](https://codeclimate.com/github/imageaid/rails_service_generator/coverage.png)](https://codeclimate.com/github/imageaid/rails_service_generator)
5
4
  [![Gem Version](https://badge.fury.io/rb/rails_services.svg)](http://badge.fury.io/rb/rails_services)
6
5
 
7
- A very (VERY) simple gem for Rails that adds a generator for easily creating a service class and its accompanying spec or test unit file.
6
+ A gem for Rails that adds a generator for easily creating a service class and/or form object and its accompanying spec or test unit file.
8
7
 
9
8
  ## Requirements
10
-
11
9
  Rails 4 and higher
12
10
 
13
11
  ## Installation
14
-
15
12
  Add this line to your application's Gemfile:
16
13
 
17
14
  gem 'rails_services'
@@ -25,38 +22,55 @@ Or install it yourself as:
25
22
  $ gem install rails_services
26
23
 
27
24
  ## Usage
28
-
29
25
  Examples:
30
26
 
31
- $ rails generate rails_services:create Service Model|Controller Sub-folder [opt] --instance [yes (default), no]
27
+ $ [bundle exec] rails generate rails_services:create Service ParentFolder --sub_folder SubFolder [opt]
32
28
 
33
- $ rails generate rails_services:destroy Service Model|Controller Sub-folder [opt] --instance [yes (default), no]
29
+ $ [bundle exec] rails generate rails_services:destroy Service ParentFolder --sub_folder SubFolder [opt]
34
30
 
35
- ### Sub-folders
36
- Sub-folders are optional but, at this time, you may only use one sub-folder. I generally use the sub-folders when I have a naturally grouped set of services.
31
+ $ [bundle exec] rails generate rails_services:form Form ParentFolder --sub_folder SubFolder [opt] --accessors name email [opt]
32
+
33
+ ## v3.0.0 CHANGES AND REMOVALS
34
+ ### CHANGES
35
+ There are four primary changes in v3.0.0:
36
+
37
+ 1. All services have `include BaseService`
38
+ 2. The `call` method is an instance method rather than a class method
39
+ 3. You may generate a `Form` model
40
+ 4. An updated command line interface (see below)
41
+
42
+ #### Updated command line interface
43
+ Previous versions of the gem used plain old arguments to create or destroy the appropriate files. Over time, this became more unwieldy than imagined. From v3.0.0 forward, there are only two arguments: `object_name` and `parent_name`. Additionally, the previously available optional argument, `instance`, was removed (see REMOVALS section, below).
44
+
45
+ If you would like to add a sub-folder to the service or form, you can now provide the `class_option` for it: `--sub_folder NAME_OF_FOLDER`. Similarly, for the form generator, you can pass in an array of `attr_accessors` with the following: `--accessors accessor_1_name accessor_2_name ...` (use regular strings as these will be 'converted' to symbols).
46
+
47
+ ### REMOVALS:
48
+ There was one significant removal from the gem:
37
49
 
38
- ### Instance Argument
39
- The instance argument was added in version 2.0.0. It is also optional but does default to `yes` if omitted. In previous iterations of this gem
40
- as well as in my early use of service layers, I did not instantiate my service classes; rather, I created adn accessed them at the class level,
41
- calling class methods (i.e., those defined with `self.`).
50
+ 1. No more `instance` argument in the command line interface (see below)
42
51
 
43
- I was never satisfied with this and, sometime in the last few months, I read a now-lost blog post on utilizing a `BaseService` class and
44
- instantiating your actual service. I prefer this new approach, for lack of a better word, and have decided to add it to this gem, as the
45
- default style used going forward (starting with 2.0.0).
52
+ #### Instance argument dropped
53
+ An instance argument was added in v2.0.0 which allowed users to choose what style of service class to create. The gem defaulted to using this new style.
46
54
 
47
- ## Upgrading
48
- The primary change in version 2 is that old services, those that do not include the `BaseService` class, called
49
- and accessed methods that were all defined with `self.`. You do not have to choose one style over another; in fact,
50
- you can mix and match the styles, if you wish.
55
+ While the v2.x line continued to allow users a choice between the old and new^ styles, the v3.x line removes this choice. All services will be created with the now-not-so-new style. BE AWARE :)!
51
56
 
52
- **Converting Old Service Classes** - Should you want to update your older/previously built services with this approach, you only need to do
53
- the following:
57
+ ^The new style creates service clases inherited from a `BaseService` class; allows for optional instantiation of the service (`Service.new(args*).call`), and uses an instance method for `call`.
58
+
59
+ ## NOTES
60
+ ### Upgrading to current service class style
61
+ Should you want to update your older/previously built services with this 'new' style, you only need to do the following:
54
62
 
55
63
  # include the base service in your class
56
64
  class ClassName
57
65
  include BaseService
58
66
 
59
- # Then ... change the method signatures, simply removing "self." from the definition
67
+ # Then ... optionally, add an initialize method
68
+ def initialize(*args)
69
+ # ...
70
+ super
71
+ end
72
+
73
+ # Finally, change the method signatures, simply removing `self.` from the definition(s), as follows:
60
74
  def self.call
61
75
  # ...
62
76
  end
@@ -66,16 +80,29 @@ the following:
66
80
  end
67
81
  # and so on for other, similarly defined methods
68
82
 
69
- ## Result
83
+ ### Sub-folders
84
+ Sub-folders are optional but, at this time, you may only use one sub-folder. I generally only use the sub-folders when I have a naturally grouped set of services.
70
85
 
71
- Two files are created (spec or test based on your `test_framework`):
86
+ ## Generator results
87
+ ### Create service and create form
88
+ Two files are created: the requested class and either a spec or test class, based on your testing framework (minitest or rspec).
72
89
 
73
- + app/services/model|controller/[sub-folder]/thing.rb
74
- + spec/services/model|controller/[sub-folder]/thing_spec.rb
75
- + test/services/model|controller/[sub-folder]/thing_test.rb
90
+ For services:
76
91
 
77
- ## Contributing
92
+ + app/services/[parent-folder]/[sub-folder]/thing.rb
93
+ + spec/services/[parent-folder]/[sub-folder]/thing_spec.rb OR
94
+ + test/services/[parent-folder]/[sub-folder]/thing_test.rb
78
95
 
96
+ For forms:
97
+
98
+ + app/forms/[parent-folder]/[sub-folder]/thing_form.rb
99
+ + spec/forms/[parent-folder]/[sub-folder]/thing_form_spec.rb OR
100
+ + test/forms/[parent-folder]/[sub-folder]/thing_form_test.rb
101
+
102
+ ### Destroy service
103
+ Pretty simple here ... it just removes the files it created!
104
+
105
+ ## Contributing
79
106
  1. Fork it ( https://github.com/imageaid/rails_services/fork )
80
107
  2. Create your feature branch (`git checkout -b my-new-feature`)
81
108
  3. Commit your changes (`git commit -am 'Add some feature'`)
@@ -1,27 +1,33 @@
1
1
  Description:
2
2
  Creates a service class and accompanying spec/test unit file
3
3
  Destroys a service class and accompanying spec/test unit file
4
+ Creates a form object and accompanying spec/test unit file
4
5
 
5
- Example:
6
- rails generate rails_services:destroy Thing Model|Controller Sub-folder [opt] --instance [yes (default), no]
6
+ Service Example:
7
+ rails generate rails_services:create Thing Model|Controller -- sub_folder Sub-folder [opt]]
7
8
 
8
- This will remove:
9
+ This will add:
9
10
  app/services/model|controller/[sub-folder]/thing.rb
10
11
  # either
11
12
  spec/services/model|controller/[sub-folder]/thing_spec.rb
12
13
  # or
13
14
  test/services/model|controller/[sub-folder]/thing_test.rb
14
15
 
15
- rails generate rails_services:create Thing Model|Controller Sub-folder [opt] --instance [yes (default), no]
16
+ rails generate rails_services:destroy Thing Model|Controller -- sub_folder Sub-folder [opt]]
16
17
 
17
- This will add:
18
+ This will remove:
18
19
  app/services/model|controller/[sub-folder]/thing.rb
19
20
  # either
20
21
  spec/services/model|controller/[sub-folder]/thing_spec.rb
21
22
  # or
22
23
  test/services/model|controller/[sub-folder]/thing_test.rb
23
24
 
24
- The new `instance` argument:
25
- Over the last year, I have slightly altered how I structure my service classes. I've taken to using a `BaseService`
26
- class that is included in all services. This allows me to inherently instantiate each service (versus the old style of
27
- creating service class, which was "class-driven", if you will).
25
+ Form Example:
26
+ rails generate rails_services:form Thing Model|Controller -- sub_folder Sub-folder [opt] --accessors name email [opt]
27
+
28
+ This will add:
29
+ app/forms/[parent-folder]/[sub-folder]/thing_form.rb
30
+ # either
31
+ spec/forms/[parent-folder]/[sub-folder]/thing_form_spec.rb
32
+ # or
33
+ test/forms/[parent-folder]/[sub-folder]/thing_form_test.rb
@@ -1,71 +1,40 @@
1
+ require_relative '../../../lib/rails_services/nameable'
2
+ require_relative '../../../lib/rails_services/fileable'
3
+
1
4
  module RailsServices
2
5
  class Generators
6
+ ##
7
+ # creates a service class
3
8
  class CreateGenerator < Rails::Generators::Base
4
- source_root File.expand_path('../templates', __FILE__)
5
- argument :service_name, type: :string
9
+ source_root File.expand_path('templates', __dir__)
10
+
11
+ include Nameable
12
+ include Fileable
13
+
14
+ argument :object_name, type: :string
6
15
  argument :parent_name, type: :string
7
- argument :sub_folder, type: :string, default: ''
8
- argument :instance, type: :string, default: 'yes'
16
+
17
+ class_option :sub_folder, type: :string, default: ''
9
18
 
10
19
  def create_service
11
- if instance == 'yes'
12
- copy_base_service_class
13
- template 'base_service_new.rb.erb', "app/services/#{service_directory}/#{service_file}"
14
- else
15
- template 'base_service_old.rb.erb', "app/services/#{service_directory}/#{service_file}"
16
- end
20
+ copy_base_service_class
21
+ template 'base_service_new.rb.erb', "app/services/#{object_directory}/#{service_object_file}"
17
22
  create_test
18
23
  end
19
24
 
20
25
  private
26
+
21
27
  def copy_base_service_class
22
- template('base_service.rb.erb', 'app/services/base_service.rb') unless File.exist?('app/services/base_service.rb')
28
+ template('base_service_class.rb.erb', 'app/services/base_service.rb') unless File.exist?('app/services/base_service.rb')
23
29
  end
24
30
 
25
31
  def create_test
26
- if File.exists?('spec/spec_helper.rb')
27
- template 'base_service_spec.rb.erb', "spec/services/#{service_directory}/#{spec_file}"
32
+ if File.exist?('spec/spec_helper.rb')
33
+ template 'base_service_spec.rb.erb', "spec/services/#{object_directory}/#{service_spec_file}"
28
34
  else
29
- template 'base_service_unit_test.rb.erb', "test/services/#{service_directory}/#{unit_file}"
35
+ template 'base_service_unit_test.rb.erb', "test/services/#{object_directory}/#{service_unit_file}"
30
36
  end
31
37
  end
32
-
33
- def service_directory
34
- file_path = "#{parent_name.pluralize.underscore}"
35
- file_path += "/#{sub_folder.underscore}" if sub_folder.present?
36
- file_path
37
- end
38
-
39
- def service_file
40
- "#{service_name.underscore}.rb"
41
- end
42
-
43
- def spec_file
44
- "#{service_name.underscore}_spec.rb"
45
- end
46
-
47
- def unit_file
48
- "#{service_name.underscore}_test.rb"
49
- end
50
-
51
- def qualified_name
52
- name = "#{parent_name.pluralize.camelize}::"
53
- name += "#{sub_folder.camelize}::" if sub_folder.present?
54
- name += "#{service_name.camelize}"
55
- name
56
- end
57
-
58
- def module_name
59
- "#{parent_name.pluralize.camelize}"
60
- end
61
-
62
- def subfolder_name
63
- "#{sub_folder.try(:camelize)}"
64
- end
65
-
66
- def class_name
67
- "#{service_name.camelize}"
68
- end
69
38
  end
70
39
  end
71
- end
40
+ end
@@ -1,51 +1,53 @@
1
+ require_relative '../../../lib/rails_services/nameable'
2
+ require_relative '../../../lib/rails_services/fileable'
3
+
1
4
  module RailsServices
2
5
  class Generators
6
+ ##
7
+ # destroys a service class
3
8
  class DestroyGenerator < Rails::Generators::Base
4
- argument :service_name, type: :string
9
+ include Nameable
10
+ include Fileable
11
+
12
+ argument :object_name, type: :string
5
13
  argument :parent_name, type: :string
6
- argument :sub_folder, type: :string, default: ''
14
+
15
+ class_option :sub_folder, type: :string, default: ''
7
16
 
8
17
  def destroy_service
9
- remove_file "app/services/#{full_service_directory}/#{service_file}"
10
- remove_file "spec/services/#{full_service_directory}/#{spec_file}"
18
+ remove_file "app/services/#{full_object_directory}/#{service_object_file}"
19
+ remove_file "spec/services/#{full_object_directory}/#{service_spec_file}"
20
+ remove_file "test/services/#{full_object_directory}/#{service_unit_file}"
11
21
 
12
- manage_containing_directories('app', 'spec')
22
+ manage_containing_directories('app', 'spec', 'test')
13
23
  end
14
24
 
15
25
  private
16
- def full_service_directory
17
- file_path = "#{service_parent_directory}"
18
- file_path += "/#{sub_folder.underscore}" if sub_folder.present?
26
+
27
+ def full_object_directory
28
+ file_path = service_parent_directory.to_s
29
+ file_path += "/#{options['sub_folder'].underscore}" if options['sub_folder'].present?
19
30
  file_path
20
31
  end
21
32
 
22
33
  def service_parent_directory
23
- "#{parent_name.pluralize.underscore}"
24
- end
25
-
26
- def service_file
27
- "#{service_name.underscore}.rb"
28
- end
29
-
30
- def spec_file
31
- "#{service_name.underscore}_spec.rb"
34
+ parent_name.pluralize.underscore.to_s
32
35
  end
33
36
 
34
37
  def manage_containing_directories(*directory_types)
35
38
  directory_types.each do |directory_type|
36
- remove_dir("#{directory_type}/services/#{full_service_directory}") if directory_empty?(directory_type)
39
+ remove_dir("#{directory_type}/services/#{full_object_directory}") if directory_empty?(directory_type)
37
40
  remove_dir("#{directory_type}/services/#{service_parent_directory}") if parent_directory_empty?(directory_type)
38
41
  end
39
42
  end
40
43
 
41
44
  def directory_empty?(directory_type)
42
- Dir["#{Rails.root}/#{directory_type}/services/#{full_service_directory}/*"].empty?
45
+ Dir["#{Rails.root}/#{directory_type}/services/#{full_object_directory}/*"].empty?
43
46
  end
44
47
 
45
48
  def parent_directory_empty?(directory_type)
46
49
  Dir["#{Rails.root}/#{directory_type}/services/#{service_parent_directory}/*"].empty?
47
50
  end
48
-
49
51
  end
50
52
  end
51
- end
53
+ end
@@ -0,0 +1,36 @@
1
+ require_relative '../../../lib/rails_services/nameable'
2
+ require_relative '../../../lib/rails_services/fileable'
3
+
4
+ module RailsServices
5
+ class Generators
6
+ ##
7
+ # generates a form object
8
+ class FormGenerator < Rails::Generators::Base
9
+ source_root File.expand_path('templates', __dir__)
10
+
11
+ include Nameable
12
+ include Fileable
13
+
14
+ argument :object_name, type: :string, required: true
15
+ argument :parent_name, type: :string, required: true
16
+
17
+ class_option :sub_folder, type: :string, default: ''
18
+ class_option :accessors, type: :array, default: []
19
+
20
+ def create_form
21
+ template 'base_form.rb.erb', "app/forms/#{object_directory}/#{form_object_file}"
22
+ create_test
23
+ end
24
+
25
+ private
26
+
27
+ def create_test
28
+ if File.exist?('spec/spec_helper.rb')
29
+ template 'base_form_spec.rb.erb', "spec/forms/#{object_directory}/#{form_spec_file}"
30
+ else
31
+ template 'base_form_unit_test.rb.erb', "test/forms/#{object_directory}/#{form_unit_file}"
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,30 @@
1
+ <%= '# Generated form object' %>
2
+ <%= "module #{module_name}" %>
3
+ <% if subfolder_name.present? -%>
4
+ <%= "module #{subfolder_name}" %>
5
+ <%= '##' %>
6
+ <%= "# #{qualified_name} Form Object" %>
7
+ <%= "class #{form_class_name}" %>
8
+ <%= 'include ActiveModel::Model' %>
9
+
10
+ <% if options['accessors'].present? -%>
11
+ <%= "attr_accessor :#{options['accessors'].join(', :')}" %>
12
+
13
+ <% end -%>
14
+ <%= 'def save;' %> <%= 'end' %>
15
+ <%= 'end' %>
16
+ <%= 'end' %>
17
+ <% else -%>
18
+ <%= '##' %>
19
+ <%= "# #{qualified_name} Form Object" %>
20
+ <%= "class #{form_class_name}" %>
21
+ <%= 'include ActiveModel::Model' %>
22
+
23
+ <% if options['accessors'].present? -%>
24
+ <%= "attr_accessor :#{options['accessors'].join(', :')}" %>
25
+
26
+ <% end -%>
27
+ <%= 'def save;' %> <%= 'end' %>
28
+ <%= 'end' %>
29
+ <% end -%>
30
+ <%= 'end' %>
@@ -0,0 +1,7 @@
1
+ <%= "describe #{qualified_name} do" %>
2
+ <%= "context 'doing something' do" %>
3
+ <%= "it 'should test something' do" %>
4
+ <%= 'skip' %>
5
+ <%= 'end' %>
6
+ <%= 'end' %>
7
+ <%= 'end' %>
@@ -0,0 +1,7 @@
1
+ <%= "require 'test_helper'" %>
2
+
3
+ <%= "class #{form_class_name}Test < ActiveSupport::TestCase" %>
4
+ <%= 'def test_some_stuff' %>
5
+ <%= "assert (1 == 2), 'You best test yourself before you wreck yourself!'" %>
6
+ <%= 'end' %>
7
+ <%= 'end' %>
@@ -2,11 +2,10 @@
2
2
  <%= 'def self.included(base)' %>
3
3
  <%= 'base.extend ClassMethods' %>
4
4
  <%= 'end' %>
5
-
6
5
  <%= 'module ClassMethods' %>
7
6
  <%= 'def call(*args, &block)' %>
8
7
  <%= '@instance ||= self.new' %>
9
8
  <%= '@instance.call *args, &block' %>
10
9
  <%= 'end' %>
11
10
  <%= 'end' %>
12
- <%= 'end' %>
11
+ <%= 'end' %>
@@ -1,23 +1,28 @@
1
+ <%= '# Generated service object' %>
1
2
  <%= "module #{module_name}" %>
2
- <% if subfolder_name.present? %>
3
+ <% if subfolder_name.present? -%>
3
4
  <%= "module #{subfolder_name}" %>
4
- <% end %>
5
- <% if subfolder_name.present? %>
6
- <%= "class #{class_name}" %>
5
+ <%= '##' %>
6
+ <%= "# #{qualified_name} Service Class" %>
7
+ <%= "class #{service_class_name}" %>
7
8
  <%= 'include BaseService' %>
8
- <%= "# SAMPLE USAGE: #{qualified_name}.(*args)" %>
9
- <%= 'def call' %>
10
- <%= 'end' %>
11
- <%= 'end' %>
12
- <% else %>
13
- <%= "class #{class_name}" %>
14
- <%= 'include BaseService' %>
15
- <%= "# SAMPLE USAGE: #{qualified_name}.(*args)" %>
16
- <%= 'def call' %>
9
+
10
+ <%= "# SAMPLE USAGE: #{qualified_name}.new(*args).call" %>
11
+ <%= 'def initialize(_args);' %> <%= 'end' %>
12
+
13
+ <%= 'def call;' %> <%= 'end' %>
17
14
  <%= 'end' %>
18
15
  <%= 'end' %>
19
- <% end %>
20
- <% if subfolder_name.present? %>
16
+ <% else -%>
17
+ <%= '##' %>
18
+ <%= "# #{qualified_name} Service Class" %>
19
+ <%= "class #{service_class_name}" %>
20
+ <%= 'include BaseService' %>
21
+
22
+ <%= "# SAMPLE USAGE: #{qualified_name}.new(*args).call" %>
23
+ <%= 'def initialize(_args);' %> <%= 'end' %>
24
+
25
+ <%= 'def call;' %> <%= 'end' %>
21
26
  <%= 'end' %>
22
- <% end %>
23
- <%= 'end' %>
27
+ <% end -%>
28
+ <%= 'end' %>
@@ -4,4 +4,4 @@
4
4
  <%= 'skip' %>
5
5
  <%= 'end' %>
6
6
  <%= 'end' %>
7
- <%= 'end' %>
7
+ <%= 'end' %>
@@ -1,6 +1,6 @@
1
1
  <%= "require 'test_helper'" %>
2
2
 
3
- <%= "class #{class_name}Test < ActiveSupport::TestCase" %>
3
+ <%= "class #{service_class_name}Test < ActiveSupport::TestCase" %>
4
4
  <%= 'def test_some_stuff' %>
5
5
  <%= "assert (1 == 2), 'You best test yourself before you wreck yourself!'" %>
6
6
  <%= 'end' %>
@@ -0,0 +1,37 @@
1
+ module RailsServices
2
+ ##
3
+ # handles creating files and directories
4
+ module Fileable
5
+ def object_directory
6
+ file_path = parent_name.pluralize.underscore.to_s
7
+ file_path += "/#{options['sub_folder'].underscore}" if options['sub_folder'].present?
8
+ file_path
9
+ end
10
+
11
+ # services
12
+ def service_object_file
13
+ "#{object_name.underscore}.rb"
14
+ end
15
+
16
+ def service_spec_file
17
+ "#{object_name.underscore}_spec.rb"
18
+ end
19
+
20
+ def service_unit_file
21
+ "#{object_name.underscore}_test.rb"
22
+ end
23
+
24
+ # forms
25
+ def form_object_file
26
+ "#{object_name.underscore}_form.rb"
27
+ end
28
+
29
+ def form_spec_file
30
+ "#{object_name.underscore}_form_spec.rb"
31
+ end
32
+
33
+ def form_unit_file
34
+ "#{object_name.underscore}_form_test.rb"
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,28 @@
1
+ module RailsServices
2
+ ##
3
+ # commonly used naming conventions
4
+ module Nameable
5
+ def qualified_name
6
+ name = "#{parent_name.pluralize.camelize}::"
7
+ name += "#{options['sub_folder'].camelize}::" if options['sub_folder'].present?
8
+ name += object_name.camelize.to_s
9
+ name
10
+ end
11
+
12
+ def module_name
13
+ parent_name.pluralize.camelize.to_s
14
+ end
15
+
16
+ def subfolder_name
17
+ options['sub_folder'].try(:camelize).to_s
18
+ end
19
+
20
+ def service_class_name
21
+ object_name.camelize.to_s
22
+ end
23
+
24
+ def form_class_name
25
+ "#{object_name.camelize.to_s}Form"
26
+ end
27
+ end
28
+ end
@@ -1,3 +1,3 @@
1
1
  module RailsServices
2
- VERSION = '2.0.0'
2
+ VERSION = '3.0.1'.freeze
3
3
  end
@@ -1,23 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../../../../test/test_helper'
2
4
 
3
5
  class CreateGeneratorTest < Rails::Generators::TestCase
4
6
  tests ::RailsServices::Generators::CreateGenerator
5
7
 
6
- destination File.expand_path('../../tmp', __FILE__)
8
+ destination File.expand_path('../tmp', __dir__)
7
9
 
8
10
  setup do
9
11
  prepare_destination
10
12
  end
11
13
 
12
- test 'generates an old style service class' do
13
- run_generator(%w(TestService ParentModel SubFolder --style old))
14
- assert_file 'app/services/parent_models/sub_folder/test_service.rb'
15
- end
16
-
17
- test 'generates a new style service class' do
18
- run_generator(%w(TestBaseService ParentModel SubFolder --style new))
14
+ test 'generates a service class' do
15
+ run_generator(%w[TestBaseService ParentModel --sub_folder SubFolder])
19
16
  assert_file 'app/services/base_service.rb'
20
17
  assert_file 'app/services/parent_models/sub_folder/test_base_service.rb'
21
18
  end
22
-
23
- end
19
+ end
@@ -1,17 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../../../../test/test_helper'
2
4
 
3
5
  class DestroyGeneratorTest < Rails::Generators::TestCase
4
6
  tests ::RailsServices::Generators::DestroyGenerator
5
7
 
6
- destination File.expand_path('../../tmp', __FILE__)
8
+ destination File.expand_path('../tmp', __dir__)
7
9
 
8
10
  setup do
9
11
  prepare_destination
10
- run_generator(%w(TestService ParentModel SubFolder))
12
+ run_generator(%w[TestService ParentModel --sub_folder SubFolder])
11
13
  end
12
14
 
13
15
  test 'removes an initializer' do
14
16
  assert_no_file 'app/services/parent_models/sub_folder/test_service.rb'
15
17
  end
16
-
17
- end
18
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../../test/test_helper'
4
+
5
+ class FormGeneratorTest < Rails::Generators::TestCase
6
+ tests ::RailsServices::Generators::FormGenerator
7
+
8
+ destination File.expand_path('../tmp', __dir__)
9
+
10
+ setup do
11
+ prepare_destination
12
+ end
13
+
14
+ test 'generates a base form object' do
15
+ run_generator(%w[TestFormObject Parent --accessors first_name last_name])
16
+ assert_file 'app/forms/parents/test_form_object_form.rb'
17
+ end
18
+
19
+ test 'generates a subfoldered form object' do
20
+ run_generator(%w[TestFormObject Parent --sub_folder Child --accessors first_name last_name])
21
+ assert_file 'app/forms/parents/child/test_form_object_form.rb'
22
+ end
23
+ end
data/test/test_helper.rb CHANGED
@@ -5,6 +5,7 @@ require 'rails/generators'
5
5
  # require 'rails_service_generator'
6
6
  require_relative '../lib/generators/rails_services/destroy_generator'
7
7
  require_relative '../lib/generators/rails_services/create_generator'
8
+ require_relative '../lib/generators/rails_services/form_generator'
8
9
  require 'shellwords'
9
10
  require 'minitest/autorun'
10
11
  require 'minitest/reporters'
metadata CHANGED
@@ -1,31 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_services
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Craig Kaminsky
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-29 00:00:00.000000000 Z
11
+ date: 2021-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '4'
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '4'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: minitest
42
+ name: minitest-reporters
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: minitest-reporters
56
+ name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -66,8 +66,8 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- description: Speed up development when using a Service Layer by easily creating service
70
- classes and their attending test (gem) file.
69
+ description: Speed up development when using Service layers and Form objects by easily
70
+ creating those classes and their attending test file.
71
71
  email:
72
72
  - imageaid@gmail.com
73
73
  executables: []
@@ -80,15 +80,21 @@ files:
80
80
  - lib/generators/rails_services/USAGE
81
81
  - lib/generators/rails_services/create_generator.rb
82
82
  - lib/generators/rails_services/destroy_generator.rb
83
- - lib/generators/rails_services/templates/base_service.rb.erb
83
+ - lib/generators/rails_services/form_generator.rb
84
+ - lib/generators/rails_services/templates/base_form.rb.erb
85
+ - lib/generators/rails_services/templates/base_form_spec.rb.erb
86
+ - lib/generators/rails_services/templates/base_form_unit_test.rb.erb
87
+ - lib/generators/rails_services/templates/base_service_class.rb.erb
84
88
  - lib/generators/rails_services/templates/base_service_new.rb.erb
85
- - lib/generators/rails_services/templates/base_service_old.rb.erb
86
89
  - lib/generators/rails_services/templates/base_service_spec.rb.erb
87
90
  - lib/generators/rails_services/templates/base_service_unit_test.rb.erb
88
91
  - lib/rails_services.rb
92
+ - lib/rails_services/fileable.rb
93
+ - lib/rails_services/nameable.rb
89
94
  - lib/rails_services/version.rb
90
95
  - test/lib/generators/rails_services/create_generator_test.rb
91
96
  - test/lib/generators/rails_services/destroy_generator_test.rb
97
+ - test/lib/generators/rails_services/form_generator_test.rb
92
98
  - test/test_helper.rb
93
99
  homepage: https://github.com/imageaid/rails_service_generator
94
100
  licenses:
@@ -109,12 +115,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
115
  - !ruby/object:Gem::Version
110
116
  version: '0'
111
117
  requirements: []
112
- rubyforge_project:
113
- rubygems_version: 2.5.1
118
+ rubygems_version: 3.1.6
114
119
  signing_key:
115
120
  specification_version: 4
116
- summary: A Ruby gem that adds a rails generator for creating service classes.
121
+ summary: A Ruby gem that adds a rails generator for creating service classes and form
122
+ object.
117
123
  test_files:
118
124
  - test/lib/generators/rails_services/create_generator_test.rb
119
125
  - test/lib/generators/rails_services/destroy_generator_test.rb
126
+ - test/lib/generators/rails_services/form_generator_test.rb
120
127
  - test/test_helper.rb
@@ -1,21 +0,0 @@
1
- <%= "module #{module_name}" %>
2
- <% if subfolder_name.present? %>
3
- <%= "module #{subfolder_name}" %>
4
- <% end %>
5
- <% if subfolder_name.present? %>
6
- <%= "class #{class_name}" %>
7
- <%= "# SAMPLE USAGE: #{qualified_name}.call(*args)" %>
8
- <%= 'def self.call' %>
9
- <%= 'end' %>
10
- <%= 'end' %>
11
- <% else %>
12
- <%= "class #{class_name}" %>
13
- <%= "# SAMPLE USAGE: #{qualified_name}.call(*args)" %>
14
- <%= 'def self.call' %>
15
- <%= 'end' %>
16
- <%= 'end' %>
17
- <% end %>
18
- <% if subfolder_name.present? %>
19
- <%= 'end' %>
20
- <% end %>
21
- <%= 'end' %>