adequate_exposure 0.4.1 → 0.5.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: 2550e167e6ed3284a239f703242d97e1ca110559
4
- data.tar.gz: 5a3404cfb7a7914ce36c4b8c005cb488b4f4b663
3
+ metadata.gz: b45371ec2f76686959ecea9daafa48bfdcbff365
4
+ data.tar.gz: 7b9d2f20e7b8817d26aa546cfa540f40cc9bd9e0
5
5
  SHA512:
6
- metadata.gz: d5a89302e07b4663297cdc26f352384b28020428daa32727be6bf6b2e69046a0469f452600b7f571a07b5ac19dac7553deb695f2cfbaf20a2fa8e652cc862c6e
7
- data.tar.gz: 2d10aed16e6a24554a01642058c1715986c654a2089815ba8fea1e42d69d57a2752cb9f3f9f66d4af8283c58df8e6ae7ae3ae8af8780070eaac371ad70698f04
6
+ metadata.gz: 7b5a55b1ed6f423981c3a8763da33f5b753f463ef1f95e0c3057f01b72fc77b1a5cd0b9b8c501c28c8ab9279b77df637bf9ecaf6e01676b18e8716063cf4d9b6
7
+ data.tar.gz: 94fc24e721c06a468fec3a88371b625d7ea7325b7f4c3ea3892bea709b92098ffb8432754a07f9c39f5fcad97610cfce0760976b45e06ccc2db8a5607ee7a99d
data/.gitignore CHANGED
@@ -14,9 +14,11 @@ rdoc
14
14
  spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
+ vendor/bundle
17
18
  tmp
18
19
  *.bundle
19
20
  *.so
20
21
  *.o
21
22
  *.a
22
23
  mkmf.log
