inheritable_accessors 0.1.1 → 0.1.2

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: 8d2efb20dc919b54c78e3c2bec2b2d4a50c14606
4
- data.tar.gz: ed4f8a39aee354cd65a3d3d4e2e20e7bdca79871
3
+ metadata.gz: 887a141cf629f263b1d5d359f1b6af90cc4babc3
4
+ data.tar.gz: 59d0fbd8c834134eef28fbe8dc351175cb8c9d4d
5
5
  SHA512:
6
- metadata.gz: 59e264c5d8bcdcc8e6031ef4f4fdb193517bd94baeeefef5f99102ed0d1fb15e7c2c4edb3a239e941adb91f46fb8c5e4c59c9a1c4fd6c4542bca294570ec6b73
7
- data.tar.gz: 5e7a73237ebc94c62073b9ead680008c4edceacf00cf7eb36678d61bd2327d75e57c15d9cc14c556d98c3e816d72453c14d6378b3293a64eac2c3f2b1696f631
6
+ metadata.gz: ab916ece20a1de9df4a889deb1ef26a85a9fb968abdc8b3d7fc92005783da5e023f565367b1506c529017ecfd0b77fa69ffc2448cc2888eec837f87d2b067b75
7
+ data.tar.gz: 12a193b47d6aae6d9c26c6de548685b260469057f20e083d26c576ff696c3833c5ab2e18f7e165f03d9ff9d63451335768619fff6bf52829dc6af0860e22aa6e
data/.rspec CHANGED
@@ -1,2 +1,2 @@
1
- --format documentation
1
+ --format progress
2
2
  --color
data/.travis.yml CHANGED
@@ -1,3 +1,8 @@
1
1
  language: ruby
2
+ bundler_args: --without development
3
+ before_install: gem install bundler --version=1.8.2
2
4
  rvm:
5
+ - 2.0.0
3
6
  - 2.1.0
7
+ notifications:
8
+ email: false
data/Gemfile CHANGED
@@ -1,4 +1,19 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ group :development do
4
+ gem "byebug"
5
+ end
6
+
7
+ group :development, :test do
8
+ gem "bundler", "~> 1.8"
9
+ gem "rake", "~> 10.0"
10
+ end
11
+
12
+ group :test do
13
+ gem "rspec", "~> 3.2"
14
+ end
15
+
16
+
17
+
3
18
  # Specify your gem's dependencies in inheritable-accessors.gemspec
4
19
  gemspec
data/README.md CHANGED
@@ -1,15 +1,76 @@
1
- # InheritableAccessors
1
+ # InheritableAccessors [![Build Status](https://travis-ci.org/blakechambers/inheritable-accessors.svg)](https://travis-ci.org/blakechambers/inheritable-accessors)
2
2
 
3
- Easily and consistently inherit attributes and configurations. This is particularly designed to work well with Rspec, which creates new inherited classes during each context. More examples of usage coming soon.
3
+ Easily and consistently inherit attributes and configurations. This is particularly designed to work well with Rspec, which creates new inherited classes during each context.
4
4
 
5
- ## Planned features
5
+ ## Usage
6
+
7
+ Inheritable accessors comes with 3 inheritable components that can be used:
8
+ an iheritable hash, set, and option accessor.
9
+
10
+ ### InheritableHashAccessor
11
+
12
+ ```ruby
13
+ class Parent
14
+ include InheritableAccessors::InheritableHashAccessor
15
+
16
+ inheritable_hash_accessor :options
17
+
18
+ options[:a] = 1
19
+ end
20
+
21
+ class Child < Parent
22
+ options[:b] = 2
23
+ end
24
+
25
+ item = Child.new
26
+
27
+ # deleted items do not affect parent items
28
+ item.delete(:a)
29
+ item.options[:c] = 3
30
+
31
+ Parent.options.to_hash
32
+ #=> {a: 1})
33
+ Child.options.to_hash
34
+ #=> {a: 1, b: 1})
35
+ item.options.to_hash
36
+ #=> {b: 2, c: 3})
37
+ ```
38
+
39
+ ### InheritableOptionAccessor
6
40
 
