heredity 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ec31e3521f55721c771972fa759a5af017fb8171
4
+ data.tar.gz: 82d9c7cea355d67b0286ecee5074a65db1e44c1e
5
+ SHA512:
6
+ metadata.gz: 59526772bd0b154ea527a272de9feb23fb6c02427494563dca3f21492eb04f559f077b00c567b857deb8fa3c88bfc07c6248c1ccd0f449a78110318f1dc08b99
7
+ data.tar.gz: edb62863333394c783d70da8dbb4f7012ed2d61796ac0a5866682ea89c95d8903c1acb33d6fe7da2fdb33641b0573bdb9d150b082e5bcf593793303dc506d9e2
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Heredity
2
2
 
3
- TODO: Write a gem description
3
+ Heredity adds on_inherit hooks to Ruby which providing a clean way execute code on inherited classes without the need to override `inherited`. It also adds the ability to specify class instance variables that should be copied to subclasses.
4
4
 
5
5
  ## Installation
6
6
 
@@ -18,7 +18,35 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- TODO: Write usage instructions here
21
+ #### Inheritance hooks
22
+
23
+ To use Heredity's inheritance hooks, simply call `on_herit` with a block:
24
+
25
+ ```Ruby
26
+ class Foo
27
+ on_inherit do
28
+ puts 'Child of Foo!'
29
+ end
30
+ end
31
+ ```
32
+
33
+ This is very useful for injecting behavior into subclasses that is dependent on class state (e.g. behavior that relies on the columns of an active record model).
34
+
35
+ #### Class instance variables
36
+
37
+ Because class instance variables in Ruby are not inherited (and rightfully so), Heredity provides the ability to define specific class instance variables that should be inherited. To define inheritable attributes:
38
+
39
+ ```Ruby
40
+ class Foo
41
+ include Heredity
42
+
43
+ # Define inheritable attributes
44
+ inheritable_attributes :bar
45
+
46
+ # Initialize inheritable attributes (so there's something to copy).
47
+ self.bar = {}
48
+ end
49
+ ```
22
50
 
23
51
  ## Contributing
24
52
 
@@ -1,11 +1,12 @@
1
- require 'thread'
2
-
3
1
  module Heredity
4
2
  module InheritableClassInstanceVariables
3
+
4
+ MUTEX_FOR_THREAD_EXCLUSIVE = Mutex.new
5
+
5
6
  def self.included(klass)
6
7
  return if klass.respond_to?(:_inheritable_class_instance_variables)
7
8
 
8
- Thread.exclusive do
9
+ MUTEX_FOR_THREAD_EXCLUSIVE.synchronize do
9
10
  klass.extend(::Heredity::InheritableClassInstanceVariables::ClassMethods)
10
11
 
11
12
  klass.class_eval do
@@ -26,7 +27,7 @@ module Heredity
26
27
  end
27
28
 
28
29
  def inheritable_attributes(*args)
29
- Thread.exclusive do
30
+ MUTEX_FOR_THREAD_EXCLUSIVE.synchronize do
30
31
  args.flatten.compact.uniq.each do |class_instance_variable|
31
32
  unless @_inheritable_class_instance_variables.include?(class_instance_variable)
32
33
  @_inheritable_class_instance_variables << class_instance_variable
@@ -54,7 +55,7 @@ module Heredity
54
55
  def inherited(klass)
55
56
  super # ActiveRecord needs the inherited hook to setup fields
56
57
 
57
- Thread.exclusive do
58
+ MUTEX_FOR_THREAD_EXCLUSIVE.synchronize do
58
59
  @_inheritable_class_instance_variables.each do |attribute|
59
60
  attr_sym = :"@#{attribute}"
60
61
  klass.instance_variable_set(attr_sym, self.instance_variable_get(attr_sym))
@@ -1,3 +1,3 @@
1
1
  module Heredity
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -30,41 +30,41 @@ describe Heredity::InheritableClassInstanceVariables do
30
30
 
31
31
  # API
32
32
  [TestInheritTop, TestSecondTier, TestThirdTier].each do |test_class|
