lims-core 3.2.3

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.
Files changed (177) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +5 -0
  3. data/.rspec +1 -0
  4. data/.rvmrc +2 -0
  5. data/.travis.yml +2 -0
  6. data/.vimrc +27 -0
  7. data/.yard_templates/default/layout/html/footer.erb +0 -0
  8. data/.yardopts +1 -0
  9. data/Gemfile +54 -0
  10. data/Gemfile.lock +197 -0
  11. data/Guardfile +21 -0
  12. data/Guardfile.tmux +28 -0
  13. data/README.markdown +67 -0
  14. data/Rakefile +16 -0
  15. data/config/database.yml +16 -0
  16. data/doc/Array.html +116 -0
  17. data/doc/Array/ArrayLoggerPersistor.html +152 -0
  18. data/doc/Lims.html +114 -0
  19. data/doc/Lims/Core.html +178 -0
  20. data/doc/Lims/Core/Action.html +91 -0
  21. data/doc/Lims/Core/Actions.html +116 -0
  22. data/doc/Lims/Core/Actions/Action.html +216 -0
  23. data/doc/Lims/Core/Actions/Action/AfterEval.html +853 -0
  24. data/doc/Lims/Core/Actions/Action/InvalidParameters.html +268 -0
  25. data/doc/Lims/Core/Actions/ActionGroup.html +196 -0
  26. data/doc/Lims/Core/Actions/ActionGroup/AfterEval.html +315 -0
  27. data/doc/Lims/Core/Actions/BulkAction.html +224 -0
  28. data/doc/Lims/Core/Actions/BulkAction/AfterEval.html +253 -0
  29. data/doc/Lims/Core/Actions/TestActionGroup.html +101 -0
  30. data/doc/Lims/Core/Actions/TestActionGroup/Action.html +133 -0
  31. data/doc/Lims/Core/Actions/TestActionGroup/ActionGroup.html +127 -0
  32. data/doc/Lims/Core/Base.html +287 -0
  33. data/doc/Lims/Core/Base/AccessibleViaSuper.html +252 -0
  34. data/doc/Lims/Core/Base/ClassMethod.html +177 -0
  35. data/doc/Lims/Core/Base/HashString.html +177 -0
  36. data/doc/Lims/Core/Base/IsArrayOf.html +606 -0
  37. data/doc/Lims/Core/Base/State.html +130 -0
  38. data/doc/Lims/Core/Organization.html +113 -0
  39. data/doc/Lims/Core/Organization/Batch.html +106 -0
  40. data/doc/Lims/Core/Persistence.html +267 -0
  41. data/doc/Lims/Core/Persistence/ComparisonFilter.html +318 -0
  42. data/doc/Lims/Core/Persistence/Filter.html +252 -0
  43. data/doc/Lims/Core/Persistence/IdentityMap.html +409 -0
  44. data/doc/Lims/Core/Persistence/IdentityMap/Class.html +144 -0
  45. data/doc/Lims/Core/Persistence/IdentityMap/DuplicateError.html +126 -0
  46. data/doc/Lims/Core/Persistence/IdentityMap/DuplicateIdError.html +136 -0
  47. data/doc/Lims/Core/Persistence/IdentityMap/DuplicateObjectError.html +136 -0
  48. data/doc/Lims/Core/Persistence/IdentityMapClass.html +133 -0
  49. data/doc/Lims/Core/Persistence/Logger.html +105 -0
  50. data/doc/Lims/Core/Persistence/Logger/Persistor.html +334 -0
  51. data/doc/Lims/Core/Persistence/Logger/Session.html +452 -0
  52. data/doc/Lims/Core/Persistence/Logger/Store.html +470 -0
  53. data/doc/Lims/Core/Persistence/MessageBus.html +871 -0
  54. data/doc/Lims/Core/Persistence/MessageBus/ConnectionError.html +123 -0
  55. data/doc/Lims/Core/Persistence/MessageBus/InvalidSettingsError.html +122 -0
  56. data/doc/Lims/Core/Persistence/MultiCriteriaFilter.html +293 -0
  57. data/doc/Lims/Core/Persistence/PersistAssociationTrait.html +91 -0
  58. data/doc/Lims/Core/Persistence/PersistableTrait.html +91 -0
  59. data/doc/Lims/Core/Persistence/Persistor.html +3072 -0
  60. data/doc/Lims/Core/Persistence/Persistor/DuplicateError.html +205 -0
  61. data/doc/Lims/Core/Persistence/Persistor/DuplicateIdError.html +147 -0
  62. data/doc/Lims/Core/Persistence/Persistor/DuplicateObjectError.html +147 -0
  63. data/doc/Lims/Core/Persistence/PersistorTrait.html +91 -0
  64. data/doc/Lims/Core/Persistence/ResourceState.html +1738 -0
  65. data/doc/Lims/Core/Persistence/Search.html +269 -0
  66. data/doc/Lims/Core/Persistence/Search/CreateSearch.html +251 -0
  67. data/doc/Lims/Core/Persistence/Search/SearchPersistor.html +240 -0
  68. data/doc/Lims/Core/Persistence/Search/SearchSequelPersistor.html +396 -0
  69. data/doc/Lims/Core/Persistence/Sequel.html +117 -0
  70. data/doc/Lims/Core/Persistence/Sequel/Filters.html +462 -0
  71. data/doc/Lims/Core/Persistence/Sequel/ForTest.html +101 -0
  72. data/doc/Lims/Core/Persistence/Sequel/ForTest/Name.html +137 -0
  73. data/doc/Lims/Core/Persistence/Sequel/ForTest/Name/NamePersitor.html +143 -0
  74. data/doc/Lims/Core/Persistence/Sequel/Migrations.html +266 -0
  75. data/doc/Lims/Core/Persistence/Sequel/Persistor.html +665 -0
  76. data/doc/Lims/Core/Persistence/Sequel/Session.html +501 -0
  77. data/doc/Lims/Core/Persistence/Sequel/Store.html +417 -0
  78. data/doc/Lims/Core/Persistence/Session.html +2751 -0
  79. data/doc/Lims/Core/Persistence/Session/UnmanagedObjectError.html +111 -0
  80. data/doc/Lims/Core/Persistence/StateGroup.html +696 -0
  81. data/doc/Lims/Core/Persistence/StateList.html +498 -0
  82. data/doc/Lims/Core/Persistence/Store.html +695 -0
  83. data/doc/Lims/Core/Persistence/UuidResource.html +1044 -0
  84. data/doc/Lims/Core/Persistence/UuidResource/InvalidUuidError.html +111 -0
  85. data/doc/Lims/Core/Persistence/UuidResource/UuidResourcePersistor.html +337 -0
  86. data/doc/Lims/Core/Persistence/Uuidable.html +799 -0
  87. data/doc/Lims/Core/Persistor.html +320 -0
  88. data/doc/Lims/Core/Resource.html +165 -0
  89. data/doc/Object.html +228 -0
  90. data/doc/SessionSpec.html +101 -0
  91. data/doc/SessionSpec/Model.html +279 -0
  92. data/doc/SessionSpec/Model/ModelPersistor.html +327 -0
  93. data/doc/_index.html +732 -0
  94. data/doc/class_list.html +47 -0
  95. data/doc/css/common.css +1 -0
  96. data/doc/css/full_list.css +55 -0
  97. data/doc/css/style.css +322 -0
  98. data/doc/file.README.html +127 -0
  99. data/doc/file_list.html +49 -0
  100. data/doc/frames.html +13 -0
  101. data/doc/index.html +127 -0
  102. data/doc/js/app.js +205 -0
  103. data/doc/js/full_list.js +167 -0
  104. data/doc/js/jquery.js +16 -0
  105. data/doc/method_list.html +1894 -0
  106. data/doc/top-level-namespace.html +100 -0
  107. data/lib/common.rb +18 -0
  108. data/lib/lims-core.rb +29 -0
  109. data/lib/lims-core/actions.rb +10 -0
  110. data/lib/lims-core/actions/action.rb +185 -0
  111. data/lib/lims-core/actions/action_group.rb +54 -0
  112. data/lib/lims-core/actions/bulk_action.rb +65 -0
  113. data/lib/lims-core/base.rb +132 -0
  114. data/lib/lims-core/helpers.rb +41 -0
  115. data/lib/lims-core/persistence.rb +15 -0
  116. data/lib/lims-core/persistence/comparison_filter.rb +54 -0
  117. data/lib/lims-core/persistence/filter.rb +23 -0
  118. data/lib/lims-core/persistence/identity_map.rb +55 -0
  119. data/lib/lims-core/persistence/logger/all.rb +5 -0
  120. data/lib/lims-core/persistence/logger/persistor.rb +35 -0
  121. data/lib/lims-core/persistence/logger/session.rb +30 -0
  122. data/lib/lims-core/persistence/logger/store.rb +37 -0
  123. data/lib/lims-core/persistence/message_bus.rb +131 -0
  124. data/lib/lims-core/persistence/multi_criteria_filter.rb +50 -0
  125. data/lib/lims-core/persistence/persist_association_trait.rb +96 -0
  126. data/lib/lims-core/persistence/persistable_trait.rb +150 -0
  127. data/lib/lims-core/persistence/persistor.rb +495 -0
  128. data/lib/lims-core/persistence/resource_state.rb +157 -0
  129. data/lib/lims-core/persistence/search.rb +3 -0
  130. data/lib/lims-core/persistence/search/all.rb +3 -0
  131. data/lib/lims-core/persistence/search/create_search.rb +55 -0
  132. data/lib/lims-core/persistence/search/search_persistor.rb +45 -0
  133. data/lib/lims-core/persistence/search/search_sequel_persistor.rb +40 -0
  134. data/lib/lims-core/persistence/sequel.rb +14 -0
  135. data/lib/lims-core/persistence/sequel/filters.rb +106 -0
  136. data/lib/lims-core/persistence/sequel/migrations.rb +14 -0
  137. data/lib/lims-core/persistence/sequel/migrations/add_audit_tables.rb +147 -0
  138. data/lib/lims-core/persistence/sequel/migrations/initial.rb +156 -0
  139. data/lib/lims-core/persistence/sequel/persistor.rb +200 -0
  140. data/lib/lims-core/persistence/sequel/session.rb +136 -0
  141. data/lib/lims-core/persistence/sequel/store.rb +37 -0
  142. data/lib/lims-core/persistence/session.rb +409 -0
  143. data/lib/lims-core/persistence/state_group.rb +97 -0
  144. data/lib/lims-core/persistence/state_list.rb +56 -0
  145. data/lib/lims-core/persistence/store.rb +73 -0
  146. data/lib/lims-core/persistence/uuid_resource.rb +115 -0
  147. data/lib/lims-core/persistence/uuid_resource_persistor.rb +43 -0
  148. data/lib/lims-core/persistence/uuidable.rb +107 -0
  149. data/lib/lims-core/resource.rb +21 -0
  150. data/lib/lims-core/subclass_tracker.rb +30 -0
  151. data/lib/lims-core/version.rb +5 -0
  152. data/lims-core.gemspec +40 -0
  153. data/makefile +52 -0
  154. data/showoff/core-2012-06-11/core/01_slide.md +237 -0
  155. data/showoff/core-2012-06-11/core/02_slide.md +110 -0
  156. data/showoff/core-2012-06-11/custom.css +44 -0
  157. data/showoff/core-2012-06-11/main/01_slide.md +53 -0
  158. data/showoff/core-2012-06-11/showoff.json +10 -0
  159. data/showoff/core-2012-06-11/tp1.tpl +1 -0
  160. data/spec/actions/action_group_spec.rb +39 -0
  161. data/spec/actions/spec_helper.rb +1 -0
  162. data/spec/persistence/identity_map_spec.rb +55 -0
  163. data/spec/persistence/logger/spec_helper.rb +7 -0
  164. data/spec/persistence/logger/store_spec.rb +48 -0
  165. data/spec/persistence/message_bus_spec.rb +76 -0
  166. data/spec/persistence/sequel/session_spec.rb +125 -0
  167. data/spec/persistence/sequel/spec_helper.rb +39 -0
  168. data/spec/persistence/sequel/store_shared.rb +25 -0
  169. data/spec/persistence/sequel/store_spec.rb +22 -0
  170. data/spec/persistence/session_spec.rb +199 -0
  171. data/spec/persistence/spec_helper.rb +2 -0
  172. data/spec/persistence/uuid_resource_spec.rb +80 -0
  173. data/spec/spec_helper.rb +10 -0
  174. data/spec/subclass_tracker_sperc.rb +62 -0
  175. data/utils/constant_tree.rb +29 -0
  176. data/utils/stack.rb +48 -0
  177. metadata +402 -0
@@ -0,0 +1,39 @@
1
+ require 'persistence/spec_helper'
2
+ require 'yaml'
3
+ require 'sequel'
4
+
5
+ module Helper
6
+ def save(object)
7
+ store.with_session do |session|
8
+ session << object
9
+ lambda { session.id_for(object) }
10
+ end.call
11
+ end
12
+ end
13
+
14
+ RSpec.configure do |c|
15
+ c.include Helper
16
+ end
17
+
18
+ if RUBY_PLATFORM == "java"
19
+ require 'jdbc/sqlite3'
20
+ shared_context "sqlite db" do |&block|
21
+ let(:db) { ::Sequel.connect('jdbc:sqlite::memory:') }
22
+ end
23
+ else
24
+ shared_context "sqlite db" do
25
+ let!(:db) { ::Sequel.sqlite('') }
26
+ end
27
+ end
28
+
29
+ config_database = YAML.load_file(File.join("config", "database.yml"))
30
+ ENV["LIMS_SUPPORT_ENV"] = "development" unless ENV["LIMS_SUPPORT_ENV"]
31
+ env = ENV["LIMS_SUPPORT_ENV"]
32
+ connection_params = config_database['test_mysql']
33
+
34
+ shared_context "mysql db" do |&block|
35
+ let!(:db) { ::Sequel.connect(connection_params) }
36
+ let(:store) { Lims::Core::Persistence::Sequel::Store.new(db) }
37
+ end
38
+
39
+
@@ -0,0 +1,25 @@
1
+
2
+ # Spec requirements
3
+ require 'spec_helper'
4
+
5
+ # Model requirements
6
+ require 'sequel'
7
+ require 'lims-core/persistence/sequel/store'
8
+ Sequel.extension :migration
9
+
10
+ shared_context "prepare tables" do
11
+ def prepare_table(db)
12
+ Sequel::Migrator.run(db, 'db/migrations')
13
+ end
14
+ end
15
+
16
+ Loggers = []
17
+ #require 'logger'; Loggers << Logger.new($stdout)
18
+
19
+ shared_context "sequel store" do
20
+ include_context "prepare tables"
21
+ let(:db) { Sequel.sqlite '' , :loggers => Loggers }
22
+ let(:store) { Lims::Core::Persistence::Sequel::Store.new(db) }
23
+ before (:each) { prepare_table(db) }
24
+
25
+ end
@@ -0,0 +1,22 @@
1
+ # Spec requirements
2
+ require 'persistence/sequel/spec_helper'
3
+
4
+ # Model requirements
5
+ require 'lims-core/persistence/sequel/store'
6
+
7
+ module Lims::Core::Persistence
8
+ describe Sequel::Store, :store => true, :persistence => true, :persistence => true, :sequel => true do
9
+ context "initialized with a valid database" do
10
+ include_context "sqlite db"
11
+ it "must be valid" do
12
+ expect { described_class.new(db) }.to_not raise_error
13
+ end
14
+ end
15
+
16
+ context "initialized with something elese" do
17
+ it "must be invalid" do
18
+ expect { described_class.new("my database") }.to raise_error
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,199 @@
1
+ # Spec requirements
2
+ require 'persistence/spec_helper'
3
+
4
+ # Model requirements
5
+ require 'lims-core/persistence/store'
6
+ require 'lims-core/persistence/session'
7
+
8
+
9
+ module SessionSpec
10
+ class Model
11
+ include Lims::Core::Resource
12
+ attribute :value, String
13
+
14
+ def initialize(args)
15
+ case args
16
+ when String then @value = args
17
+ else
18
+ super(args)
19
+ end
20
+ end
21
+ def attributesX
22
+ {:nesting => {:value => @value} }
23
+ end
24
+
25
+ class ModelPersistor < Lims::Core::Persistence::Persistor
26
+ Model = SessionSpec::Model
27
+ @@objects ={}
28
+ def self.register(key, value)
29
+ key ||= @@objects.size + 1
30
+ @@objects[key] = value
31
+ key
32
+ end
33
+
34
+ def bulk_load(states, *params, &block)
35
+ states.map { |state| block.call(@@objects[state.id].attributes.merge(id:state.id)) }
36
+ end
37
+
38
+ def self.clear()
39
+ @@objects ={}
40
+ end
41
+
42
+ end
43
+ end
44
+
45
+
46
+ shared_examples "doesn't save 'clean' objects" do
47
+ it "doesn't save read objects" do
48
+ store.with_session do |session|
49
+ loaded = session.model[1]
50
+ loaded.should == a # test the test works !
51
+ Model::ModelPersistor.any_instance.should_not_receive(:insert) do |state|
52
+ state.resource.should == a
53
+ end
54
+ Model::ModelPersistor.any_instance.should_receive(:insert) do |state|
55
+ state.resource.should == b
56
+ end
57
+ session << loaded << b
58
+ end
59
+ end
60
+ it "updates 'dirty' objects" do
61
+ store.with_session do |session|
62
+ loaded = session.model[1]
63
+ loaded.value = "new value"
64
+ Model::ModelPersistor.any_instance.should_not_receive(:insert) do |state|
65
+ state.resource.should == a
66
+ end
67
+ Model::ModelPersistor.any_instance.should_receive(:bulk_update) do |states|
68
+ states.size == 1
69
+ states.first.resource.should == loaded
70
+ 1
71
+ end
72
+ Model::ModelPersistor.any_instance.should_receive(:insert) do |state|
73
+ state.resource.should == b
74
+ 2
75
+ end
76
+ session << loaded << b
77
+ end
78
+ end
79
+ end
80
+
81
+ module Lims::Core::Persistence
82
+ describe Session, :session => true, :persistence => true, :persistence => true do
83
+ let(:store) { Store.new() }
84
+
85
+ context "#transaction" do
86
+ let(:a) { Model.new("A") }
87
+ let(:b) { Model.new("B") }
88
+ let(:c) { Model.new("C") }
89
+
90
+ it "save the 2 if no problem" do
91
+ Model::ModelPersistor.any_instance.should_receive(:insert) do |state|
92
+ state.resource.should == a
93
+ end
94
+ Model::ModelPersistor.any_instance.should_receive(:insert) do |state|
95
+ state.resource.should == b
96
+ end
97
+ store.with_session do |session|
98
+ session << a << b
99
+ end
100
+ end
101
+
102
+ context "#dirty attribute strategy" do
103
+ # Mock session and persistor to load object
104
+ let!(:persistor_class) {
105
+ Session.stub(:model_for) { Model }
106
+ Session.stub(:persistor_class_for).with(Model) do
107
+ Model::ModelPersistor::clear()
108
+ Model::ModelPersistor::register(1, a)
109
+ Model::ModelPersistor::register(2, b)
110
+ Model::ModelPersistor
111
+ end
112
+ }
113
+ context "no strategy" do
114
+ it "save read objects" do
115
+ store.with_session do |session|
116
+ session.dirty_attribute_strategy = nil
117
+ loaded = session.model[1];
118
+ loaded.should == a # test the test works !
119
+ Model::ModelPersistor.any_instance.should_not_receive(:bulk_update) do |states|
120
+ states.size == 1
121
+ states.first.resource.should == a
122
+ 1
123
+ end
124
+ Model::ModelPersistor.any_instance.should_receive(:bulk_insert) do |states|
125
+ states.map(&:resource).should include b
126
+ states.map(&:resource).should_not include a
127
+ 2
128
+ end
129
+ session << loaded << b
130
+ end
131
+ end
132
+ end
133
+
134
+ context "deep copy strategy" do
135
+ before(:each) { store.dirty_attribute_strategy = Store::DIRTY_ATTRIBUTE_STRATEGY_DEEP_COPY }
136
+ include_context "doesn't save 'clean' objects"
137
+ end
138
+ context "sha1 strategy" do
139
+ before(:each) { store.dirty_attribute_strategy = Store::DIRTY_ATTRIBUTE_STRATEGY_SHA1 }
140
+ include_context "doesn't save 'clean' objects"
141
+ end
142
+ context "md5 strategy", :focus => true do
143
+ before(:each) { store.dirty_attribute_strategy = Store::DIRTY_ATTRIBUTE_STRATEGY_MD5 }
144
+ include_context "doesn't save 'clean' objects"
145
+ end
146
+ end
147
+
148
+ context "#nested" do
149
+ before(:each) {
150
+ Model::ModelPersistor.any_instance.stub(:insert) do |state|
151
+ # We stub insert to register object so they can be reloaded.
152
+ # However, the registration is a class method therefore common
153
+ # to all Persistor. That should work because an new id is given
154
+ # even if the object has already been registered from another Persistor.
155
+ state.inserted(Model::ModelPersistor::register(nil, state.resource))
156
+ end
157
+ }
158
+ it "share object states with parent" do
159
+ store.with_session do |session|
160
+ session << a
161
+
162
+ session.with_subsession do |sub_session|
163
+ session.state_for(a).should equal(sub_session.state_for(a))
164
+ end
165
+ end
166
+ end
167
+
168
+ it "can access object from children session " do
169
+ store.with_session do |session|
170
+ id = session.with_subsession do |sub_session|
171
+ sub_session << a
172
+ lambda { sub_session.id_for(a) }
173
+ end.call
174
+ session.model[id].should equal(a)
175
+
176
+ store.with_session do |sub_session|
177
+ end
178
+ end
179
+ end
180
+
181
+ it "saves object in corresponding transaction" do
182
+ last_session = store.with_session do |session|
183
+ session << a
184
+ session.with_subsession do |sub_session|
185
+ sub_session << b
186
+ end
187
+
188
+ session.state_for(a).new?.should == true # not saved yet
189
+ session.state_for(b).new?.should == false # saved by now
190
+
191
+ session
192
+ end
193
+ last_session.state_for(a).new?.should == false # saved by now
194
+ end
195
+ end
196
+ end
197
+ end
198
+ end
199
+ end
@@ -0,0 +1,2 @@
1
+ require 'spec_helper'
2
+
@@ -0,0 +1,80 @@
1
+ # vi: ts=2:sts=2:et:sw=2 spell:spelllang=en
2
+ require 'persistence/spec_helper'
3
+
4
+ require 'lims-core/persistence/uuid_resource'
5
+
6
+ module Lims::Core
7
+ module Persistence
8
+ describe UuidResource, :uuid_resource => true, :uuid => true, :persistence => true do
9
+ context "#class" do
10
+ subject { UuidResource }
11
+ it "validates valid uuid" do
12
+ subject.valid?("12345678-abcd-1234-ABCD-1234567890ab").should be_true
13
+ end
14
+
15
+ it "invalidates unvaild uuid" do
16
+ subject.valid?("12345678-Zbcd-1234-ABCD-1234567890ab").should be_false
17
+ subject.valid?("12345678-Zbcd-1234-ABCD-1234567890").should be_false
18
+ subject.valid?("I am not a uuid").should be_false
19
+ end
20
+
21
+ it "generates a UUID" do
22
+ subject.valid?(subject.generate_uuid()).should be_true
23
+ end
24
+
25
+ it "generates different UUID" do
26
+ u1,u2 = 2.times { subject.generate_uuid()}
27
+ u1.should_not == u2
28
+ end
29
+
30
+ context "#conversion" do
31
+ context "to packed string" do
32
+ let(:to_pack) { "41424344-4546-4748-6162-636465666768" }
33
+ let(:packed) { "ABCDEFGHabcdefgh" }
34
+
35
+ it "pack" do
36
+ subject.pack(to_pack).should == packed
37
+ end
38
+
39
+ it "unpack" do
40
+ subject.unpack(packed).should == to_pack
41
+ end
42
+ it "converts unpacked to valid string" do
43
+ subject.valid?(subject.unpack(packed))
44
+ end
45
+ end
46
+ context "to bignum" do
47
+ let(:bignum) { 0x12345678abcd1234abcd1234567890ab }
48
+ let(:string) { "12345678-abcd-1234-abcd-1234567890ab" }
49
+
50
+ it "converts string to bignum" do
51
+ subject.string_to_bignum(string).should == bignum
52
+ end
53
+
54
+ it "converts bignum to string" do
55
+ subject.bignum_to_string(bignum).should == string
56
+ end
57
+ it "converts bignum to valid string" do
58
+ subject.valid?(subject.bignum_to_string(bignum))
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+
65
+ context "created without an uuid" do
66
+ subject { described_class.new(:modeli => "model", :key => 1) }
67
+ it "should create an new uuid" do
68
+ subject.uuid.should_not be_nil
69
+ end
70
+ end
71
+ context "created with an uuid" do
72
+ let(:uuid) { UuidResource.generate_uuid }
73
+ subject { described_class.new(:model => "model", :key => 1, :uuid => uuid) }
74
+ it "keeps the same uuid" do
75
+ subject.uuid.should == uuid
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,10 @@
1
+ shared_examples "requires" do |attribute|
2
+ context "without #{attribute}" do
3
+ let(:excluded_parameters) { [attribute] }
4
+ it "'s not valid" do
5
+ subject.valid?.should == false
6
+ end
7
+ end
8
+
9
+ end
10
+
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ require 'lims-core/subclass_tracker'
4
+
5
+
6
+ module SubclassTrackerTest
7
+ class A
8
+ extend Lims::Core::SubclassTracker
9
+ end
10
+
11
+ class B < A
12
+ end
13
+
14
+ class B2 < A
15
+ end
16
+
17
+ class C < B
18
+ end
19
+
20
+ module M
21
+ extend Lims::Core::SubclassTracker
22
+ end
23
+
24
+ class N
25
+ include M
26
+ end
27
+
28
+ class N2
29
+ include M
30
+ end
31
+
32
+ class O < N
33
+ end
34
+
35
+ class O2 < N2
36
+ end
37
+
38
+ describe Lims::Core::SubclassTracker do
39
+ context "track classes" do
40
+ subject { A }
41
+
42
+ it "responds to subclasses" do
43
+ subject.should respond_to(:subclasses)
44
+ end
45
+
46
+ it "list its children" do
47
+ subject.subclasses.should == [B, B2, C]
48
+ end
49
+ end
50
+
51
+ context "track modules" do
52
+ subject { M }
53
+ it "responds to subclasses" do
54
+ subject.should respond_to(:subclasses)
55
+ end
56
+
57
+ it "list its children" do
58
+ subject.subclasses.should == [N, N2, O, O2]
59
+ end
60
+ end
61
+ end
62
+ end