durable_decorator_rails 0.1.1 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 586bc690be14cb2a9a7fb636c8ee6184060c4075
4
- data.tar.gz: 2e07636a2f2ce53f635e09d0ae3740c799ff5c27
3
+ metadata.gz: 36b186cdfc6de77521d61625035d028f63ff1aee
4
+ data.tar.gz: 173de9339c8f7a676ae600e45c205778af3a6a68
5
5
  SHA512:
6
- metadata.gz: 4ed75e77aa972404f78ff35753b506f04dac1449744d1826c929db7240ccb2e9f27a4edfee9a855a6059c93dcc6c67028b828de9993127e5a816582ee9522245
7
- data.tar.gz: ee7828bc97f9407b757d2a1921fde7b5ffc7cd0569afef2665616642da3c6aa8910a2be240031e045cd5cb1782d06fe890b2ef202e2730c3a6fcba84ac49cf77
6
+ metadata.gz: bf7fc9a3712f138bda6cc9b96227b3310ee8e296b0e952bdb233c2e16caa844d804bd1f02e34a27bc883adc30d2dfd4a0a6d331ced0133dbe6e73c31e492f7d4
7
+ data.tar.gz: 792b6f3cbeb9ad34f2cb66107245d28c7bd9f41a67efe9900d480a3490da4613ee20b13b151db1c9065dd5ace49dbd20a76f3f531eb8172b4f23a942f57fd1a8
data/README.md CHANGED
@@ -19,12 +19,12 @@ Or install it yourself as:
19
19
  ## Usage
20
20
  This gem will generate the correct file structure, place (or append to) the correct decorator and even insert the correct seal for you. Use:
21
21
  ```shell
22
- rails g durable_decorator:decorator [SUBDIR] [FULL_METHOD_NAME]
22
+ rails g decorator [FULL_METHOD_NAME]
23
23
  ```
24
24
 
25
25
  For example, let us decorate the an existing ```#deleted?``` instance method from the gem that is namespaced under ```Spree``` in a file that is a *model* called ```Product```. Just run:
26
26
  ```shell
27
- rails g durable_decorator:decorator models Spree::Product#deleted?
27
+ rails g decorator Spree::Product#deleted?
28
28
  ```
29
29
 
30
30
  The gem will create the ```app/models/spree/product_decorator.rb``` file for you to start with, and it will have the following contents:
@@ -2,6 +2,7 @@ require 'durable_decorator'
2
2
  require "durable_decorator_rails/version"
3
3
  require "durable_decorator_rails/railtie"
4
4
  require "durable_decorator_rails/durable_decorator_ext"
5
+ require "durable_decorator_rails/class_type_extractor"
5
6
 
6
7
  module DurableDecoratorRails
7
8
  end