33
- specify { test_class.should respond_to(:inheritable_attributes) }
34
- specify { test_class.should respond_to(:inheritable_attribute) }
35
- specify { test_class.should respond_to(:class_inheritable_attributes) }
36
- specify { test_class.should respond_to(:class_inheritable_attribute) }
33
+ specify { expect(test_class).to respond_to(:inheritable_attributes) }
34
+ specify { expect(test_class).to respond_to(:inheritable_attribute) }
35
+ specify { expect(test_class).to respond_to(:class_inheritable_attributes) }
36
+ specify { expect(test_class).to respond_to(:class_inheritable_attribute) }
37
37
  end
38
38
 
39
39
  context "when inheritable class instance variables is already included" do
40
40
  it "doesn't reset inheritable attributes" do
41
41
  TestInheritTop.__send__(:include, ::Heredity::InheritableClassInstanceVariables)
42
- TestInheritTop.inheritable_attributes.should include :first, :awesomeness, :bestest
42
+ expect(TestInheritTop.inheritable_attributes).to include :first, :awesomeness, :bestest
43
43
  end
44
44
  end
45
45
 
46
46
  context "when overriding child class instance variables" do
47
47
  describe "single tier inheritance" do
48
48
  it "overrides the instance variables with the child defined values" do
49
- TestEditSecondTier.first.should eq("Songs are for Singing")
50
- TestEditSecondTier.awesomeness.should eq("Songs are for Singing" * 3)
51
- TestEditSecondTier.bestest.should eq("SSSSSOOOOOOOOOONNNNNNNNGGGGGGGSSSSSS")
49
+ expect(TestEditSecondTier.first).to eq("Songs are for Singing")
50
+ expect(TestEditSecondTier.awesomeness).to eq("Songs are for Singing" * 3)
51
+ expect(TestEditSecondTier.bestest).to eq("SSSSSOOOOOOOOOONNNNNNNNGGGGGGGSSSSSS")
52
52
  end
53
53
  end
54
54
 
55
55
  describe "second tier inheritance" do
56
56
  it "overrides the instance variables with the child defined values" do
57
- TestEditThirdTier.first.should eq([])
58
- TestEditThirdTier.awesomeness.should eq([])
59
- TestEditThirdTier.bestest.should eq([])
57
+ expect(TestEditThirdTier.first).to eq([])
58
+ expect(TestEditThirdTier.awesomeness).to eq([])
59
+ expect(TestEditThirdTier.bestest).to eq([])
60
60
  end
61
61
  end
62
62
 
63
63
  describe "second tier inheritance without changing first override" do
64
64
  it "keeps instance variables the same as first override" do
65
- TestEditThirdTierWithoutEdit.first.should eq("Songs are for Singing")
66
- TestEditThirdTierWithoutEdit.awesomeness.should eq("Songs are for Singing" * 3)
67
- TestEditThirdTierWithoutEdit.bestest.should eq("SSSSSOOOOOOOOOONNNNNNNNGGGGGGGSSSSSS")
65
+ expect(TestEditThirdTierWithoutEdit.first).to eq("Songs are for Singing")
66
+ expect(TestEditThirdTierWithoutEdit.awesomeness).to eq("Songs are for Singing" * 3)
67
+ expect(TestEditThirdTierWithoutEdit.bestest).to eq("SSSSSOOOOOOOOOONNNNNNNNGGGGGGGSSSSSS")
68
68
  end
69
69
  end
70
70
  end
@@ -73,21 +73,21 @@ describe Heredity::InheritableClassInstanceVariables do
73
73
  describe "single tier inheritance" do
74
74
 
75
75
  it "creates public attr_readers for inherited attributes" do
76
- TestSecondTier.should respond_to(:first)
77
- TestSecondTier.should respond_to(:awesomeness)
78
- TestSecondTier.should respond_to(:bestest)
76
+ expect(TestSecondTier).to respond_to(:first)
77
+ expect(TestSecondTier).to respond_to(:awesomeness)
78
+ expect(TestSecondTier).to respond_to(:bestest)
79
79
  end
80
80
 
81
81
  it "inherits the values of hashes" do
