attribute-driven 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,43 @@
1
+ ATTRIBUTE-DRIVEN
2
+ by Aman King
3
+
4
+ http://bitbucket.org/amanking/attribute-driven/
5
+
6
+ A module that
7
+ (1) allows you to mention a list of attributes in a class,
8
+ (2) provides reader methods for the attributes,
9
+ (3) allows initialization of the class via a hash argument that gives values for the attributes,
10
+ (4) overrides equals and hash method to check for field equality
11
+
12
+ Usage:
13
+
14
+ require 'attribute_driven'
15
+ class Money
16
+ include AttributeDriven
17
+ attributes :value, :currency
18
+ # initializes_with :value, :currency #=> only adds the initialize method
19
+ # equality_based_on :value, :currency #=> only overrides equality methods and hash
20
+ end
21
+
22
+ money = Money.new(:value => 20, :currency => 'USD') #=> #<Money:0x5138e4 @value=20, @currency="USD">
23
+ money.value #=> 20
24
+ money.currency #=> "USD"
25
+ money == Money.new(:value => 20, :currency => 'USD') #=> true
26
+
27
+ (see test/attribute_driven_test.rb for more)
28
+
29
+ License
30
+
31
+ Copyright 2009 Aman King
32
+
33
+ Licensed under the Apache License, Version 2.0 (the "License");
34
+ you may not use this file except in compliance with the License.
35
+ You may obtain a copy of the License at
36
+
37
+ http://www.apache.org/licenses/LICENSE-2.0
38
+
39
+ Unless required by applicable law or agreed to in writing, software
40
+ distributed under the License is distributed on an "AS IS" BASIS,
41
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
42
+ See the License for the specific language governing permissions and
43
+ limitations under the License.
@@ -0,0 +1 @@
1
+ require 'attribute_driven'
@@ -0,0 +1,61 @@
1
+ =begin
2
+ Copyright 2009 Aman King
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ =end
16
+
17
+ module AttributeDriven
18
+ def self.included(klass)
19
+ klass.extend(ClassMethods)
20
+ end
21
+
22
+ module ClassMethods
23
+ def initializes_with(*attributes)
24
+ class_eval(<<-EOS, __FILE__, __LINE__)
25
+ def initialize(params = {})
26
+ #{attributes.inspect}.each do |attribute|
27
+ instance_variable_set("@\#{attribute}", params[attribute])
28
+ end
29
+ end
30
+ EOS
31
+ end
32
+
33
+ def equality_based_on(*attributes)
34
+ class_eval(<<-EOS, __FILE__, __LINE__)
35
+ def eql?(other)
36
+ return true if equal?(other)
37
+ #{attributes.inspect}.inject(true) do |result, attribute|
38
+ result &&= (self.send(attribute) == other.send(attribute))
39
+ end
40
+ end
41
+ alias_method :==, :eql?
42
+
43
+ def hash
44
+ #{attributes.inspect}.inject(0) do |result, attribute|
45
+ result += self.send(attribute).hash if self.send(attribute)
46
+ result
47
+ end
48
+ end
49
+
50
+ protected
51
+ attr_reader *attributes
52
+ EOS
53
+ end
54
+
55
+ def attributes(*attributes)
56
+ initializes_with *attributes
57
+ equality_based_on *attributes
58
+ attr_reader *attributes
59
+ end
60
+ end
61
+ end
@@ -0,0 +1 @@
1
+ require 'attribute_driven'
@@ -0,0 +1,65 @@
1
+ =begin
2
+ Copyright 2009 Aman King
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ =end
16
+
17
+ require 'test/unit'
18
+ require File.join(File.dirname(__FILE__), '../lib/attribute_driven')
19
+
20
+ class AttributeDrivenTest < Test::Unit::TestCase
21
+ def setup
22
+ @klass = Class.new do
23
+ include AttributeDriven
24
+ attributes :foo, :bar
25
+ end
26
+ end
27
+
28
+ def test_should_create_getters_for_specified_attributes
29
+ instance = @klass.new
30
+ assert_equal(true, instance.respond_to?(:foo))
31
+ assert_equal(true, instance.respond_to?(:bar))
32
+ end
33
+
34
+ def test_should_allow_setting_attribute_values_when_instantiating
35
+ instance = @klass.new(:foo => "hi", :bar => "bye")
36
+ assert_equal("hi", instance.foo)
37
+ assert_equal("bye", instance.bar)
38
+ end
39
+
40
+ def test_should_return_nil_for_unset_attributes
41
+ instance = @klass.new(:foo => "hi")
42
+ assert_nil(instance.bar)
43
+ end
44
+
45
+ def test_should_ignore_unknown_attributes_when_instantiating
46
+ instance = @klass.new(:x => "x")
47
+ assert_equal(false, instance.respond_to?(:x))
48
+ assert_equal(false, instance.instance_variables.include?('@x'))
49
+ end
50
+
51
+ def test_should_allow_two_instances_to_be_equated_based_on_attributes
52
+ assert_equal(@klass.new(:foo => "foo"), @klass.new(:foo => "foo"))
53
+ assert_not_equal(@klass.new(:foo => "foo1"), @klass.new(:foo => "foo2"))
54
+ end
55
+
56
+ def test_should_return_same_hash_for_two_equal_objects
57
+ assert_equal(@klass.new.hash, @klass.new.hash)
58
+ assert_equal(@klass.new(:foo => "hi", :bar => "bye").hash, @klass.new(:foo => "hi", :bar => "bye").hash)
59
+ end
60
+
61
+ def test_should_not_break_equality_based_on_reference
62
+ instance = @klass.new(:foo => "foo")
63
+ assert_same(instance, instance)
64
+ end
65
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: attribute-driven
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 0
8
+ - 1
9
+ version: 1.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Aman King
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2008-02-12 00:00:00 +05:30
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: AttributeDriven provides a class method to generate attribute-based equality-methods, initializer, and reader methods.
22
+ email: amanking@gmail.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - README
31
+ - lib/attribute-driven.rb
32
+ - lib/attribute_driven.rb
33
+ - lib/attributedriven.rb
34
+ - test/attribute_driven_test.rb
35
+ has_rdoc: true
36
+ homepage: http://bitbucket.org/amanking/attribute-driven/
37
+ licenses: []
38
+
39
+ post_install_message:
40
+ rdoc_options: []
41
+
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ segments:
49
+ - 0
50
+ version: "0"
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ segments:
56
+ - 0
57
+ version: "0"
58
+ requirements: []
59
+
60
+ rubyforge_project:
61
+ rubygems_version: 1.3.6
62
+ signing_key:
63
+ specification_version: 3
64
+ summary: AttributeDriven provides a class method to generate attribute-based equality-methods, initializer, and reader methods.
65
+ test_files:
66
+ - test/attribute_driven_test.rb