uber 0.0.10 → 0.0.11

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: c817ac8bf31287641d793288fd317cb89818c834
4
- data.tar.gz: 79d88494f259334a88606b95bd4f1e3315d9248f
3
+ metadata.gz: 542663f6bd6360841443f9ac9cb3a3e5d8ea6672
4
+ data.tar.gz: 2bf5d837bc6d9f64b32a48aa28f8ad3dd5a3cd37
5
5
  SHA512:
6
- metadata.gz: 1ef9075f772764e736bfee3213d525be71d65ef1b23b23fa787bc0886f748d8a59049c567648c20e6aacd06b8f5c7ecfea10f17d775b14ea401e8eeaf7b15d65
7
- data.tar.gz: e9441a4deb06ba1630bb7e06bebebbb7f679b5448a6013a878caa9f108f64a8d1817ab5e0ce11445dbffa3957929156b20c6771fe8fce836a55f9a1703a2e763
6
+ metadata.gz: 8b135d80f988a6e9230c5a3317df4dc16ea982fba517c27c4b1638538b204f1d388829fcf194ed93e679f8536efc402c66c8c21c961e5b057113676bf9bfbb10
7
+ data.tar.gz: 44c29b8fa99ec1c7a97bffd4792d198ebf9baef598326fdf14fdbf254e0c3f6f84f53a50398736d1b508bcaa1fb3682f4bd176c9c99bf5311d8b33ee5a15026e
data/CHANGES.md CHANGED
@@ -1,3 +1,7 @@
1
+ # 0.0.11
2
+
3
+ * Don't clone nil, false, true and symbols in `::inheritable_attr`.
4
+
1
5
  # 0.0.10
2
6
 
3
7
  * Builders are _not_ inherited to subclasses. This allows instantiating subclasses directly without running builders.
data/README.md CHANGED
@@ -14,7 +14,8 @@ Ready?
14
14
 
15
15
  # Inheritable Class Attributes
16
16
 
17
- This is for you if you want class attributes to be inherited, which is a mandatory mechanism for creating DSLs.
17
+ If you want inherited class attributes, this is for you.
18
+ This is a mandatory mechanism for creating DSLs.
18
19
 
19
20
  ```ruby
20
21
  require 'uber/inheritable_attr'
@@ -27,15 +28,13 @@ class Song
27
28
  end
28
29
  ```
29
30
 
30
- Note that you have to initialize your attribute which whatever you want - usually a hash or an array.
31
-
32
- You can now use that attribute on the class level.
31
+ Note that you have to initialize your class attribute with whatever you want - usually a hash or an array.
33
32
 
34
33
  ```ruby
35
34
  Song.properties #=> [:title, :track]
36
35
  ```
37
36
 
38
- Inheriting from `Song` will result in the `properties` object being `clone`d to the sub-class.
37
+ A subclass of `Song` will have a `clone`d `properties` class attribute.
39
38
 
40
39
  ```ruby
41
40
  class Hit < Song
@@ -44,7 +43,7 @@ end
44
43
  Hit.properties #=> [:title, :track]
45
44
  ```
46
45
 
47
- The cool thing about the inheritance is: you can work on the inherited attribute without any restrictions, as it is a _copy_ of the original.
46
+ The cool thing about the inheritance is: you can work on the inherited attribute without any restrictions. It is a _copy_ of the original.
48
47
 
49
48
  ```ruby
50
49
  Hit.properties << :number
@@ -53,10 +52,10 @@ Hit.properties #=> [:title, :track, :number]
53
52
  Song.properties #=> [:title, :track]
54
53
  ```
55
54
 