82
- TestSecondTier.first.should eq({})
82
+ expect(TestSecondTier.first).to eq({})
83
83
  end
84
84
 
85
85
  it "inherits the values of arrays" do
86
- TestSecondTier.awesomeness.should eq([:this, :that, :the_other])
86
+ expect(TestSecondTier.awesomeness).to eq([:this, :that, :the_other])
87
87
  end
88
88
 
89
89
  it "inherits the values of Objects" do
90
- TestSecondTier.bestest.should eq("dirt apple (Po-ta-toes!)")
90
+ expect(TestSecondTier.bestest).to eq("dirt apple (Po-ta-toes!)")
91
91
  end
92
92
 
93
93
  end
@@ -95,21 +95,21 @@ describe Heredity::InheritableClassInstanceVariables do
95
95
  describe "2nd tier inheritance" do
96
96
 
97
97
  it "creates public attr_readers for inherited attributes" do
98
- TestThirdTier.should respond_to(:first)
99
- TestThirdTier.should respond_to(:awesomeness)
100
- TestThirdTier.should respond_to(:bestest)
98
+ expect(TestThirdTier).to respond_to(:first)
99
+ expect(TestThirdTier).to respond_to(:awesomeness)
100
+ expect(TestThirdTier).to respond_to(:bestest)
101
101
  end
102
102
 
103
103
  it "inherits the values of hashes" do
104
- TestThirdTier.first.should eq({})
104
+ expect(TestThirdTier.first).to eq({})
105
105
  end
106
106
 
107
107
  it "inherits the values of arrays" do
108
- TestThirdTier.awesomeness.should eq([:this, :that, :the_other])
108
+ expect(TestThirdTier.awesomeness).to eq([:this, :that, :the_other])
109
109
  end
110
110
 
111
111
  it "inherits the values of Objects" do
112
- TestThirdTier.bestest.should eq("dirt apple (Po-ta-toes!)")
112
+ expect(TestThirdTier.bestest).to eq("dirt apple (Po-ta-toes!)")
113
113
  end
114
114
 
115
115
  end
metadata CHANGED
@@ -1,94 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heredity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
5
- prerelease:
4
+ version: 0.1.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Brandon Dewitt
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-09-30 00:00:00.000000000 Z
11
+ date: 2016-07-01 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rake
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rspec
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec-pride
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: pry-nav
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ">="
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - ">="
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: simplecov
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - ">="
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - ">="
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  description: provides class inheritable attributes outside of rails and other gem/frameworks
@@ -98,7 +87,7 @@ executables: []
98
87
  extensions: []
99
88
  extra_rdoc_files: []
100
89
  files:
101
- - .gitignore
90
+ - ".gitignore"
102
91
  - Gemfile
103
92
  - LICENSE.txt
104
93
  - README.md
@@ -113,33 +102,26 @@ files:
113
102
  - spec/spec_helper.rb
114
103
  homepage: ''
115
104
  licenses: []
105
+ metadata: {}
116
106
  post_install_message:
117
107
  rdoc_options: []
118
108
  require_paths:
119
109
  - lib
120
110
  required_ruby_version: !ruby/object:Gem::Requirement
121
- none: false
122
111
  requirements:
123
- - - ! '>='
112
+ - - ">="
124
113
  - !ruby/object:Gem::Version
125
114
  version: '0'
126
- segments:
127
- - 0
128
- hash: 252453511989656056
129
115
  required_rubygems_version: !ruby/object:Gem::Requirement
130
- none: false
131
116
  requirements:
132
- - - ! '>='
117
+ - - ">="
133
118
  - !ruby/object:Gem::Version
134
119
  version: '0'
135
- segments:
136
- - 0
137
- hash: 252453511989656056
138
120
  requirements: []
139
121
  rubyforge_project:
140
- rubygems_version: 1.8.24
122
+ rubygems_version: 2.4.6
141
123
  signing_key:
142
- specification_version: 3
124
+ specification_version: 4
143
125
  summary: inherit class instance variables
144
126
  test_files:
145
127
  - spec/heredity/inheritable_class_instance_variables_spec.rb