@@ -0,0 +1,49 @@
1
+ module DurableDecoratorRails
2
+ class ClassTypeExtractor
3
+ class << self
4
+ def decorator_path method_name
5
+ type = determine_class_type method_name
6
+
7
+ dir = if type == 'lib'
8
+ type
9
+ else
10
+ "app/#{type}"
11
+ end
12
+
13
+ suffix = namespace method_name
14
+ dir += "/#{suffix}" if suffix
15
+
16
+ dir
17
+ end
18
+
19
+ def determine_class_type method_name
20
+ class_location_directory method_name
21
+ end
22
+
23
+ def class_location_directory method_name
24
+ method_source(method_name).gsub(class_location(method_name), '').split('/').last
25
+ end
26
+
27
+ def method_source name
28
+ DurableDecorator::Base.extract_method(name).source_location[0]
29
+ end
30
+
31
+ def class_name method_name
32
+ method_name.match(receiver_separator)[1]
33
+ end
34
+
35
+ def class_location method_name
36
+ "/#{class_name(method_name).underscore}.rb"
37
+ end
38
+
39
+ def namespace method_name
40
+ namespace = method_name.match(receiver_separator)[1].split('::')[0..-2].join('/').underscore
41
+ namespace.presence
42
+ end
43
+
44
+ def receiver_separator
45
+ /(.*)(\.|#)(.*)/
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,3 +1,3 @@
1
1
  module DurableDecoratorRails
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -0,0 +1,93 @@
1
+ class DecoratorGenerator < Rails::Generators::Base
2
+ source_root File.expand_path('../templates', __FILE__)
3
+ argument :full_method_name, :type => :string
4
+
5
+ def ensure_decorator_existence
6
+ ensure_file
7
+ ensure_method
8
+ end
9
+
10
+ private
11
+
12
+ def filesystem_parts
13
+ full_method_name.split('::')
14
+ end
15
+
16
+ def target
17
+ filesystem_parts.last
18
+ end
19
+
20
+ def parts
21
+ target.match(DurableDecoratorRails::ClassTypeExtractor.receiver_separator)[1..3]
22
+ end
23
+
24
+ def full_class_name
25
+ full_method_name.match(DurableDecoratorRails::ClassTypeExtractor.receiver_separator)[1]
26
+ end
27
+
28
+ def class_name
29
+ parts[0]
30
+ end
31
+
32
+ def method_name
33
+ parts[2]
34
+ end
35
+
36
+ def filename
37
+ "#{class_name.underscore}_decorator.rb"
38
+ end
39
+
40
+ def full_path
41
+ "#{DurableDecoratorRails::ClassTypeExtractor.decorator_path(full_method_name)}/#{filename}"
42
+ end
43
+
44
+ def ensure_file
45
+ template "decorator.rb.erb", full_path unless File.exists?(full_path)
46
+ end
47
+
48
+ def ensure_method
49
+ append_decoration unless method_decorated?
50
+ end
51
+
52
+ def append_decoration
53
+ inject_into_file full_path, after: "class_eval do" do
54
+ redefinition_template
55
+ end
56
+ end
57
+
58
+ def redefinition_template
59
+ " \n\n" +
60
+ redefinition_body +
61
+ " \n"
62
+ end
63
+
64
+ def redefinition_body
65
+ " durably_decorate :#{method_name}, mode: 'strict', sha: '#{existing_sha}' do #{decoration_args}\n" +
66
+ " end"
67
+ end
68
+
69
+ def existing_sha
70
+ DurableDecorator::Base.determine_sha full_method_name
71
+ end
72
+
73
+ def decoration_args
74
+ "|#{minimum_arity.times.map{|n| "arg#{n}"}.join(', ')}|" if minimum_arity > 0
75
+ end
76
+
77
+ def minimum_arity
78
+ arity = DurableDecorator::Base.determine_arity(full_method_name)
79
+ if arity < 0
80
+ (arity+1).abs
81
+ else
82
+ arity
83
+ end
84
+ end
85
+
86
+ def method_decorated?
87
+ existing_contents.match /durably_decorate :#{method_name}/
88
+ end
89
+
90
+ def existing_contents
91
+ File.read(full_path)
92
+ end
93
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+ require 'example/app/models/example_model.rb'
3
+ require 'example/lib/example_lib.rb'
4
+ require 'example/lib/namespaced/and_again/example_lib.rb'
5
+
6
+ describe DurableDecoratorRails::ClassTypeExtractor do
7
+ let(:singleton){ DurableDecoratorRails::ClassTypeExtractor }
8
+
9
+ context 'on .decorator_path' do
10
+ context 'when given the fully qualified method name' do
11
+ it 'returns the correct Rails decorator path' do
12
+ singleton.decorator_path("ExampleModel#methud").should == 'app/models'
13
+ end
14
+ end
15
+
16
+ context 'when given a namespaced file' do
17
+ it 'takes into account the namespace' do
18
+ singleton.decorator_path("Namespaced::AndAgain::ExampleLib.methud").should == 'lib/namespaced/and_again'
19
+ end
20
+ end
21
+ end
22
+
23
+ context 'on .determine_class_type' do
24
+ context 'when given the fully qualified method name' do
25
+ it 'returns the correct Rails class type' do
26
+ singleton.determine_class_type("ExampleModel.methud").should == 'models'
27
+ singleton.determine_class_type("ExampleModel#methud").should == 'models'
28
+ singleton.determine_class_type("ExampleLib#methud").should == 'lib'
29
+ end
30
+ end
31
+
32
+ context 'when given a namespaced file' do
33
+ it 'pulls through' do
34
+ singleton.determine_class_type("Namespaced::AndAgain::ExampleLib.methud").should == 'lib'
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,7 @@
1
+ class ExampleModel
2
+ def methud
3
+ end
4
+
5
+ def self.methud
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ class ExampleLib
2
+ def methud
3
+ end
4
+
5
+ def self.methud
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ module Namespaced
2
+ module AndAgain
3
+ class ExampleLib
4
+ def methud
5
+ end
6
+
7
+ def self.methud
8
+ end
9
+ end
10
+ end
11
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: durable_decorator_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Ivanov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-28 00:00:00.000000000 Z
11
+ date: 2013-09-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: durable_decorator
@@ -97,13 +97,17 @@ files:
97
97
  - Rakefile
98
98
  - durable_decorator_rails.gemspec
99
99
  - lib/durable_decorator_rails.rb
100
+ - lib/durable_decorator_rails/class_type_extractor.rb
100
101
  - lib/durable_decorator_rails/durable_decorator_ext.rb
101
102
  - lib/durable_decorator_rails/railtie.rb
102
103
  - lib/durable_decorator_rails/version.rb
103
- - lib/generators/durable_decorator/decorator/decorator_generator.rb
104
- - lib/generators/durable_decorator/decorator/templates/decorator.rb.erb
104
+ - lib/generators/decorator/decorator_generator.rb
105
+ - lib/generators/decorator/templates/decorator.rb.erb
105
106
  - lib/tasks/durable_decorator_rails.tasks
106
- - spec/durable_decorator_rails_spec.rb
107
+ - spec/class_type_extractor_spec.rb
108
+ - spec/example/app/models/example_model.rb
109
+ - spec/example/lib/example_lib.rb
110
+ - spec/example/lib/namespaced/and_again/example_lib.rb
107
111
  - spec/spec_helper.rb
108
112
  homepage: https://github.com/jumph4x/durable_decorator_rails
109
113
  licenses:
@@ -130,5 +134,8 @@ signing_key:
130
134
  specification_version: 4
131
135
  summary: Rails integration for durable_decorator
132
136
  test_files:
133
- - spec/durable_decorator_rails_spec.rb
137
+ - spec/class_type_extractor_spec.rb
138
+ - spec/example/app/models/example_model.rb
139
+ - spec/example/lib/example_lib.rb
140
+ - spec/example/lib/namespaced/and_again/example_lib.rb
134
141
  - spec/spec_helper.rb
@@ -1,115 +0,0 @@
1
- module DurableDecorator
2
- class DecoratorGenerator < Rails::Generators::Base
3
- source_root File.expand_path('../templates', __FILE__)
4
- argument :subdirectory, :type => :string
5
- argument :full_method_name, :type => :string
6
-
7
- def ensure_decorator_existence
8
- ensure_file
9
- ensure_method
10
- end
11
-
12
- private
13
-
14
- def namespaces
15
- filesystem_parts[0..-2]
16
- end
17
-
18
- def parts
19
- target.match(receiver_separator_regex)[1..3]
20
- end
21
-
22
- def receiver_separator_regex
23
- /(.*)(\.|#)(.*)/
24
- end
25
-
26
- def target
27
- filesystem_parts.last
28
- end
29
-
30
- def class_name
31
- parts[0]
32
- end
33
-
34
- def full_class_name
35
- full_method_name.match(receiver_separator_regex)[1]
36
- end
37
-
38
- def separator
39
- parts[1]
40
- end
41
-
42
- def method_name
43
- parts[2]
44
- end
45
-
46
- def namespace_dirs
47
- namespaces.map(&:underscore)
48
- end
49
-
50
- def filename
51
- "#{class_name.underscore}_decorator.rb"
52
- end
53
-
54
- def filesystem_parts
55
- full_method_name.split('::')
56
- end
57
-
58
- def dir_structure
59
- "app/#{subdirectory}/#{namespace_dirs.join('/')}"
60
- end
61
-
62
- def full_path
63
- "#{dir_structure}/#{filename}"
64
- end
65
-
66
- def ensure_file
67
- template "decorator.rb.erb", full_path unless File.exists?(full_path)
68
- end
69
-
70
- def ensure_method
71
- append_decoration unless method_decorated?
72
- end
73
-
74
- def append_decoration
75
- contents = File.read(full_path).sub("\n", redefinition_template)
76
- File.open(full_path, 'wb') { |file| file.write(contents) }
77
- end
78
-
79
- def redefinition_template
80
- " \n\n" +
81
- redefinition_body +
82
- " \n"
83
- end
84
-
85
- def redefinition_body
86
- " durably_decorate :#{method_name}, mode: 'strict', sha: '#{existing_sha}' do #{decoration_args}\n" +
87
- " end"
88
- end
89
-
90
- def existing_sha
91
- DurableDecorator::Base.determine_sha full_method_name
92
- end
93
-
94
- def decoration_args
95
- "|#{minimum_arity.times.map{|n| "arg#{n}"}.join(', ')}|" if minimum_arity > 0
96
- end
97
-
98
- def minimum_arity
99
- arity = DurableDecorator::Base.determine_arity(full_method_name)
100
- if arity < 0
101
- (arity+1).abs
102
- else
103
- arity
104
- end
105
- end
106
-
107
- def method_decorated?
108
- existing_contents.match /durably_decorate :#{method_name}/
109
- end
110
-
111
- def existing_contents
112
- File.read(full_path)
113
- end
114
- end
115
- end
@@ -1,11 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe DurableDecoratorRails do
4
- it 'should have a version number' do
5
- DurableDecoratorRails::VERSION.should_not be_nil
6
- end
7
-
8
- it 'should do something useful' do
9
- false.should be_true
10
- end
11
- end