7
- - inheritable\_hash
8
- - [x] support addition
9
- - [ ] support delete/clear/reject
10
- - inheritable\_set
11
- - [x] support addition
12
- - [ ] support deletion
41
+ ```ruby
42
+ class MyRequest
43
+ include InheritableAccessors::InheritableHashAccessor
44
+ include InheritableAccessors::InheritableOptionAccessor
45
+
46
+ inheritable_hash_accessor :request_opts
47
+ inheritable_option_accessor :path, :action, :params, for: :request_opts
48
+
49
+ # passing an argument to the accessor will "set" that value.
50
+ action "GET"
51
+
52
+ action # => "GET"
53
+
54
+ # passing a block will use the value of the block, but *only* when it is
55
+ # called. Block values will be memoized after the first run.
56
+ path { secret_path }
57
+
58
+ protected
59
+
60
+ def secret_path
61
+ "/secret_path"
62
+ end
63
+
64
+ end
65
+
66
+
67
+ request = MyRequest.new
68
+ request.path # => "/secret_path"
69
+ request.path "/other_path"
70
+ request.path # => "/other_path"
71
+
72
+
73
+ ```
13
74
 
14
75
  ## Installation
15
76
 
@@ -9,10 +9,6 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Blake Chambers"]
10
10
  spec.email = ["chambb1@gmail.com"]
11
11
 
12
- # if spec.respond_to?(:metadata)
13
- # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com' to prevent pushes to rubygems.org, or delete to allow pushes to any server."
14
- # end
15
-
16
12
  spec.summary = %q{inheritable accessors}
17
13
  spec.description = %q{inheritable accessors}
18
14
  spec.homepage = "http://github.com/blakechambers/inheritable_accessors"
@@ -23,9 +19,5 @@ Gem::Specification.new do |spec|
23
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
20
  spec.require_paths = ["lib"]
25
21
 
26
- spec.add_development_dependency "activesupport", ">= 3.2.0"
27
-
28
- spec.add_development_dependency "bundler", "~> 1.8"
29
- spec.add_development_dependency "rake", "~> 10.0"
30
- spec.add_development_dependency "rspec", "~> 3.0"
22
+ spec.add_runtime_dependency "activesupport", ">= 3.2.0"
31
23
  end
@@ -4,6 +4,7 @@ require "inheritable_accessors/inheritable_hash"
4
4
  require "inheritable_accessors/inheritable_hash_accessor"
5
5
  require "inheritable_accessors/inheritable_set"
6
6
  require "inheritable_accessors/inheritable_set_accessor"
7
+ require "inheritable_accessors/inheritable_option_accessor"
7
8
 
8
9
  module InheritableAccessors
9
10
  extend ActiveSupport::Concern
@@ -1,15 +1,21 @@
1
1
  require 'forwardable'
2
+ require 'set'
2
3
 
3
4
  module InheritableAccessors
4
5
  class InheritableHash
5
6
  attr_accessor :__local_values__
6
7
  attr_reader :__parent__
8
+ attr_reader :__deleted_keys__
7
9
  extend Forwardable
8
10
 
9
11
  WRITE_METHODS = %w{
10
12
  []= initialize merge! store
11
13
  }
12
14
 
15
+ DELETE_METHODS = %w{
16
+ delete
17
+ }
18
+
13
19
  READ_METHODS = %w{
14
20
  == [] each each_pair each_value empty? eql? fetch flatten
15
21
  has_key? has_value? hash include? index inspect invert key key? keys
@@ -22,11 +28,21 @@ module InheritableAccessors
22
28
  def initialize(prototype=nil)
23
29
  @__local_values__ = Hash.new
24
30
  @__parent__ = prototype
31
+ @__deleted_keys__ = prototype ? prototype.__deleted_keys__.dup : Set.new
32
+ end
33
+
34
+ def delete(key)
35
+ @__deleted_keys__.merge [key]
36
+ __local_values__.delete(key)
25
37
  end
26
38
 
27
39
  def to_hash
28
40
  if !!__parent__
29
- __parent__.to_hash.merge(__local_values__)
41
+ hash = __parent__.to_hash
42
+ hash.delete_if do |key, _|
43
+ __deleted_keys__.include?(key)
44
+ end
45
+ hash.merge(__local_values__)
30
46
  else
31
47
  __local_values__.clone
32
48
  end
@@ -38,4 +54,4 @@ module InheritableAccessors
38
54
 
39
55
  alias :initialize_copy :inherit_copy
40
56
  end
41
- end
57
+ end
@@ -0,0 +1,58 @@
1
+ module InheritableAccessors
2
+ module InheritableOptionAccessor
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+ def inheritable_option_accessor(*names)
7
+ options = names.pop if names.last.kind_of?(Hash)
8
+
9
+ opts_location = options[:for].to_s
10
+ unless respond_to?(opts_location) && send(opts_location).kind_of?(InheritableAccessors::InheritableHash)
11
+ raise ArgumentError, 'requires for: to be kind of InheritableHashAccessor'
12
+ end
13
+
14
+ names.each do |name|
15
+ name = name.to_s
16
+
17
+ module_eval <<-METHUD, __FILE__, __LINE__
18
+ def #{name}(new_val=nil, &block)
19
+ InheritableAccessors::InheritableOptionAccessor.__inheritable_option(self, #{opts_location}, :#{name}, new_val, &block)
20
+ end
21
+
22
+ def self.#{name}(new_val=nil, &block)
23
+ InheritableAccessors::InheritableOptionAccessor.__inheritable_option(self, #{opts_location}, :#{name}, new_val, &block)
24
+ end
25
+ METHUD
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+
32
+ class LetOption
33
+ attr_reader :block
34
+
35
+ def initialize(block)
36
+ @block = block
37
+ @memoized = {}
38
+ end
39
+
40
+ def with_context(context)
41
+ @memoized[context] ||= begin
42
+ context.instance_exec(&block)
43
+ end
44
+ end
45
+ end
46
+
47
+ def self.__inheritable_option(context, options_hash, name, value, &block)
48
+ if value
49
+ options_hash[name] = value
50
+ elsif block_given?
51
+ options_hash[name] = InheritableOptionAccessor::LetOption.new(block)
52
+ else
53
+ options_hash[name].instance_of?(InheritableOptionAccessor::LetOption) ? options_hash[name].with_context(context) : options_hash[name]
54
+ end
55
+ end
56
+
57
+ end
58
+ end
@@ -1,3 +1,3 @@
1
1
  module InheritableAccessors
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inheritable_accessors
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Blake Chambers
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-03-15 00:00:00.000000000 Z
11
+ date: 2015-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -17,55 +17,13 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 3.2.0
20
- type: :development
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
26
  version: 3.2.0
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.8'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.8'
41
- - !ruby/object:Gem::Dependency
42
- name: rake
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '10.0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '10.0'
55
- - !ruby/object:Gem::Dependency
56
- name: rspec
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '3.0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '3.0'
69
27
  description: inheritable accessors
70
28
  email:
71
29
  - chambb1@gmail.com
@@ -87,6 +45,7 @@ files:
87
45
  - lib/inheritable_accessors.rb
88
46
  - lib/inheritable_accessors/inheritable_hash.rb
89
47
  - lib/inheritable_accessors/inheritable_hash_accessor.rb
48
+ - lib/inheritable_accessors/inheritable_option_accessor.rb
90
49
  - lib/inheritable_accessors/inheritable_set.rb
91
50
  - lib/inheritable_accessors/inheritable_set_accessor.rb
92
51
  - lib/inheritable_accessors/version.rb
@@ -110,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
110
69
  version: '0'
111
70
  requirements: []
112
71
  rubyforge_project:
113
- rubygems_version: 2.4.6
72
+ rubygems_version: 2.4.3
114
73
  signing_key:
115
74
  specification_version: 4
116
75
  summary: inheritable accessors