24
+ gemfiles/*.lock
@@ -1,3 +1,21 @@
1
+ before_install:
2
+ - gem install bundler
3
+
4
+ gemfile:
5
+ - gemfiles/rails_4.0.gemfile
6
+ - gemfiles/rails_4.1.gemfile
7
+ - gemfiles/rails_4.2.gemfile
8
+ - gemfiles/rails_5.0.gemfile
9
+
1
10
  rvm:
2
11
  - 2.0
3
12
  - 2.1
13
+ - 2.2
14
+ - 2.3
15
+
16
+ matrix:
17
+ exclude:
18
+ - rvm: 2.0
19
+ gemfile: gemfiles/rails_5.0.gemfile
20
+ - rvm: 2.1
21
+ gemfile: gemfiles/rails_5.0.gemfile
@@ -0,0 +1,20 @@
1
+ appraise "rails-5.0" do
2
+ gem "railties", "~> 5.0.0"
3
+ gem "activesupport", "~> 5.0.0"
4
+ end
5
+
6
+ appraise "rails-4.2" do
7
+ gem "railties", "~> 4.2.0"
8
+ gem "activesupport", "~> 4.2.0"
9
+ end
10
+
11
+ appraise "rails-4.1" do
12
+ gem "railties", "~> 4.1.0"
13
+ gem "activesupport", "~> 4.1.0"
14
+ end
15
+
16
+ appraise "rails-4.0" do
17
+ gem "railties", "~> 4.0.0"
18
+ gem "activesupport", "~> 4.0.0"
19
+ end
20
+
data/Gemfile CHANGED
@@ -2,6 +2,7 @@ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
- gem "rspec-rails", "~> 3.0"
5
+ gem "appraisal", "~> 2.1"
6
+ gem "pry", "~> 0.10"
6
7
  gem "rake", "~> 10.3"
7
- gem "pry"
8
+ gem "rspec-rails", "~> 3.4"
data/Rakefile CHANGED
@@ -1,6 +1,9 @@
1
1
  require "bundler/gem_tasks"
2
+ require "bundler/setup"
2
3
  require "rspec/core/rake_task"
4
+ require "appraisal/task"
3
5
 
6
+ Appraisal::Task.new
4
7
  RSpec::Core::RakeTask.new
5
8
 
6
9
  task default: :spec
@@ -14,6 +14,6 @@ Gem::Specification.new do |spec|
14
14
 
15
15
  spec.required_ruby_version = "~> 2.0"
16
16
 
17
- spec.add_dependency "railties", "~> 4.0"
18
- spec.add_dependency "activesupport", "~> 4.0"
17
+ spec.add_dependency "railties", ">= 4.0", "< 6"
18
+ spec.add_dependency "activesupport", ">= 4.0", "< 6"
19
19
  end
@@ -0,0 +1,12 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal", "~> 2.1"
6
+ gem "pry", "~> 0.10"
7
+ gem "rake", "~> 10.3"
8
+ gem "rspec-rails", "~> 3.4"
9
+ gem "railties", "~> 4.0.0"
10
+ gem "activesupport", "~> 4.0.0"
11
+
12
+ gemspec :path => "../"
@@ -0,0 +1,12 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal", "~> 2.1"
6
+ gem "pry", "~> 0.10"
7
+ gem "rake", "~> 10.3"
8
+ gem "rspec-rails", "~> 3.4"
9
+ gem "railties", "~> 4.1.0"
10
+ gem "activesupport", "~> 4.1.0"
11
+
12
+ gemspec :path => "../"
@@ -0,0 +1,12 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal", "~> 2.1"
6
+ gem "pry", "~> 0.10"
7
+ gem "rake", "~> 10.3"
8
+ gem "rspec-rails", "~> 3.4"
9
+ gem "railties", "~> 4.2.0"
10
+ gem "activesupport", "~> 4.2.0"
11
+
12
+ gemspec :path => "../"
@@ -0,0 +1,12 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "appraisal", "~> 2.1"
6
+ gem "pry", "~> 0.10"
7
+ gem "rake", "~> 10.3"
8
+ gem "rspec-rails", "~> 3.4"
9
+ gem "railties", "~> 5.0.0"
10
+ gem "activesupport", "~> 5.0.0"
11
+
12
+ gemspec :path => "../"
@@ -2,20 +2,42 @@ module AdequateExposure
2
2
  class Attribute
3
3
  attr_reader :name, :fetch, :ivar_name
4
4
 
5
+ # Public: Initialize an Attribute
6
+ #
7
+ # options - Hash of options for the Attribute
8
+ # :name - The String name of the Attribute instance
9
+ # :fetch - The Proc fetch to calculate
10
+ # the value of the Attribute instance.
11
+ # This is only called if the attribute's
12
+ # instance variable is not defined.
13
+ # :ivar_name - The String instance variable name that
14
+ # is associated with the attribute.
5
15
  def initialize(options)
6
16
  @name = options.fetch(:name)
7
17
  @fetch = options.fetch(:fetch)
8
18
  @ivar_name = options.fetch(:ivar_name)
9
19
  end
10
20
 
21
+ # Public: The getter method for the Attribute.
22
+ #
23
+ # Returns the name of the Attribute as a Symbol.
11
24
  def getter_method_name
12
25
  name.to_sym
13
26
  end
14
27
 
28
+ # Public: The setter method for the Attribute.
29
+ #
30
+ # Returns the name of the attribute as a Symbol with an appended '='.
15
31
  def setter_method_name
16
32
  "#{name}=".to_sym
17
33
  end
18
34
 
35
+
36
+ # Public: Expose a getter and setter method for the Attribute
37
+ # on the passed in Controller class.
38
+ #
39
+ # klass - The Controller class where the Attribute getter and setter
40
+ # methods will be exposed.
19
41
  def expose!(klass)
20
42
  attribute = self
21
43
 
@@ -1,10 +1,20 @@
1
1
  module AdequateExposure
2
2
  module Behavior
3
+ # Public: Fetches a scope.
4
+ #
5
+ # Finds an object. If it isn't found, the object gets instantiated.
6
+ #
7
+ # Returns the decorated object.
3
8
  def fetch
4
9
  instance = id ? find(id, computed_scope) : build(build_params, computed_scope)
5
10
  decorate(instance)
6
11
  end
7
12
 
13
+ # Public: Checks a params hash for an id attribute.
14
+ #
15
+ # Checks a hash of parameters for keys that represent an object's id.
16
+ #
17
+ # Returns the value of the id parameter, if it exists. Otherwise nil.
8
18
  def id
9
19
  params_id_key_candidates.each do |key|
10
20
  value = params[key]
@@ -14,26 +24,57 @@ module AdequateExposure
14
24
  nil
15
25
  end
16
26
 
27
+ # Public: An object query. Essentially, this method is designed to be
28
+ # overridden.
29
+ #
30
+ # model - The Class to be scoped or queried.
31
+ #
32
+ # Returns the object scope.
17
33
  def scope(model)
18
34
  model
19
35
  end
20
36
 
37
+ # Public: Converts a name into a standard Class name.
38
+ #
39
+ # Examples
40
+ # 'egg_and_hams'.model # => EggAndHam
41
+ #
42
+ # Returns a standard Class name.
21
43
  def model
22
44
  name.to_s.classify.constantize
23
45
  end
24
46
 
47
+ # Public: Find an object on the supplied scope.
48
+ #
49
+ # id - The Integer id attribute of the desired object
50
+ # scope - The collection that will be searched.
51
+ #
52
+ # Returns the found object.
25
53
  def find(id, scope)
26
54
  scope.find(id)
27
55
  end
28
56
 
57
+ # Public: Builds a new object on the passed-in scope.
58
+ #
59
+ # params - A Hash of attributes for the object to-be built.
60
+ # scope - The collection that will be searched.
61
+ #
62
+ # Returns the new object.
29
63
  def build(params, scope)
30
64
  scope.new(params)
31
65
  end
32
66
 
67
+ # Public: Returns a decorated object. This method is designed to be
68
+ # overridden.
69
+ #
70
+ # Returns the decorated object.
33
71
  def decorate(instance)
34
72
  instance
35
73
  end
36
74
 
75
+ # Public: Get all the parameters of the current request.
76
+ #
77
+ # Returns the controller's parameters for the current request.
37
78
  def build_params
38
79
  if controller.respond_to?(params_method_name, true) && !get_request?
39
80
  controller.send(params_method_name)
@@ -45,7 +86,7 @@ module AdequateExposure
45
86
  protected
46
87
 
47
88
  def params_id_key_candidates
48
- [ "#{model.name.underscore}_id", "#{name}_id", "id" ].uniq
89
+ [ "#{model_param_key}_id", "#{name}_id", "id" ].uniq
49
90
  end
50
91
 
51
92
  def model_param_key
@@ -2,14 +2,33 @@ module AdequateExposure
2
2
  class Context
3
3
  attr_reader :context, :attribute
4
4
 
5
+ # Public: Initialize a context.
6
+ #
7
+ # context - The Class where the attribute is defined.
8
+ # attribute - The attribute that will be accessed by a getter
9
+ # and setter.
5
10
  def initialize(context, attribute)
6
11
  @context, @attribute = context, attribute
7
12
  end
8
13
 
14
+ # Public: Read an attribute on the context Class.
15
+ #
16
+ # Get an attribute's value. If the attribute's instance
17
+ # variable is not defined, it will create one,
18
+ # execute attribute#fetch, and assign the result
19
+ # to the instance variable.
20
+ #
21
+ # Returns the attribute's value.
9
22
  def get
10
23
  ivar_defined?? ivar_get : set(fetch_value)
11
24
  end
12
25
 
26
+ # Public: Write to an attribute on the context Class.
27
+ #
28
+ # value - The value that will be set to the attribute's
29
+ # instance variable.
30
+ #
31
+ # Returns the attribute's value.
13
32
  def set(value)
14
33
  ivar_set(value)
15
34
  end
@@ -8,15 +8,42 @@ module AdequateExposure
8
8
  end
9
9
 
10
10
  module ClassMethods
11
+ # Public: Exposes an attribute to a controller Class.
12
+ #
13
+ # *args - An Array of attributes for the new exposure. See
14
+ # Exposure#initialize for attribute details.
15
+ # block - If supplied, the exposed attribute method executes
16
+ # the Proc when accessed.
17
+ #
18
+ # Returns the helper methods that are now defined on the class
19
+ # where this method is included.
11
20
  def expose(*args, &block)
12
21
  Exposure.expose! self, *args, &block
13
22
  end
14
23
 
24
+ # Public: Exposes an attribute to a controller Class.
25
+ # The exposed methods are then set to a before_action
26
+ # callback.
27
+ #
28
+ # name - The String name of the Exposure instance.
29
+ # *args - An Array of attributes for the new exposure. See
30
+ # Exposure#initialize for attribute details.
31
+ # block - If supplied, the exposed attribute method executes
32
+ # the Proc when accessed.
33
+ #
34
+ # Sets the exposed attribute to a before_action callback in the
35
+ # controller.
15
36
  def expose!(name, *args, &block)
16
37
  expose name, *args, &block
17
38
  before_action name
18
39
  end
19
40
 
41
+ # Public: Configures an Exposure instance for a controller Class.
42
+ #
43
+ # name - The String name of the Exposure instance.
44
+ # options - The Hash of options to configure the Exposure instance.
45
+ #
46
+ # Returns the exposure configuration Hash.
20
47
  def exposure_config(name, options)
21
48
  store = self.exposure_configuration ||= {}
22
49
  self.exposure_configuration = store.merge(name => options)
@@ -2,10 +2,38 @@ module AdequateExposure
2
2
  class Exposure
3
3
  attr_reader :controller, :options
4
4
 
5
+ # Public: Initializes an Exposure and makes it accessible to a controller.
6
+ # For each Exposure, a getter and setter is defined.
7
+ # Those getters and setters are made available to
8
+ # the controller as helper methods.
9
+ #
10
+ # *args - An Array of all parameters for the new Exposure. See
11
+ # #initialize.
12
+ # block - If supplied, the exposed attribute method executes
13
+ # the Proc when called.
14
+ #
15
+ # Returns a collection of exposed helper methods.
5
16
  def self.expose!(*args, &block)
6
17
  new(*args, &block).expose!
7
18
  end
8
19
 
20
+ # Public: Initalize an Exposure with a hash of options.
21
+ #
22
+ # If a block is given, the Proc is assigned to value
23
+ # of options[name].
24
+ #
25
+ # The `asserts_*` section raise errors if the controller
26
+ # was initialized with an unacceptable options Hash.
27
+ #
28
+ # controller - The Controller class where methods will be exposed.
29
+ # name - The String name of the Exposure instance.
30
+ # fetch_block - Proc that will be executed if the exposed
31
+ # attribute has no value (default: nil).
32
+ # options - Hash of options for the Behavior of the exposed methods.
33
+ # block - If supplied, the exposed attribute method executes
34
+ # the Proc.
35
+ #
36
+ # Returns a normalized options Hash.
9
37
  def initialize(controller, name, fetch_block=nil, **options, &block)
10
38
  @controller = controller
11
39
  @options = options.with_indifferent_access.merge(name: name)
@@ -22,6 +50,11 @@ module AdequateExposure
22
50
  normalize_options
23
51
  end
24
52
 
53
+ # Public: Creates a getter and setter methods for the attribute.
54
+ # Those methods are made avaiable to the controller as
55
+ # helper methods.
56
+ #
57
+ # Returns a collection of exposed helper methods.
25
58
  def expose!
26
59
  expose_attribute!
27
60
  expose_helper_methods!
@@ -2,12 +2,24 @@ module AdequateExposure
2
2
  class Flow
3
3
  attr_reader :controller, :options, :name
4
4
 
5
+ # Public: Initialize a Flow. This object responds to missing
6
+ # methods errors and attempts to delegate them to other objects.
7
+ #
8
+ # controller - The Controller class where the method was called.
9
+ # options - The options Hash of the Exposure instance being called.
10
+ # name - The String name of the Exposure instance.
5
11
  def initialize(controller, options)
6
12
  @controller = controller
7
13
  @options = options
8
14
  @name = options.fetch(:name)
9
15
  end
10
16
 
17
+ # Public: Attempts to re-delegate a method missing to the
18
+ # supplied block or the Behavior object.
19
+ #
20
+ # name - The String name of the Exposure instance.
21
+ # *args - The arguments given for the missing method.
22
+ # block - The Proc invoked by the method.
11
23
  def method_missing(name, *args, &block)
12
24
  if respond_to_missing?(name)
13
25
  handle_flow_method(name, *args, &block)
@@ -16,6 +28,11 @@ module AdequateExposure
16
28
  end
17
29
  end
18
30
 
31
+ # Public: Checks if the Behavior class can handle the missing method.
32
+ #
33
+ # method_name - The name of method that has been called.
34
+ # include_private - Prevents this method from catching calls to private
35
+ # method (default: false).
19
36
  def respond_to_missing?(method_name, include_private = false)
20
37
  Behavior.method_defined?(method_name) || super
21
38
  end
@@ -1,3 +1,3 @@
1
1
  module AdequateExposure
2
- VERSION = "0.4.1"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -32,7 +32,7 @@ class BirdsController < ApplicationController
32
32
  expose :bird
33
33
 
34
34
  def show
35
- render nothing: true
35
+ head :ok
36
36
  end
37
37
  end
38
38
 
metadata CHANGED
@@ -1,43 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adequate_exposure
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Pravosud
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-23 00:00:00.000000000 Z
11
+ date: 2016-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '4.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '6'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: '4.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '6'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: activesupport
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - "~>"
37
+ - - ">="
32
38
  - !ruby/object:Gem::Version
33
39
  version: '4.0'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '6'
34
43
  type: :runtime
35
44
  prerelease: false
36
45
  version_requirements: !ruby/object:Gem::Requirement
37
46
  requirements:
38
- - - "~>"
47
+ - - ">="
39
48
  - !ruby/object:Gem::Version
40
49
  version: '4.0'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '6'
41
53
  description:
42
54
  email:
43
55
  - pavel@pravosud.com
@@ -47,11 +59,16 @@ extra_rdoc_files: []
47
59
  files:
48
60
  - ".gitignore"
49
61
  - ".travis.yml"
62
+ - Appraisals
50
63
  - Gemfile
51
64
  - LICENSE.txt
52
65
  - README.md
53
66
  - Rakefile
54
67
  - adequate_exposure.gemspec
68
+ - gemfiles/rails_4.0.gemfile
69
+ - gemfiles/rails_4.1.gemfile
70
+ - gemfiles/rails_4.2.gemfile
71
+ - gemfiles/rails_5.0.gemfile
55
72
  - lib/adequate_exposure.rb
56
73
  - lib/adequate_exposure/attribute.rb
57
74
  - lib/adequate_exposure/behavior.rb
@@ -84,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
101
  version: '0'
85
102
  requirements: []
86
103
  rubyforge_project:
87
- rubygems_version: 2.2.2
104
+ rubygems_version: 2.6.4
88
105
  signing_key:
89
106
  specification_version: 4
90
107
  summary: Exposing things, adequately