activefacts-api 0.9.3 → 0.9.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.
@@ -0,0 +1,269 @@
1
+ #
2
+ # ActiveFacts tests: Metadata in the Runtime API
3
+ # Copyright (c) 2012 Clifford Heath. Read the LICENSE file.
4
+ #
5
+ require 'activefacts/api'
6
+
7
+ describe "In a vocabulary" do
8
+ before :each do
9
+ Object.send :remove_const, :Mod if Object.const_defined?("Mod")
10
+ module Mod
11
+ end
12
+ @constellation = ActiveFacts::API::Constellation.new(Mod)
13
+ end
14
+
15
+ ObjectType_methods = [
16
+ :has_one, :maybe, :one_to_one,
17
+ :roles, :subtypes, :supertypes, :vocabulary,
18
+ # To make private:
19
+ :check_identifying_role_has_valid_cardinality, :realise_role, :supertypes_transitive,
20
+ ]
21
+
22
+ ValueType_methods = [
23
+ :assert_instance, :identifying_role_values, :index_instance,
24
+ :inherited, :length, :restrict, :scale, :value_type, :verbalise
25
+ ]
26
+
27
+ Instance_methods = [
28
+ :constellation, :retract, :is_a?,
29
+ # To remove or move to EntityType
30
+ :related_entities, :check_value_change_legality,
31
+ :instance_index
32
+ ]
33
+ Value_methods = Instance_methods + [
34
+ :verbalise, :identifying_role_values
35
+ ]
36
+
37
+ EntityType_methods = [
38
+ :assert_instance, :identified_by,
39
+ :identifying_role_names, :identifying_role_values, :identifying_roles,
40
+ :index_instance, :inherited,
41
+ :verbalise,
42
+ # To make private:
43
+ :check_no_supertype_instance_exists, :check_supertype_identifiers_match,
44
+ :identification_inherited_from, :identification_inherited_from=,
45
+ :find_inherited_role,
46
+ :overrides_identification_of, :overrides_identification_of=,
47
+ # To remove
48
+ :created_instances, :created_instances=
49
+ ]
50
+
51
+ Entity_methods = Instance_methods + [
52
+ :verbalise, :identifying_role_values,
53
+ # To remove hide or rewrite:
54
+ :identity_by, :identity_as_hash
55
+ ]
56
+
57
+ Cases =
58
+ ValueClasses.map do |klass| # [String, Date, DateTime, Int, Real, AutoCounter, Decimal, Guid]
59
+ x=
60
+ { :name => "a #{klass}",
61
+ :definition => %Q{
62
+ class T < #{klass}
63
+ value_type
64
+ end
65
+ },
66
+ :pattern => /Method: Class(#[a-z_0-9]*[?=]? )?\((defined in )?ActiveFacts::API::Value::ClassMethods[) ]/,
67
+ :class_methods => ValueType_methods,
68
+ :instance_methods => Value_methods,
69
+ :constructor_args => Array(
70
+ case klass.name
71
+ when 'String'; 'foo'
72
+ when 'DateTime'; [2008, 04, 20, 10, 28, 14]
73
+ when 'Date'; '2012-12-11'
74
+ when 'Time'; [2008, 04, 20, 10, 28, 14]
75
+ when 'Int'; 23
76
+ when 'Real'; 23.45
77
+ when 'AutoCounter', 'Guid'; :new
78
+ when 'Decimal'; '12345.5678'
79
+ else
80
+ raise "Please define constructor args for #{klass}"
81
+ end
82
+ ).compact
83
+ }
84
+ debugger if x[:constructor_args].empty?
85
+ x
86
+ end + [
87
+ { :name => "a Value Sub Type",
88
+ :definition => %q{
89
+ class V < String
90
+ value_type
91
+ end
92
+ class T < V
93
+ end
94
+ },
95
+ :pattern => /Method: Class(#[a-z_0-9]*[?=]? )?\((defined in )?ActiveFacts::API::Value::ClassMethods[) ]/,
96
+ :class_methods => ValueType_methods,
97
+ :instance_methods => Value_methods,
98
+ :constructor_args => [ 'foo' ]
99
+ },
100
+
101
+ { :name => "an Entity Type",
102
+ :definition => %q{
103
+ class V < String
104
+ value_type
105
+ end
106
+ class T
107
+ identified_by :foo
108
+ one_to_one :foo, :class => V
109
+ end
110
+ },
111
+ :pattern => /Method: Class(#[a-z_0-9]*[?=]? )?\((defined in )?ActiveFacts::API::Entity::ClassMethods[) ]/,
112
+ :class_methods => EntityType_methods,
113
+ :instance_methods => Entity_methods,
114
+ :constructor_args => [ 'foo' ]
115
+ },
116
+
117
+ { :name => "an Entity Sub Type",
118
+ :definition => %q{
119
+ class V < String
120
+ value_type
121
+ end
122
+ class E
123
+ identified_by :foo
124
+ one_to_one :foo, :class => V
125
+ end
126
+ class T < E
127
+ end
128
+ },
129
+ :pattern => /Method: Class(#[a-z_0-9]*[?=]? )?\((defined in )?ActiveFacts::API::Entity::ClassMethods[) ]/,
130
+ :class_methods => EntityType_methods,
131
+ :instance_methods => Entity_methods,
132
+ :constructor_args => [ 'foo' ]
133
+ },
134
+
135
+ { :name => "an Entity Sub Type with independent identification",
136
+ :definition => %q{
137
+ class V < String
138
+ value_type
139
+ end
140
+ class E
141
+ identified_by :foo
142
+ one_to_one :foo, :class => V
143
+ end
144
+ class T < E
145
+ identified_by :bar
146
+ one_to_one :bar, :class => V
147
+ end
148
+ },
149
+ :pattern => /Method: Class(#[a-z_0-9]*[?=]? )?\((defined in )?ActiveFacts::API::Entity::ClassMethods[) ]/,
150
+ :class_methods => EntityType_methods,
151
+ :instance_methods => Entity_methods,
152
+ :constructor_args => [ 'bar', {:foo => 'foo'} ]
153
+ },
154
+
155
+ { :name => "an Entity Sub Type with extra supertypes",
156
+ :definition => %q{
157
+ class V < String
158
+ value_type
159
+ end
160
+ class E
161
+ identified_by :foo
162
+ one_to_one :foo, :class => V
163
+ end
164
+ class E2
165
+ identified_by :baz
166
+ one_to_one :baz, :class => V
167
+ end
168
+ class T < E
169
+ supertypes E2
170
+ one_to_one :bar, :class => V
171
+ end
172
+ },
173
+ :pattern => /Method: Class(#[a-z_0-9]*[?=]? )?\((defined in )?ActiveFacts::API::Entity::ClassMethods[) ]/,
174
+ :class_methods => EntityType_methods,
175
+ :instance_methods => Entity_methods,
176
+ :constructor_args => [ 'bar', {:foo => 'foo', :baz => 'baz'} ]
177
+ },
178
+
179
+ ]
180
+
181
+ Cases.each do |casehash|
182
+ case_name = casehash[:name]
183
+ definition = "module Mod; "+ casehash[:definition] + "; end"
184
+ pattern = casehash[:pattern]
185
+ class_methods = casehash[:class_methods]
186
+ instance_methods = casehash[:instance_methods]
187
+ constructor_args = casehash[:constructor_args]
188
+
189
+ describe "#{case_name}" do
190
+ before :each do
191
+ eval definition
192
+ all_T_methods = Mod::T.methods.select{|m| Mod::T.method(m).inspect =~ /ActiveFacts/}.map(&:to_s).sort
193
+ @object_type_methods, @value_type_methods =
194
+ *all_T_methods.partition do |m|
195
+ Mod::T.method(m).inspect =~ /Method: Class(#[a-z_0-9]*[?=]? )?\((defined in )?ActiveFacts::API::ObjectType[) ]/
196
+ end
197
+ end
198
+
199
+ describe "as an ObjectType" do
200
+ it "should have the appropriate class methods" do
201
+ @object_type_methods.should == ObjectType_methods.map(&:to_s).sort
202
+ end
203
+
204
+ ObjectType_methods.each do |m|
205
+ it "should respond to ObjectType.#{m}" do
206
+ Mod::T.should respond_to(m)
207
+ Mod::T.method(m).inspect.should =~ /Method: Class(#[a-z_0-9]*[?=]? )?\((defined in )?ActiveFacts::API::ObjectType[) ]/
208
+ end
209
+ end
210
+ end
211
+
212
+ describe "as #{case_name}" do
213
+ it "should have the appropriate class methods" do
214
+ @value_type_methods.should == class_methods.map(&:to_s).sort
215
+ end
216
+
217
+ class_methods.each do |m|
218
+ it "should respond to #{case_name}.#{m}" do
219
+ Mod::T.should respond_to(m)
220
+ Mod::T.method(m).inspect.should =~ pattern
221
+ end
222
+ end
223
+ end
224
+
225
+ describe "when instantiated" do
226
+ before :each do
227
+ @instance = @constellation.T(*constructor_args)
228
+ end
229
+
230
+ it "should be ok" do
231
+ @instance.should_not be_nil
232
+ end
233
+
234
+ if @instance
235
+ end
236
+ end
237
+
238
+ describe "An instance of #{case_name}" do
239
+ before :each do
240
+ @v = @constellation.T(*constructor_args)
241
+ all_T_instance_methods = @v.methods.select do |m|
242
+ i = @v.method(m).inspect
243
+ i =~ /ActiveFacts/ || i =~ /identifying_role_values/
244
+ end.sort.map(&:to_sym)
245
+ @actual_instance_methods = all_T_instance_methods
246
+ end
247
+
248
+ it "should have the appropriate instance methods" do
249
+ # @actual_instance_methods.should == instance_methods.map(&:to_s).sort
250
+ # Weaken our expectation to just that nothing should be missing (extra methods are ok)
251
+ missing_methods = instance_methods - @actual_instance_methods
252
+ missing_methods.should == []
253
+ end
254
+
255
+ instance_methods.each do |m|
256
+ it "should respond to #{case_name}\##{m}" do
257
+ v = @constellation.T(*constructor_args)
258
+ v.should respond_to(m)
259
+ if Instance_methods.include?(m)
260
+ v.method(m).inspect.should =~ /Mod::T(#[a-z_0-9]*[?=]? )?\((defined in )?ActiveFacts::API::Instance[) ]/
261
+ else
262
+ v.method(m).inspect.should =~ /Mod::T(#[a-z_0-9]*[?=]? )?\((defined in )?ActiveFacts::API::(Value|Entity)[) ]/
263
+ end
264
+ end
265
+ end
266
+ end
267
+ end
268
+ end
269
+ end
@@ -22,9 +22,8 @@ module TestMultiPartIdentifierModule
22
22
  end
23
23
 
24
24
  describe "Multi-part identifiers" do
25
- include ActiveFacts::API
26
25
  before :each do
27
- @c = Constellation.new(TestMultiPartIdentifierModule)
26
+ @c = ActiveFacts::API::Constellation.new(TestMultiPartIdentifierModule)
28
27
  @p = @c.Parent(:new)
29
28
  @c0 = @c.Child(@p, 0)
30
29
  @c2 = @c.Child(@p, 2)
@@ -24,8 +24,8 @@ describe "AutoCounter Value Type instances" do
24
24
  end
25
25
  end
26
26
  @constellation = ActiveFacts::API::Constellation.new(Mod)
27
- @thing = Mod::Thing.new(:new)
28
- @thing_id = Mod::ThingId.new
27
+ @thing = @constellation.Thing(:new)
28
+ @thing_id = @constellation.ThingId(:new)
29
29
  end
30
30
 
31
31
  it "should respond to verbalise" do
@@ -61,8 +61,8 @@ describe "AutoCounter Value Type instances" do
61
61
  end
62
62
 
63
63
  it "should allow an existing counter to be re-used" do
64
- @new_thing = Mod::Thing.new(@thing_id)
65
- @new_thing.thing_id.should == @thing_id
64
+ @new_thing = @constellation.Thing(@thing_id)
65
+ @new_thing.thing_id.to_s.should == @thing_id.to_s
66
66
  end
67
67
 
68
68
  it "should return the ValueType in response to .class()" do
@@ -14,7 +14,7 @@ describe Date do
14
14
 
15
15
  it "should construct with a nil argument" do
16
16
  proc {
17
- @d = Date.new(nil)
17
+ @d = Date.new_instance(nil, nil)
18
18
  }.should_not raise_error
19
19
  @d.year.should == -4712
20
20
  end
@@ -24,8 +24,8 @@ describe "Guid Value Type instances" do
24
24
  end
25
25
  end
26
26
  @constellation = ActiveFacts::API::Constellation.new(Mod)
27
- @thing = Mod::Thing.new(:new)
28
- @thing_id = Mod::ThingId.new
27
+ @thing = @constellation.Thing(:new)
28
+ @thing_id = @constellation.ThingId(:new)
29
29
  end
30
30
 
31
31
  it "should respond to verbalise" do
@@ -51,7 +51,7 @@ describe "Guid Value Type instances" do
51
51
  end
52
52
 
53
53
  it "should allow an existing guid to be re-used" do
54
- @new_thing = Mod::Thing.new(@thing_id)
54
+ @new_thing = @constellation.Thing(@thing_id)
55
55
  @new_thing.thing_id.should == @thing_id
56
56
  end
57
57
 
@@ -105,7 +105,8 @@ describe "Value Type class definitions" do
105
105
  end
106
106
 
107
107
  it "should allow configuration of Role value through constructor using role name" do
108
- w = Mod::Weight.new(9.0, :name => "pounds")
108
+ c = ActiveFacts::API::Constellation.new(Mod)
109
+ w = c.Weight(9.0, :name => "pounds")
109
110
  w.name.should == "pounds"
110
111
  end
111
112
  end
@@ -1,8 +1,9 @@
1
1
  require 'simplecov'
2
- require 'activefacts/api'
3
-
4
2
 
5
3
  SimpleCov.start do
6
4
  add_filter "/spec/"
7
5
  add_filter "/lib/activefacts/tracer.rb"
8
6
  end
7
+
8
+ # N.B. This must be loaded after SimpleCov.start
9
+ require 'activefacts/api'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activefacts-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 0.9.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-01 00:00:00.000000000 Z
12
+ date: 2013-01-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -205,6 +205,7 @@ files:
205
205
  - activefacts-api.gemspec
206
206
  - lib/activefacts/api.rb
207
207
  - lib/activefacts/api/constellation.rb
208
+ - lib/activefacts/api/date.rb
208
209
  - lib/activefacts/api/entity.rb
209
210
  - lib/activefacts/api/exceptions.rb
210
211
  - lib/activefacts/api/guid.rb
@@ -228,6 +229,7 @@ files:
228
229
  - spec/identification_scheme/identification_spec.rb
229
230
  - spec/identification_scheme/identity_change_spec.rb
230
231
  - spec/identification_scheme/identity_supertype_change_spec.rb
232
+ - spec/metadata_spec.rb
231
233
  - spec/object_type/entity_type/entity_type_spec.rb
232
234
  - spec/object_type/entity_type/multipart_identification_spec.rb
233
235
  - spec/object_type/value_type/autocounter_spec.rb
@@ -253,7 +255,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
253
255
  version: '0'
254
256
  segments:
255
257
  - 0
256
- hash: 1877620921052571193
258
+ hash: -4472389217963530963
257
259
  required_rubygems_version: !ruby/object:Gem::Requirement
258
260
  none: false
259
261
  requirements: