modelling 0.0.2 → 0.0.4

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.
@@ -32,6 +32,10 @@ module Modelling
32
32
  def members
33
33
  @members ||= {}
34
34
  end
35
+
36
+ def accessors
37
+ @accessors ||= []
38
+ end
35
39
 
36
40
  private
37
41
 
@@ -55,6 +59,7 @@ module Modelling
55
59
  end
56
60
 
57
61
  def create_accessor(name)
62
+ accessors << name
58
63
  instance_eval { attr_accessor name }
59
64
  end
60
65
 
@@ -74,5 +79,32 @@ module Modelling
74
79
  end
75
80
  args.each { |name, value| send "#{name}=", value }
76
81
  end
77
-
82
+
83
+ def attributes
84
+ hash = {}
85
+ self.class.accessors.each do |method_name|
86
+ hash[method_name] = send(method_name)
87
+ end
88
+ hash
89
+ end
90
+
91
+ def inspect
92
+ attributes_as_nice_string = attributes.collect { |name, value|
93
+ "#{name}: #{attribute_for_inspect(value)}"
94
+ }.compact.join(", ")
95
+ "#<#{self.class} #{attributes_as_nice_string}>"
96
+ end
97
+
98
+ def attribute_for_inspect(value)
99
+ if value.is_a?(String) && value.length > 50
100
+ "#{value[0..50]}...".inspect
101
+ elsif value.is_a?(Date) || value.is_a?(Time)
102
+ %("#{value.to_s(:db)}")
103
+ elsif value.class.included_modules.include?(Modelling)
104
+ "#<#{value.class.to_s}>"
105
+ else
106
+ value.inspect
107
+ end
108
+ end
109
+
78
110
  end
@@ -1,3 +1,3 @@
1
1
  module Modelling
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -125,7 +125,51 @@ describe Modelling do
125
125
  it 'doesnt fail when lambdas with no args are used' do
126
126
  LambdaTest.new.lambda.should eq 'boo'
127
127
  end
128
-
128
+
129
+ specify 'tracks list of accessors' do
130
+ User.accessors.should include :name, :age
131
+ end
132
+
133
+ specify 'provides a Hash of attributes and values' do
134
+ User.new.attributes.key?(:name).should be_true
135
+ User.new.attributes.key?(:age).should be_true
136
+ User.new(:name => "Joe").attributes[:name].should eq "Joe"
137
+ end
138
+
139
+ specify 'converts the attributes hash to a string for inspect' do
140
+ u = User.new(:name => "Joe")
141
+ u.inspect.should == "#<User name: \"Joe\", age: nil, test: 3, fav_colours: [], biggest_gripes: []>"
142
+ end
143
+
144
+ context 'circular references' do
145
+
146
+ before do
147
+ class FirstModel
148
+ include Modelling
149
+ attributes :test => lambda { |me| OtherModel.new(me) }
150
+ end
151
+
152
+ class OtherModel
153
+ include Modelling
154
+ attributes :owner
155
+ def initialize(owner)
156
+ @owner = owner
157
+ end
158
+ end
159
+ end
160
+
161
+ it 'should not raise an error when inspecting' do
162
+ expect { FirstModel.new.inspect }.should_not raise_error(SystemStackError)
163
+ end
164
+
165
+ it 'should show the class name instead of inspecting referenced models' do
166
+ FirstModel.new.inspect.should include("#<OtherModel>")
167
+ end
168
+
169
+ end
170
+
171
+
172
+
129
173
  context 'inheritence' do
130
174
  let(:car) { Car.new }
131
175
  let(:super_car) { SuperCar.new }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: modelling
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -12,11 +12,11 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2012-02-03 00:00:00.000000000Z
15
+ date: 2012-04-23 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rspec
19
- requirement: &70346871923800 !ruby/object:Gem::Requirement
19
+ requirement: &70222335776840 !ruby/object:Gem::Requirement
20
20
  none: false
21
21
  requirements:
22
22
  - - ! '>='
@@ -24,7 +24,7 @@ dependencies:
24
24
  version: '0'
25
25
  type: :development
26
26
  prerelease: false
27
- version_requirements: *70346871923800
27
+ version_requirements: *70222335776840
28
28
  description: We were doing PORO dev on Rails before it was hip.
29
29
  email:
30
30
  - ryan@eden.cc
@@ -65,7 +65,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
65
  version: '0'
66
66
  requirements: []
67
67
  rubyforge_project: modelling
68
- rubygems_version: 1.8.6
68
+ rubygems_version: 1.8.11
69
69
  signing_key:
70
70
  specification_version: 3
71
71
  summary: Wraps some common-ish plain-ruby object modelling junk.