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 +5 -5
- data/CHANGELOG.md +21 -0
- data/README.md +56 -29
- data/lib/generators/rails_services/USAGE +15 -9
- data/lib/generators/rails_services/create_generator.rb +21 -52
- data/lib/generators/rails_services/destroy_generator.rb +23 -21
- data/lib/generators/rails_services/form_generator.rb +36 -0
- data/lib/generators/rails_services/templates/base_form.rb.erb +30 -0
- data/lib/generators/rails_services/templates/base_form_spec.rb.erb +7 -0
- data/lib/generators/rails_services/templates/base_form_unit_test.rb.erb +7 -0
- data/lib/generators/rails_services/templates/{base_service.rb.erb → base_service_class.rb.erb} +1 -2
- data/lib/generators/rails_services/templates/base_service_new.rb.erb +22 -17
- data/lib/generators/rails_services/templates/base_service_spec.rb.erb +1 -1
- data/lib/generators/rails_services/templates/base_service_unit_test.rb.erb +1 -1
- data/lib/rails_services/fileable.rb +37 -0
- data/lib/rails_services/nameable.rb +28 -0
- data/lib/rails_services/version.rb +1 -1
- data/test/lib/generators/rails_services/create_generator_test.rb +6 -10
- data/test/lib/generators/rails_services/destroy_generator_test.rb +5 -4
- data/test/lib/generators/rails_services/form_generator_test.rb +23 -0
- data/test/test_helper.rb +1 -0
- metadata +23 -16
- data/lib/generators/rails_services/templates/base_service_old.rb.erb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a03e068552adcb9e44d914b7387aee0823352a97344f5fedd2235769c9422d60
|
4
|
+
data.tar.gz: f4497409f14385d5dc43a31838aebbb634c545dcc4a1e9b589b76269e84b0219
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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
|
27
|
+
$ [bundle exec] rails generate rails_services:create Service ParentFolder --sub_folder SubFolder [opt]
|
32
28
|
|
33
|
-
$ rails generate rails_services:destroy Service
|
29
|
+
$ [bundle exec] rails generate rails_services:destroy Service ParentFolder --sub_folder SubFolder [opt]
|
34
30
|
|
35
|
-
|
36
|
-
|
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
|
-
|
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
|
-
|
44
|
-
|
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
|
-
|
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
|
-
|
53
|
-
|
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 ...
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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:
|
6
|
+
Service Example:
|
7
|
+
rails generate rails_services:create Thing Model|Controller -- sub_folder Sub-folder [opt]]
|
7
8
|
|
8
|
-
This will
|
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:
|
16
|
+
rails generate rails_services:destroy Thing Model|Controller -- sub_folder Sub-folder [opt]]
|
16
17
|
|
17
|
-
This will
|
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
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
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('
|
5
|
-
|
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
|
-
|
8
|
-
|
16
|
+
|
17
|
+
class_option :sub_folder, type: :string, default: ''
|
9
18
|
|
10
19
|
def create_service
|
11
|
-
|
12
|
-
|
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('
|
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.
|
27
|
-
template 'base_service_spec.rb.erb', "spec/services/#{
|
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/#{
|
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
|
-
|
9
|
+
include Nameable
|
10
|
+
include Fileable
|
11
|
+
|
12
|
+
argument :object_name, type: :string
|
5
13
|
argument :parent_name, type: :string
|
6
|
-
|
14
|
+
|
15
|
+
class_option :sub_folder, type: :string, default: ''
|
7
16
|
|
8
17
|
def destroy_service
|
9
|
-
remove_file "app/services/#{
|
10
|
-
remove_file "spec/services/#{
|
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
|
-
|
17
|
-
|
18
|
-
file_path
|
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
|
-
|
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/#{
|
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/#{
|
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' %>
|
data/lib/generators/rails_services/templates/{base_service.rb.erb → base_service_class.rb.erb}
RENAMED
@@ -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
|
-
|
5
|
-
|
6
|
-
<%= "class #{
|
5
|
+
<%= '##' %>
|
6
|
+
<%= "# #{qualified_name} Service Class" %>
|
7
|
+
<%= "class #{service_class_name}" %>
|
7
8
|
<%= 'include BaseService' %>
|
8
|
-
|
9
|
-
<%=
|
10
|
-
<%= 'end' %>
|
11
|
-
|
12
|
-
|
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
|
-
<%
|
20
|
-
|
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' %>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<%= "require 'test_helper'" %>
|
2
2
|
|
3
|
-
<%= "class #{
|
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,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('
|
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
|
13
|
-
run_generator(%w
|
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('
|
8
|
+
destination File.expand_path('../tmp', __dir__)
|
7
9
|
|
8
10
|
setup do
|
9
11
|
prepare_destination
|
10
|
-
run_generator(%w
|
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:
|
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:
|
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: '
|
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: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
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:
|
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
|
70
|
-
classes and their attending test
|
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/
|
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
|
-
|
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' %>
|