decent_exposure 2.1.0 → 2.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 +7 -0
- data/README.md +3 -1
- data/lib/decent_exposure/active_record_strategy.rb +13 -2
- data/lib/decent_exposure/active_record_with_eager_attributes_strategy.rb +1 -1
- data/lib/decent_exposure/constant_resolver.rb +32 -0
- data/lib/decent_exposure/exposure.rb +3 -3
- data/lib/decent_exposure/inflector.rb +14 -46
- data/lib/decent_exposure/strategizer.rb +1 -1
- data/lib/decent_exposure/strategy.rb +18 -8
- data/lib/decent_exposure/version.rb +1 -1
- metadata +25 -34
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bb111212d14e0e4556fa3b3503a1a93ba68ea723
|
4
|
+
data.tar.gz: d8f9aa40d3934c500b367016efb5f86b8e98a0a8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e5ccc36891dc074355e8d7c01e0fe0c1ff2e244371ba60dc2d8076095158cd32a64679a58b3291989c458c9f9a2162fbd61dac616b916cf0752c42a94b36112a
|
7
|
+
data.tar.gz: e0a369915128c353be4d1671f711a4aaffec0330d81cdef76da77dd62356f982e422cf9cbe05363465224490ffcb8acfdc92f43fad06615267a7f56894450282
|
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
[](http://badge.fury.io/rb/decent_exposure) [](https://travis-ci.org/voxdolo/decent_exposure) [](https://codeclimate.com/github/voxdolo/decent_exposure)
|
2
|
+
|
1
3
|
## Mad Decent
|
2
4
|
|
3
5
|
Rails controllers are the sweaty armpit of every rails app. This is due, in
|
@@ -76,7 +78,7 @@ handling all that repetitive initialization, as we'll see next.
|
|
76
78
|
|
77
79
|
Even if you decide not to use `decent_exposure`, do yourself a favor and stop
|
78
80
|
using instance variables in your views. Your code will be cleaner and easier to
|
79
|
-
refactor as a result. If you want to learn more about
|
81
|
+
refactor as a result. If you want to learn more about this approach, I've
|
80
82
|
expanded on my thoughts in the article [A Diatribe on Maintaining State][1].
|
81
83
|
|
82
84
|
## Environmental Awareness
|
@@ -10,7 +10,7 @@ module DecentExposure
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def scope
|
13
|
-
if options[:ancestor]
|
13
|
+
@scope ||= if options[:ancestor]
|
14
14
|
ancestor_scope
|
15
15
|
else
|
16
16
|
default_scope
|
@@ -38,7 +38,8 @@ module DecentExposure
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def collection_resource
|
41
|
-
scope.
|
41
|
+
return scope if scope.respond_to?(:each)
|
42
|
+
scope.send(scope_method)
|
42
43
|
end
|
43
44
|
|
44
45
|
def id
|
@@ -64,5 +65,15 @@ module DecentExposure
|
|
64
65
|
singular_resource
|
65
66
|
end
|
66
67
|
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def scope_method
|
72
|
+
if defined?(ActiveRecord) && ActiveRecord::VERSION::MAJOR > 3
|
73
|
+
:all
|
74
|
+
else
|
75
|
+
:scoped
|
76
|
+
end
|
77
|
+
end
|
67
78
|
end
|
68
79
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'active_support/inflector'
|
2
|
+
require 'active_support/core_ext/string'
|
3
|
+
|
4
|
+
module DecentExposure
|
5
|
+
class ConstantResolver
|
6
|
+
attr_reader :context, :constant_name
|
7
|
+
def initialize(constant_name, context=Object)
|
8
|
+
@context, @constant_name = context, constant_name.classify
|
9
|
+
end
|
10
|
+
|
11
|
+
def constant
|
12
|
+
immediate_child || namespace_qualified
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def immediate_child
|
18
|
+
context.constants.map do |c|
|
19
|
+
context.const_get(c) if c.to_s == constant_name
|
20
|
+
end.compact.first
|
21
|
+
end
|
22
|
+
|
23
|
+
def namespace_qualified
|
24
|
+
namespace.const_get(constant_name)
|
25
|
+
end
|
26
|
+
|
27
|
+
def namespace
|
28
|
+
path = context.to_s
|
29
|
+
path[0...(path.rindex('::') || 0)].constantize
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -2,16 +2,16 @@ require 'decent_exposure/inflector'
|
|
2
2
|
|
3
3
|
module DecentExposure
|
4
4
|
class Exposure
|
5
|
-
attr_accessor :
|
5
|
+
attr_accessor :name, :strategy, :options
|
6
6
|
|
7
7
|
def initialize(name, strategy, options)
|
8
|
+
self.name = name.to_s
|
8
9
|
self.strategy = strategy
|
9
10
|
self.options = options
|
10
|
-
self.inflector = DecentExposure::Inflector.new(name, options[:model])
|
11
11
|
end
|
12
12
|
|
13
13
|
def call(controller)
|
14
|
-
strategy.new(controller,
|
14
|
+
strategy.new(controller, name, options).resource
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -1,38 +1,32 @@
|
|
1
1
|
require 'active_support/inflector'
|
2
2
|
require 'active_support/core_ext/string'
|
3
|
+
require 'active_model/naming'
|
3
4
|
|
4
5
|
module DecentExposure
|
5
6
|
class Inflector
|
6
|
-
attr_reader :
|
7
|
-
alias name string
|
7
|
+
attr_reader :original, :model
|
8
8
|
|
9
|
-
def initialize(name, model
|
9
|
+
def initialize(name, model)
|
10
10
|
@original = name.to_s
|
11
11
|
@model = model
|
12
|
-
@string = (model || name).to_s.demodulize
|
13
12
|
end
|
14
13
|
|
15
|
-
|
16
|
-
case model
|
17
|
-
when Module, Class
|
18
|
-
model
|
19
|
-
else
|
20
|
-
ConstantResolver.new(context, string.classify).constant
|
21
|
-
end
|
22
|
-
end
|
14
|
+
alias name original
|
23
15
|
|
24
|
-
def
|
25
|
-
|
16
|
+
def model_name
|
17
|
+
@model_name ||= if model.respond_to?(:model_name)
|
18
|
+
model.model_name
|
19
|
+
else
|
20
|
+
ActiveModel::Name.new(model)
|
21
|
+
end
|
26
22
|
end
|
27
23
|
|
28
|
-
|
29
|
-
|
30
|
-
end
|
24
|
+
delegate :singular, :plural, :param_key, :to => :model_name
|
25
|
+
alias collection plural
|
31
26
|
|
32
|
-
def
|
33
|
-
|
27
|
+
def parameter
|
28
|
+
"#{model_name.singular}_id"
|
34
29
|
end
|
35
|
-
alias collection plural
|
36
30
|
|
37
31
|
def plural?
|
38
32
|
original.pluralize == original && !uncountable?
|
@@ -41,31 +35,5 @@ module DecentExposure
|
|
41
35
|
def uncountable?
|
42
36
|
original.pluralize == original.singularize
|
43
37
|
end
|
44
|
-
|
45
|
-
private
|
46
|
-
|
47
|
-
ConstantResolver = Struct.new :context, :constant_name do
|
48
|
-
|
49
|
-
def constant
|
50
|
-
immediate_child || namespace_qualified
|
51
|
-
end
|
52
|
-
|
53
|
-
private
|
54
|
-
|
55
|
-
def immediate_child
|
56
|
-
context.constants.map do |c|
|
57
|
-
context.const_get(c) if c.to_s == constant_name
|
58
|
-
end.compact.first
|
59
|
-
end
|
60
|
-
|
61
|
-
def namespace_qualified
|
62
|
-
namespace.const_get(constant_name)
|
63
|
-
end
|
64
|
-
|
65
|
-
def namespace
|
66
|
-
path = context.to_s
|
67
|
-
path[0...(path.rindex('::') || 0)].constantize
|
68
|
-
end
|
69
|
-
end
|
70
38
|
end
|
71
39
|
end
|
@@ -1,13 +1,13 @@
|
|
1
|
+
require 'decent_exposure/inflector'
|
2
|
+
require 'decent_exposure/constant_resolver'
|
3
|
+
|
1
4
|
module DecentExposure
|
2
5
|
class Strategy
|
3
|
-
attr_reader :controller, :
|
4
|
-
|
5
|
-
def initialize(controller, inflector, options={})
|
6
|
-
@controller, @inflector, @options = controller, inflector, options
|
7
|
-
end
|
6
|
+
attr_reader :controller, :name, :options
|
7
|
+
attr_writer :model, :inflector
|
8
8
|
|
9
|
-
def name
|
10
|
-
|
9
|
+
def initialize(controller, name, options={})
|
10
|
+
@controller, @name, @options = controller, name.to_s, options
|
11
11
|
end
|
12
12
|
|
13
13
|
def resource
|
@@ -16,8 +16,18 @@ module DecentExposure
|
|
16
16
|
|
17
17
|
protected
|
18
18
|
|
19
|
+
def inflector
|
20
|
+
@inflector ||= DecentExposure::Inflector.new(name, model)
|
21
|
+
end
|
22
|
+
|
19
23
|
def model
|
20
|
-
|
24
|
+
@model ||= case options[:model]
|
25
|
+
when Class, Module
|
26
|
+
options[:model]
|
27
|
+
else
|
28
|
+
name_or_model = options[:model] || name
|
29
|
+
DecentExposure::ConstantResolver.new(name_or_model.to_s, controller.class).constant
|
30
|
+
end
|
21
31
|
end
|
22
32
|
|
23
33
|
def params
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: decent_exposure
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 2.1.0
|
4
|
+
version: 2.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Stephen Caudill
|
@@ -11,73 +10,65 @@ authors:
|
|
11
10
|
autorequire:
|
12
11
|
bindir: bin
|
13
12
|
cert_chain: []
|
14
|
-
date: 2013-
|
13
|
+
date: 2013-05-24 00:00:00.000000000 Z
|
15
14
|
dependencies:
|
16
15
|
- !ruby/object:Gem::Dependency
|
17
|
-
|
16
|
+
name: rspec
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: '2.11'
|
22
|
-
none: false
|
23
|
-
name: rspec
|
24
22
|
type: :development
|
25
23
|
prerelease: false
|
26
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
25
|
requirements:
|
28
26
|
- - ~>
|
29
27
|
- !ruby/object:Gem::Version
|
30
28
|
version: '2.11'
|
31
|
-
none: false
|
32
29
|
- !ruby/object:Gem::Dependency
|
33
|
-
|
30
|
+
name: rspec-rails
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
34
32
|
requirements:
|
35
33
|
- - ~>
|
36
34
|
- !ruby/object:Gem::Version
|
37
35
|
version: '2.11'
|
38
|
-
none: false
|
39
|
-
name: rspec-rails
|
40
36
|
type: :development
|
41
37
|
prerelease: false
|
42
|
-
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
39
|
requirements:
|
44
40
|
- - ~>
|
45
41
|
- !ruby/object:Gem::Version
|
46
42
|
version: '2.11'
|
47
|
-
none: false
|
48
43
|
- !ruby/object:Gem::Dependency
|
49
|
-
|
44
|
+
name: actionpack
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
50
46
|
requirements:
|
51
|
-
- -
|
47
|
+
- - '>='
|
52
48
|
- !ruby/object:Gem::Version
|
53
49
|
version: 3.1.0
|
54
|
-
none: false
|
55
|
-
name: actionpack
|
56
50
|
type: :development
|
57
51
|
prerelease: false
|
58
|
-
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
53
|
requirements:
|
60
|
-
- -
|
54
|
+
- - '>='
|
61
55
|
- !ruby/object:Gem::Version
|
62
56
|
version: 3.1.0
|
63
|
-
none: false
|
64
57
|
- !ruby/object:Gem::Dependency
|
65
|
-
|
58
|
+
name: activesupport
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
66
60
|
requirements:
|
67
|
-
- -
|
61
|
+
- - '>='
|
68
62
|
- !ruby/object:Gem::Version
|
69
63
|
version: 3.1.0
|
70
|
-
none: false
|
71
|
-
name: activesupport
|
72
64
|
type: :development
|
73
65
|
prerelease: false
|
74
|
-
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
75
67
|
requirements:
|
76
|
-
- -
|
68
|
+
- - '>='
|
77
69
|
- !ruby/object:Gem::Version
|
78
70
|
version: 3.1.0
|
79
|
-
|
80
|
-
description: ! "\n DecentExposure helps you program to an interface, rather than
|
71
|
+
description: "\n DecentExposure helps you program to an interface, rather than
|
81
72
|
an\n implementation in your Rails controllers. The fact of the matter is that\n
|
82
73
|
\ sharing state via instance variables in controllers promotes close coupling\n
|
83
74
|
\ with views. DecentExposure gives you a declarative manner of exposing an\n
|
@@ -91,6 +82,7 @@ files:
|
|
91
82
|
- lib/decent_exposure/active_record_strategy.rb
|
92
83
|
- lib/decent_exposure/active_record_with_eager_attributes_strategy.rb
|
93
84
|
- lib/decent_exposure/configuration.rb
|
85
|
+
- lib/decent_exposure/constant_resolver.rb
|
94
86
|
- lib/decent_exposure/expose.rb
|
95
87
|
- lib/decent_exposure/exposure.rb
|
96
88
|
- lib/decent_exposure/inflector.rb
|
@@ -102,6 +94,7 @@ files:
|
|
102
94
|
- README.md
|
103
95
|
homepage: http://github.com/voxdolo/decent_exposure
|
104
96
|
licenses: []
|
97
|
+
metadata: {}
|
105
98
|
post_install_message:
|
106
99
|
rdoc_options:
|
107
100
|
- --charset=UTF-8
|
@@ -109,20 +102,18 @@ require_paths:
|
|
109
102
|
- lib
|
110
103
|
required_ruby_version: !ruby/object:Gem::Requirement
|
111
104
|
requirements:
|
112
|
-
- -
|
105
|
+
- - '>='
|
113
106
|
- !ruby/object:Gem::Version
|
114
107
|
version: '0'
|
115
|
-
none: false
|
116
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
109
|
requirements:
|
118
|
-
- -
|
110
|
+
- - '>='
|
119
111
|
- !ruby/object:Gem::Version
|
120
112
|
version: 1.3.6
|
121
|
-
none: false
|
122
113
|
requirements: []
|
123
114
|
rubyforge_project:
|
124
|
-
rubygems_version:
|
115
|
+
rubygems_version: 2.0.0
|
125
116
|
signing_key:
|
126
|
-
specification_version:
|
117
|
+
specification_version: 4
|
127
118
|
summary: A helper for creating declarative interfaces in controllers
|
128
119
|
test_files: []
|