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.
- checksums.yaml +15 -0
- data/.gitignore +5 -0
- data/.rspec +1 -0
- data/.rvmrc +2 -0
- data/.travis.yml +2 -0
- data/.vimrc +27 -0
- data/.yard_templates/default/layout/html/footer.erb +0 -0
- data/.yardopts +1 -0
- data/Gemfile +54 -0
- data/Gemfile.lock +197 -0
- data/Guardfile +21 -0
- data/Guardfile.tmux +28 -0
- data/README.markdown +67 -0
- data/Rakefile +16 -0
- data/config/database.yml +16 -0
- data/doc/Array.html +116 -0
- data/doc/Array/ArrayLoggerPersistor.html +152 -0
- data/doc/Lims.html +114 -0
- data/doc/Lims/Core.html +178 -0
- data/doc/Lims/Core/Action.html +91 -0
- data/doc/Lims/Core/Actions.html +116 -0
- data/doc/Lims/Core/Actions/Action.html +216 -0
- data/doc/Lims/Core/Actions/Action/AfterEval.html +853 -0
- data/doc/Lims/Core/Actions/Action/InvalidParameters.html +268 -0
- data/doc/Lims/Core/Actions/ActionGroup.html +196 -0
- data/doc/Lims/Core/Actions/ActionGroup/AfterEval.html +315 -0
- data/doc/Lims/Core/Actions/BulkAction.html +224 -0
- data/doc/Lims/Core/Actions/BulkAction/AfterEval.html +253 -0
- data/doc/Lims/Core/Actions/TestActionGroup.html +101 -0
- data/doc/Lims/Core/Actions/TestActionGroup/Action.html +133 -0
- data/doc/Lims/Core/Actions/TestActionGroup/ActionGroup.html +127 -0
- data/doc/Lims/Core/Base.html +287 -0
- data/doc/Lims/Core/Base/AccessibleViaSuper.html +252 -0
- data/doc/Lims/Core/Base/ClassMethod.html +177 -0
- data/doc/Lims/Core/Base/HashString.html +177 -0
- data/doc/Lims/Core/Base/IsArrayOf.html +606 -0
- data/doc/Lims/Core/Base/State.html +130 -0
- data/doc/Lims/Core/Organization.html +113 -0
- data/doc/Lims/Core/Organization/Batch.html +106 -0
- data/doc/Lims/Core/Persistence.html +267 -0
- data/doc/Lims/Core/Persistence/ComparisonFilter.html +318 -0
- data/doc/Lims/Core/Persistence/Filter.html +252 -0
- data/doc/Lims/Core/Persistence/IdentityMap.html +409 -0
- data/doc/Lims/Core/Persistence/IdentityMap/Class.html +144 -0
- data/doc/Lims/Core/Persistence/IdentityMap/DuplicateError.html +126 -0
- data/doc/Lims/Core/Persistence/IdentityMap/DuplicateIdError.html +136 -0
- data/doc/Lims/Core/Persistence/IdentityMap/DuplicateObjectError.html +136 -0
- data/doc/Lims/Core/Persistence/IdentityMapClass.html +133 -0
- data/doc/Lims/Core/Persistence/Logger.html +105 -0
- data/doc/Lims/Core/Persistence/Logger/Persistor.html +334 -0
- data/doc/Lims/Core/Persistence/Logger/Session.html +452 -0
- data/doc/Lims/Core/Persistence/Logger/Store.html +470 -0
- data/doc/Lims/Core/Persistence/MessageBus.html +871 -0
- data/doc/Lims/Core/Persistence/MessageBus/ConnectionError.html +123 -0
- data/doc/Lims/Core/Persistence/MessageBus/InvalidSettingsError.html +122 -0
- data/doc/Lims/Core/Persistence/MultiCriteriaFilter.html +293 -0
- data/doc/Lims/Core/Persistence/PersistAssociationTrait.html +91 -0
- data/doc/Lims/Core/Persistence/PersistableTrait.html +91 -0
- data/doc/Lims/Core/Persistence/Persistor.html +3072 -0
- data/doc/Lims/Core/Persistence/Persistor/DuplicateError.html +205 -0
- data/doc/Lims/Core/Persistence/Persistor/DuplicateIdError.html +147 -0
- data/doc/Lims/Core/Persistence/Persistor/DuplicateObjectError.html +147 -0
- data/doc/Lims/Core/Persistence/PersistorTrait.html +91 -0
- data/doc/Lims/Core/Persistence/ResourceState.html +1738 -0
- data/doc/Lims/Core/Persistence/Search.html +269 -0
- data/doc/Lims/Core/Persistence/Search/CreateSearch.html +251 -0
- data/doc/Lims/Core/Persistence/Search/SearchPersistor.html +240 -0
- data/doc/Lims/Core/Persistence/Search/SearchSequelPersistor.html +396 -0
- data/doc/Lims/Core/Persistence/Sequel.html +117 -0
- data/doc/Lims/Core/Persistence/Sequel/Filters.html +462 -0
- data/doc/Lims/Core/Persistence/Sequel/ForTest.html +101 -0
- data/doc/Lims/Core/Persistence/Sequel/ForTest/Name.html +137 -0
- data/doc/Lims/Core/Persistence/Sequel/ForTest/Name/NamePersitor.html +143 -0
- data/doc/Lims/Core/Persistence/Sequel/Migrations.html +266 -0
- data/doc/Lims/Core/Persistence/Sequel/Persistor.html +665 -0
- data/doc/Lims/Core/Persistence/Sequel/Session.html +501 -0
- data/doc/Lims/Core/Persistence/Sequel/Store.html +417 -0
- data/doc/Lims/Core/Persistence/Session.html +2751 -0
- data/doc/Lims/Core/Persistence/Session/UnmanagedObjectError.html +111 -0
- data/doc/Lims/Core/Persistence/StateGroup.html +696 -0
- data/doc/Lims/Core/Persistence/StateList.html +498 -0
- data/doc/Lims/Core/Persistence/Store.html +695 -0
- data/doc/Lims/Core/Persistence/UuidResource.html +1044 -0
- data/doc/Lims/Core/Persistence/UuidResource/InvalidUuidError.html +111 -0
- data/doc/Lims/Core/Persistence/UuidResource/UuidResourcePersistor.html +337 -0
- data/doc/Lims/Core/Persistence/Uuidable.html +799 -0
- data/doc/Lims/Core/Persistor.html +320 -0
- data/doc/Lims/Core/Resource.html +165 -0
- data/doc/Object.html +228 -0
- data/doc/SessionSpec.html +101 -0
- data/doc/SessionSpec/Model.html +279 -0
- data/doc/SessionSpec/Model/ModelPersistor.html +327 -0
- data/doc/_index.html +732 -0
- data/doc/class_list.html +47 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +55 -0
- data/doc/css/style.css +322 -0
- data/doc/file.README.html +127 -0
- data/doc/file_list.html +49 -0
- data/doc/frames.html +13 -0
- data/doc/index.html +127 -0
- data/doc/js/app.js +205 -0
- data/doc/js/full_list.js +167 -0
- data/doc/js/jquery.js +16 -0
- data/doc/method_list.html +1894 -0
- data/doc/top-level-namespace.html +100 -0
- data/lib/common.rb +18 -0
- data/lib/lims-core.rb +29 -0
- data/lib/lims-core/actions.rb +10 -0
- data/lib/lims-core/actions/action.rb +185 -0
- data/lib/lims-core/actions/action_group.rb +54 -0
- data/lib/lims-core/actions/bulk_action.rb +65 -0
- data/lib/lims-core/base.rb +132 -0
- data/lib/lims-core/helpers.rb +41 -0
- data/lib/lims-core/persistence.rb +15 -0
- data/lib/lims-core/persistence/comparison_filter.rb +54 -0
- data/lib/lims-core/persistence/filter.rb +23 -0
- data/lib/lims-core/persistence/identity_map.rb +55 -0
- data/lib/lims-core/persistence/logger/all.rb +5 -0
- data/lib/lims-core/persistence/logger/persistor.rb +35 -0
- data/lib/lims-core/persistence/logger/session.rb +30 -0
- data/lib/lims-core/persistence/logger/store.rb +37 -0
- data/lib/lims-core/persistence/message_bus.rb +131 -0
- data/lib/lims-core/persistence/multi_criteria_filter.rb +50 -0
- data/lib/lims-core/persistence/persist_association_trait.rb +96 -0
- data/lib/lims-core/persistence/persistable_trait.rb +150 -0
- data/lib/lims-core/persistence/persistor.rb +495 -0
- data/lib/lims-core/persistence/resource_state.rb +157 -0
- data/lib/lims-core/persistence/search.rb +3 -0
- data/lib/lims-core/persistence/search/all.rb +3 -0
- data/lib/lims-core/persistence/search/create_search.rb +55 -0
- data/lib/lims-core/persistence/search/search_persistor.rb +45 -0
- data/lib/lims-core/persistence/search/search_sequel_persistor.rb +40 -0
- data/lib/lims-core/persistence/sequel.rb +14 -0
- data/lib/lims-core/persistence/sequel/filters.rb +106 -0
- data/lib/lims-core/persistence/sequel/migrations.rb +14 -0
- data/lib/lims-core/persistence/sequel/migrations/add_audit_tables.rb +147 -0
- data/lib/lims-core/persistence/sequel/migrations/initial.rb +156 -0
- data/lib/lims-core/persistence/sequel/persistor.rb +200 -0
- data/lib/lims-core/persistence/sequel/session.rb +136 -0
- data/lib/lims-core/persistence/sequel/store.rb +37 -0
- data/lib/lims-core/persistence/session.rb +409 -0
- data/lib/lims-core/persistence/state_group.rb +97 -0
- data/lib/lims-core/persistence/state_list.rb +56 -0
- data/lib/lims-core/persistence/store.rb +73 -0
- data/lib/lims-core/persistence/uuid_resource.rb +115 -0
- data/lib/lims-core/persistence/uuid_resource_persistor.rb +43 -0
- data/lib/lims-core/persistence/uuidable.rb +107 -0
- data/lib/lims-core/resource.rb +21 -0
- data/lib/lims-core/subclass_tracker.rb +30 -0
- data/lib/lims-core/version.rb +5 -0
- data/lims-core.gemspec +40 -0
- data/makefile +52 -0
- data/showoff/core-2012-06-11/core/01_slide.md +237 -0
- data/showoff/core-2012-06-11/core/02_slide.md +110 -0
- data/showoff/core-2012-06-11/custom.css +44 -0
- data/showoff/core-2012-06-11/main/01_slide.md +53 -0
- data/showoff/core-2012-06-11/showoff.json +10 -0
- data/showoff/core-2012-06-11/tp1.tpl +1 -0
- data/spec/actions/action_group_spec.rb +39 -0
- data/spec/actions/spec_helper.rb +1 -0
- data/spec/persistence/identity_map_spec.rb +55 -0
- data/spec/persistence/logger/spec_helper.rb +7 -0
- data/spec/persistence/logger/store_spec.rb +48 -0
- data/spec/persistence/message_bus_spec.rb +76 -0
- data/spec/persistence/sequel/session_spec.rb +125 -0
- data/spec/persistence/sequel/spec_helper.rb +39 -0
- data/spec/persistence/sequel/store_shared.rb +25 -0
- data/spec/persistence/sequel/store_spec.rb +22 -0
- data/spec/persistence/session_spec.rb +199 -0
- data/spec/persistence/spec_helper.rb +2 -0
- data/spec/persistence/uuid_resource_spec.rb +80 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/subclass_tracker_sperc.rb +62 -0
- data/utils/constant_tree.rb +29 -0
- data/utils/stack.rb +48 -0
- metadata +402 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
.content {
|
|
2
|
+
color: black;
|
|
3
|
+
font-family: helvetica, arial;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
h1, h2 {
|
|
7
|
+
color: rgb(79, 180, 226);
|
|
8
|
+
font-family: Georgia;
|
|
9
|
+
margin : 1em;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
h3 {
|
|
13
|
+
font-size : 2.5 em;
|
|
14
|
+
text-align : left;
|
|
15
|
+
margin-left : 1em;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.subsection h1 {
|
|
19
|
+
color : white;
|
|
20
|
+
background : rgb(79, 180, 226);
|
|
21
|
+
font-size : 3em;
|
|
22
|
+
text-align : right;
|
|
23
|
+
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
h2 {
|
|
27
|
+
#background : #ccc;
|
|
28
|
+
text-align : left;
|
|
29
|
+
margin-left : 1em;
|
|
30
|
+
}
|
|
31
|
+
.content::after {
|
|
32
|
+
position: absolute;
|
|
33
|
+
right: 120px;
|
|
34
|
+
bottom: 120px;
|
|
35
|
+
content: url(jay_small.png);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.red { color: #f33;}
|
|
39
|
+
|
|
40
|
+
pre.sh_sourceCode {
|
|
41
|
+
background-color : #eee;
|
|
42
|
+
#border-radius : 0.5em;
|
|
43
|
+
box-shadow: -10px 10px 5px #888;
|
|
44
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
!SLIDE top
|
|
2
|
+
# New LIMS Core
|
|
3
|
+
Maxime Bourget - Monday 2012/06/11
|
|
4
|
+
!SLIDE subsection transition=scrollLeft
|
|
5
|
+
# Overview
|
|
6
|
+
* What it is and why.
|
|
7
|
+
* How it works/design.
|
|
8
|
+
* What's done
|
|
9
|
+
* To do
|
|
10
|
+
|
|
11
|
+
!SLIDE transition=scrollUp small subsection
|
|
12
|
+
# New LIMS Core
|
|
13
|
+
## Set of gems, core of the new LIMS.
|
|
14
|
+
|
|
15
|
+
* Contains the domain model.
|
|
16
|
+
* Interface for different persistence layers.
|
|
17
|
+
* Organized in components.
|
|
18
|
+
* No web/GUI *knowledge*.
|
|
19
|
+
|
|
20
|
+
### Needs to be embedded in a server/application.
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
!SLIDE smaller subsection transition=scrollUp
|
|
24
|
+
# New LIMS Core
|
|
25
|
+
## Lessons learned from Sequencescape
|
|
26
|
+
### Persistence mixed with the domain implementation, adds *noise* to the code :
|
|
27
|
+
|
|
28
|
+
* Domain code *aware* of persistence (`reload`, no identity map).
|
|
29
|
+
* Domain tests have to take persistence into account (`save`, `reload`).
|
|
30
|
+
* Object model too close from database model.
|
|
31
|
+
* No identity map.
|
|
32
|
+
* Tests slow.
|
|
33
|
+
* Hard to maintain.
|
|
34
|
+
|
|
35
|
+
.notes ActiveRecord is magic, but hard to customize and optimize.
|
|
36
|
+
|
|
37
|
+
!SLIDE small subsection transition=scrollUp
|
|
38
|
+
# New LIMS Core
|
|
39
|
+
## Goal
|
|
40
|
+
### Decouple domain model from persistence layer.
|
|
41
|
+
* Code easier to split into component.
|
|
42
|
+
* Domains of *responsibilities* clearer.
|
|
43
|
+
* Less side effect.
|
|
44
|
+
* Test suites small and faster.
|
|
45
|
+
### ... How do we do it ?
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
!SLIDE small transition=scrollLeft
|
|
49
|
+
# New LIMS server internal architecture
|
|
50
|
+
|
|
51
|
+
* `lims::api` Sinatra application
|
|
52
|
+
* Core extensions (clients specific) (optional)
|
|
53
|
+
* `lims:core` gem domain model + persistence.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Hello, this is my template
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'actions/spec_helper'
|
|
2
|
+
|
|
3
|
+
require 'lims-core/actions/action_group'
|
|
4
|
+
module Lims::Core
|
|
5
|
+
module Actions
|
|
6
|
+
module TestActionGroup
|
|
7
|
+
class Action
|
|
8
|
+
include Actions::Action
|
|
9
|
+
end
|
|
10
|
+
class ActionGroup
|
|
11
|
+
include Actions::ActionGroup
|
|
12
|
+
end
|
|
13
|
+
describe ActionGroup do
|
|
14
|
+
context "with 2 actions" do
|
|
15
|
+
let(:store) { Lims::Core::Persistence::Store.new }
|
|
16
|
+
let(:user) { mock :user }
|
|
17
|
+
let(:application) { "test" }
|
|
18
|
+
let(:action_parameters) { {:user => user, :application => application, :store => store } }
|
|
19
|
+
let!(:action1) { Action.new(action_parameters).tap do |action|
|
|
20
|
+
end }
|
|
21
|
+
let!(:action2) { Action.new(action_parameters).tap do |action|
|
|
22
|
+
end }
|
|
23
|
+
|
|
24
|
+
subject{ ActionGroup.new(action_parameters.merge(:actions => [action1, action2])) do |action, session|
|
|
25
|
+
end
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
it "executes both action" do
|
|
29
|
+
action1.should_receive(:_call_in_session) { :result_1 }
|
|
30
|
+
action2.should_receive(:_call_in_session) { :result_2 }
|
|
31
|
+
|
|
32
|
+
subject.call();
|
|
33
|
+
subject.result.should == [:result_1, :result_2]
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Spec requirements
|
|
2
|
+
require 'persistence/spec_helper'
|
|
3
|
+
|
|
4
|
+
# Model requirements
|
|
5
|
+
require 'lims-core/persistence/identity_map'
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
module Lims::Core::Persistence
|
|
11
|
+
class IdentityMapClass
|
|
12
|
+
include IdentityMap
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe IdentityMapClass, :identity_map => true, :persistence => true do
|
|
16
|
+
|
|
17
|
+
context "with a object mapped to an id" do
|
|
18
|
+
let(:id) { 1 }
|
|
19
|
+
let(:object) { "Object 1" }
|
|
20
|
+
before {subject.map_id_object(id,object) }
|
|
21
|
+
|
|
22
|
+
it "must find the object by id" do
|
|
23
|
+
subject.object_for(id).should == object
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "must find the id by object" do
|
|
27
|
+
subject.id_for(object).should == id
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "must fail when mapping another object with the same id" do
|
|
31
|
+
expect { subject.map_id_object(id, "Object #2") }.to raise_error(IdentityMap::DuplicateIdError)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "must fail when mapping another id with the same object" do
|
|
35
|
+
expect { subject.map_id_object(2, object) }.to raise_error(IdentityMap::DuplicateObjectError)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "must not fail when mapping it again" do
|
|
39
|
+
expect { subject.map_id_object(id, object) }.not_to raise_error(IdentityMap::DuplicateError)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "must yield the object" do
|
|
43
|
+
subject.object_for(id) do |o|
|
|
44
|
+
o.should == object
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "must not yield if the object can't be found" do
|
|
49
|
+
subject.object_for("wrong id") do |o|
|
|
50
|
+
raise "not found"
|
|
51
|
+
end.should be_nil
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Spec requirements
|
|
2
|
+
require 'persistence/logger/spec_helper'
|
|
3
|
+
|
|
4
|
+
# Model requirements
|
|
5
|
+
require 'logger'
|
|
6
|
+
require 'lims-core/persistence/logger/store'
|
|
7
|
+
require 'lims-core/persistence/logger/persistor'
|
|
8
|
+
|
|
9
|
+
class Array
|
|
10
|
+
class ArrayLoggerPersistor < Lims::Core::Persistence::Persistor
|
|
11
|
+
include Lims::Core::Persistence::Logger::Persistor
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
module Lims::Core
|
|
16
|
+
module Persistence
|
|
17
|
+
describe Logger::Store, :store => true, :logger => true, :persistence => true do
|
|
18
|
+
def self.initialized_with_a_logger(method)
|
|
19
|
+
context "initialized with a logger" do
|
|
20
|
+
let (:logger) { ::Logger.new($stdout) }
|
|
21
|
+
subject { described_class.new(logger, method) }
|
|
22
|
+
it "should log objects to stdout" do
|
|
23
|
+
logger.should_receive(:send).with(method, '["A1", "A2", "B1", "B2"]')
|
|
24
|
+
subject.with_session do |session|
|
|
25
|
+
session << %w(A1 A2 B1 B2)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
def self.initialized_with_an_IO(io)
|
|
31
|
+
context "initialized to stdout" do
|
|
32
|
+
subject { described_class.new(io) }
|
|
33
|
+
it "should log objects to stdout" do
|
|
34
|
+
io.should_receive(:write)
|
|
35
|
+
subject.with_session do |session|
|
|
36
|
+
session << %w(A1 A2 B1 B2)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
initialized_with_an_IO(STDOUT)
|
|
42
|
+
initialized_with_an_IO(STDERR)
|
|
43
|
+
|
|
44
|
+
initialized_with_a_logger(:info)
|
|
45
|
+
initialized_with_a_logger(:warn)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require 'lims-core/persistence/message_bus'
|
|
2
|
+
|
|
3
|
+
module Lims::Core
|
|
4
|
+
module Persistence
|
|
5
|
+
describe MessageBus, :message_bus => true do
|
|
6
|
+
context "to be valid" do
|
|
7
|
+
let(:url) { "amqp://user:password@localhost:55672" }
|
|
8
|
+
let(:exchange_name) { "exchange_name" }
|
|
9
|
+
let(:durable) { true }
|
|
10
|
+
let(:prefetch_number) { 30 }
|
|
11
|
+
let(:heart_beat) { 0 }
|
|
12
|
+
let(:backend_application_id) { "test backend app" }
|
|
13
|
+
let(:another_backend_application_id) { "another backend app id" }
|
|
14
|
+
let(:bus_settings) { { "url" => url,
|
|
15
|
+
"exchange_name" => exchange_name,
|
|
16
|
+
"durable" => durable,
|
|
17
|
+
"prefetch_number" => prefetch_number,
|
|
18
|
+
"heart_beat" => heart_beat,
|
|
19
|
+
"backend_application_id" => backend_application_id}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
it "requires a RabbitMQ host" do
|
|
23
|
+
described_class.new(bus_settings - ["url"]).valid?.should == false
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "requires an exchange name" do
|
|
27
|
+
described_class.new(bus_settings - ["exchange_name"]).valid?.should == false
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "requires the durable option" do
|
|
31
|
+
described_class.new(bus_settings - ["durable"]).valid?.should == false
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "requires a prefetch number" do
|
|
35
|
+
described_class.new(bus_settings - ["prefetch_number"]).valid?.should == false
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "not requires a heart_beat value" do
|
|
39
|
+
described_class.new(bus_settings - ["heart_beat"]).valid?.should == true
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "requires the backend_application_id value" do
|
|
43
|
+
described_class.new(bus_settings - ["backend_application_id"]).valid?.should == false
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "requires correct settings" do
|
|
47
|
+
described_class.new(bus_settings).valid?.should == true
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "sets the exchange type to topic by default" do
|
|
51
|
+
described_class.new(bus_settings).exchange_type.should == "topic"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "requires correct settings to connect to the message bus" do
|
|
55
|
+
expect do
|
|
56
|
+
described_class.new(bus_settings - ["url"]).connect
|
|
57
|
+
end.to raise_error(MessageBus::InvalidSettingsError)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "requires an exchange to publish a message" do
|
|
61
|
+
expect do
|
|
62
|
+
described_class.new(bus_settings).publish("message")
|
|
63
|
+
end.to raise_error(MessageBus::ConnectionError)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "raise an error if set the backend app id more then once" do
|
|
67
|
+
expect do
|
|
68
|
+
message_bus = described_class.new(bus_settings)
|
|
69
|
+
message_bus.backend_application_id = another_backend_application_id
|
|
70
|
+
end.to raise_error(MessageBus::InvalidSettingsError)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Spec requirements
|
|
2
|
+
require 'persistence/sequel/spec_helper'
|
|
3
|
+
|
|
4
|
+
# Model requirements
|
|
5
|
+
require 'lims-core/persistence/sequel/store'
|
|
6
|
+
require 'lims-core/persistence/sequel/session'
|
|
7
|
+
require 'lims-core/persistence/sequel/persistor'
|
|
8
|
+
|
|
9
|
+
module Lims::Core::Persistence
|
|
10
|
+
module ForTest
|
|
11
|
+
class Name
|
|
12
|
+
include Lims::Core::Resource
|
|
13
|
+
attribute :name, String
|
|
14
|
+
class NamePersitor < Lims::Core::Persistence::Persistor
|
|
15
|
+
Model = Name
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
module Sequel
|
|
21
|
+
describe Session, :session => true, :persistence => true, :persistence => true, :sequel => true do
|
|
22
|
+
context "with mysql underlying" do
|
|
23
|
+
include_context "mysql db"
|
|
24
|
+
let(:store) { Store.new(db).tap do
|
|
25
|
+
db.create_table :sessions do
|
|
26
|
+
primary_key :id
|
|
27
|
+
String :user
|
|
28
|
+
String :backend_application_id
|
|
29
|
+
String :parameters, :text => true
|
|
30
|
+
boolean :success
|
|
31
|
+
timestamp :start_time
|
|
32
|
+
DateTime :end_time
|
|
33
|
+
end unless db.table_exists?(:sessions)
|
|
34
|
+
end}
|
|
35
|
+
xit "sets a new session_id to work with" do
|
|
36
|
+
begin
|
|
37
|
+
my_session_id=nil
|
|
38
|
+
store.with_session do |s|
|
|
39
|
+
my_session_id = s.get_current_session
|
|
40
|
+
end
|
|
41
|
+
rescue
|
|
42
|
+
end
|
|
43
|
+
(my_session_id == nil).should == false
|
|
44
|
+
end
|
|
45
|
+
xit "session is reseted after scope" do
|
|
46
|
+
begin
|
|
47
|
+
my_session_id=nil
|
|
48
|
+
store.with_session do |s|
|
|
49
|
+
my_session_id = s.get_current_session
|
|
50
|
+
end
|
|
51
|
+
my_session_after_scope = s.get_current_session
|
|
52
|
+
rescue
|
|
53
|
+
end
|
|
54
|
+
(my_session_after_scope == my_session_id).should == false
|
|
55
|
+
(my_session_after_scope == nil).should == true
|
|
56
|
+
end
|
|
57
|
+
xit "a different session if I create a new scope" do
|
|
58
|
+
begin
|
|
59
|
+
my_session_id=nil
|
|
60
|
+
my_session_id_2=nil
|
|
61
|
+
store.with_session do |s|
|
|
62
|
+
my_session_id = s.get_current_session
|
|
63
|
+
end
|
|
64
|
+
my_session_after_scope = s.get_current_session
|
|
65
|
+
store.with_session do |s|
|
|
66
|
+
my_session_id_2 = s.get_current_session
|
|
67
|
+
end
|
|
68
|
+
my_session_after_scope_2 = s.get_current_session
|
|
69
|
+
rescue
|
|
70
|
+
end
|
|
71
|
+
(my_session_id == my_session_id_2).should == false
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context "with sqlite underlying" do
|
|
76
|
+
include_context "sqlite db"
|
|
77
|
+
let(:store) { Store.new(db).tap do
|
|
78
|
+
db.create_table :primary_keys do
|
|
79
|
+
primary_key :id
|
|
80
|
+
String :table_name
|
|
81
|
+
Integer :current_key
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
context "#transaction" do
|
|
87
|
+
let(:a) { ForTest::Name.new(:name => "A") }
|
|
88
|
+
let(:b) { ForTest::Name.new(:name => "B") }
|
|
89
|
+
let(:c) { ForTest::Name.new(:name => "C") }
|
|
90
|
+
|
|
91
|
+
before() do
|
|
92
|
+
db.create_table :names do
|
|
93
|
+
primary_key :id
|
|
94
|
+
String :name
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
c.stub(:attributes) do
|
|
98
|
+
raise RuntimeError, "Can't save '#{inspect}'"
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "save the 2 if no problem" do
|
|
103
|
+
expect { store.with_session do |s|
|
|
104
|
+
s << a << b
|
|
105
|
+
end }.to change{db[:names].count}.by(2)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it "saves 0 if the second doesn't save" do
|
|
109
|
+
expect {
|
|
110
|
+
begin
|
|
111
|
+
store.with_session do |s|
|
|
112
|
+
s << a << c
|
|
113
|
+
end
|
|
114
|
+
rescue
|
|
115
|
+
end
|
|
116
|
+
}.to change{db[:names].count}.by(0)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
xit "saves 0 if the second is not valid" do
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|