56
- It's similar to ActiveSupport's `class_attribute` but with a simpler implementation resulting in a less dangerous potential. Also, there is no restriction about the way you modify the attribute [as found in `class_attribute`](http://apidock.com/rails/v4.0.2/Class/class_attribute).
57
-
58
- This module is very popular amongst numerous gems like Cells, Representable, Roar and Reform.
55
+ It's similar to ActiveSupport's `class_attribute` but with a simpler implementation.
56
+ It is less dangerous. There are no restrictions for modifying the attribute. [compared to `class_attribute`](http://apidock.com/rails/v4.0.2/Class/class_attribute).
59
57
 
58
+ This module is used across several other gems like [Cells](https://rubygems.org/gems/cells), [Representable](https://rubygems.org/gems/representable), [Roar](https://rubygems.org/gems/roar) and [Reform](https://rubygems.org/gems/reform).
60
59
 
61
60
  # Dynamic Options
62
61
 
@@ -274,4 +273,4 @@ version.~ "1.1", "1.2" #=> true
274
273
 
275
274
  Copyright (c) 2014 by Nick Sutterer <apotonick@gmail.com>
276
275
 
277
- Roar is released under the [MIT License](http://www.opensource.org/licenses/MIT).
276
+ Uber is released under the [MIT License](http://www.opensource.org/licenses/MIT).
@@ -7,14 +7,29 @@ module Uber
7
7
  end
8
8
 
9
9
  def #{name}
10
- @#{name} ||= InheritableAttribute.inherit_for(self, :#{name})
10
+ return @#{name} if instance_variable_defined?(:@#{name})
11
+ @#{name} = InheritableAttribute.inherit_for(self, :#{name})
11
12
  end
12
13
  }
13
14
  end
14
15
 
15
16
  def self.inherit_for(klass, name)
16
- return unless klass.superclass.respond_to?(name) and value = klass.superclass.send(name)
17
- value.clone # only do this once.
17
+ return unless klass.superclass.respond_to?(name)
18
+
19
+ value = klass.superclass.send(name) # could be nil.
20
+ Clone.(value) # this could be dynamic, allowing other inheritance strategies.
21
+ end
22
+
23
+ class Clone
24
+ # The second argument allows injecting more types.
25
+ def self.call(value, uncloneable=uncloneable)
26
+ uncloneable.each { |klass| return value if value.kind_of?(klass) }
27
+ value.clone
28
+ end
29
+
30
+ def self.uncloneable
31
+ [Symbol, TrueClass, FalseClass, NilClass]
32
+ end
18
33
  end
19
34
  end
20
35
 
@@ -1,3 +1,3 @@
1
1
  module Uber
2
- VERSION = "0.0.10"
2
+ VERSION = "0.0.11"
3
3
  end
@@ -7,9 +7,14 @@ class InheritableAttrTest < MiniTest::Spec
7
7
  Class.new(Object) do
8
8
  extend Uber::InheritableAttribute
9
9
  inheritable_attr :drinks
10
+ inheritable_attr :glass
10
11
  end
11
12
  }
12
13
 
14
+ def assert_nothing_raised(*)
15
+ yield
16
+ end
17
+
13
18
  it "provides a reader with empty inherited attributes, already" do
14
19
  assert_equal nil, subject.drinks
15
20
  end
@@ -50,5 +55,26 @@ class InheritableAttrTest < MiniTest::Spec
50
55
  subklass.drinks = [:merlot] # we only want merlot explicitely.
51
56
  assert_equal [:merlot], subklass.drinks # no :cabernet, here
52
57
  end
58
+
59
+ it "does not attempt to clone symbols" do
60
+ subject.glass = :highball
61
+ subklass = Class.new(subject)
62
+
63
+ subklass.glass.must_equal :highball
64
+ end
65
+
66
+ it "does not attempt to clone true" do
67
+ subject.glass = true
68
+ subklass = Class.new(subject)
69
+
70
+ subklass.glass.must_equal true
71
+ end
72
+
73
+ it "does not attempt to clone false" do
74
+ subject.glass = false
75
+ subklass = Class.new(subject)
76
+
77
+ subklass.glass.must_equal false
78
+ end
53
79
  end
54
80
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uber
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-23 00:00:00.000000000 Z
11
+ date: 2014-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake