sequencescape-client-api 0.3.7 → 0.4.0.pre.rc2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +44 -0
- data/.rubocop_todo.yml +338 -0
- data/.ruby-version +1 -0
- data/Gemfile +1 -1
- data/README.markdown +13 -0
- data/lib/sequencescape-api.rb +1 -1
- data/lib/sequencescape-api/actions.rb +9 -8
- data/lib/sequencescape-api/associations.rb +8 -6
- data/lib/sequencescape-api/associations/base.rb +1 -1
- data/lib/sequencescape-api/associations/base/instance_methods.rb +10 -8
- data/lib/sequencescape-api/associations/belongs_to.rb +4 -4
- data/lib/sequencescape-api/associations/has_many.rb +14 -13
- data/lib/sequencescape-api/associations/has_many/json.rb +1 -1
- data/lib/sequencescape-api/associations/has_many/validation.rb +1 -1
- data/lib/sequencescape-api/composition.rb +11 -7
- data/lib/sequencescape-api/connection_factory.rb +6 -5
- data/lib/sequencescape-api/connection_factory/actions.rb +17 -12
- data/lib/sequencescape-api/core.rb +12 -7
- data/lib/sequencescape-api/core_ext/array.rb +1 -1
- data/lib/sequencescape-api/core_ext/hash.rb +3 -3
- data/lib/sequencescape-api/errors.rb +2 -2
- data/lib/sequencescape-api/finder_methods.rb +16 -11
- data/lib/sequencescape-api/rails.rb +8 -7
- data/lib/sequencescape-api/resource/active_model.rb +1 -1
- data/lib/sequencescape-api/resource/attribute_groups.rb +11 -7
- data/lib/sequencescape-api/resource/attributes.rb +8 -8
- data/lib/sequencescape-api/resource/instance_methods.rb +17 -9
- data/lib/sequencescape-api/resource/json.rb +18 -15
- data/lib/sequencescape-api/resource/modifications.rb +20 -11
- data/lib/sequencescape-api/resource_model_proxy.rb +7 -5
- data/lib/sequencescape-api/version.rb +1 -1
- data/lib/sequencescape.rb +4 -2
- data/lib/sequencescape/bait_library.rb +1 -1
- data/lib/sequencescape/bait_library_layout.rb +2 -2
- data/lib/sequencescape/barcoded_asset.rb +1 -1
- data/lib/sequencescape/batch.rb +6 -6
- data/lib/sequencescape/behaviour/qced.rb +3 -4
- data/lib/sequencescape/behaviour/receptacle.rb +3 -3
- data/lib/sequencescape/behaviour/state_driven.rb +4 -4
- data/lib/sequencescape/bulk_transfer.rb +1 -1
- data/lib/sequencescape/comment.rb +0 -2
- data/lib/sequencescape/extraction_attribute.rb +6 -0
- data/lib/sequencescape/library_event.rb +1 -1
- data/lib/sequencescape/library_tube.rb +1 -1
- data/lib/sequencescape/lot.rb +0 -1
- data/lib/sequencescape/lot_type.rb +1 -2
- data/lib/sequencescape/order_template.rb +1 -2
- data/lib/sequencescape/pipeline.rb +1 -1
- data/lib/sequencescape/plate.rb +29 -11
- data/lib/sequencescape/plate/pooling.rb +9 -3
- data/lib/sequencescape/plate/well_structure.rb +6 -6
- data/lib/sequencescape/plate_conversion.rb +3 -3
- data/lib/sequencescape/plate_creation.rb +3 -3
- data/lib/sequencescape/plate_purpose.rb +3 -3
- data/lib/sequencescape/plate_template.rb +0 -2
- data/lib/sequencescape/pooled_plate_creation.rb +3 -3
- data/lib/sequencescape/project.rb +2 -1
- data/lib/sequencescape/qc_decision.rb +0 -1
- data/lib/sequencescape/qc_file.rb +0 -3
- data/lib/sequencescape/qcable.rb +0 -3
- data/lib/sequencescape/qcable_creator.rb +1 -4
- data/lib/sequencescape/request.rb +3 -3
- data/lib/sequencescape/search.rb +10 -8
- data/lib/sequencescape/specific_tube_creation.rb +2 -2
- data/lib/sequencescape/stamp.rb +0 -1
- data/lib/sequencescape/state_change.rb +2 -2
- data/lib/sequencescape/study.rb +1 -1
- data/lib/sequencescape/submission.rb +1 -2
- data/lib/sequencescape/tag2_layout.rb +3 -3
- data/lib/sequencescape/tag2_layout_template.rb +2 -2
- data/lib/sequencescape/tag_group.rb +0 -1
- data/lib/sequencescape/tag_layout.rb +3 -3
- data/lib/sequencescape/tag_layout_template.rb +4 -4
- data/lib/sequencescape/transfer.rb +2 -2
- data/lib/sequencescape/transfer_request.rb +5 -7
- data/lib/sequencescape/transfer_template.rb +2 -2
- data/lib/sequencescape/tube.rb +3 -3
- data/lib/sequencescape/tube_creation.rb +3 -3
- data/lib/sequencescape/tube_from_tube_creation.rb +3 -3
- data/lib/sequencescape/tube_purpose.rb +3 -3
- data/lib/sequencescape/user.rb +2 -2
- data/lib/sequencescape/volume_update.rb +1 -1
- data/lib/sequencescape/well.rb +0 -2
- data/lib/sequencescape/work_completion.rb +1 -1
- data/sequencescape-api.gemspec +18 -17
- data/spec/sequencescape-api/associations_spec.rb +4 -2
- data/spec/sequencescape-api/finding_methods_spec.rb +3 -1
- data/spec/sequencescape-api/modifications_spec.rb +17 -16
- data/spec/sequencescape-api/root_spec.rb +11 -6
- data/spec/spec_helper.rb +3 -1
- data/spec/support/contract_helper.rb +18 -10
- data/spec/support/namespaces.rb +9 -9
- data/spec/support/shared_examples.rb +2 -0
- metadata +54 -36
- data/.rvmrc +0 -52
@@ -8,21 +8,23 @@ require 'ostruct'
|
|
8
8
|
# Any interaction with the API isn't done directly through a model but through an instance of this
|
9
9
|
# class, that proxies the model and ensures that it uses the correct instance of Sequencescape::Api.
|
10
10
|
class Sequencescape::Api::ResourceModelProxy
|
11
|
-
|
11
|
+
instance_methods.each { |m| undef_method(m) unless m.to_s =~ /^(__.+__|respond_to\?|object_id)$/ }
|
12
12
|
|
13
13
|
include ::Sequencescape::Api::FinderMethods
|
14
14
|
extend ::Sequencescape::Api::Actions
|
15
15
|
|
16
16
|
def initialize(api, model, actions)
|
17
|
-
@api
|
17
|
+
@api = api
|
18
|
+
@model = model
|
19
|
+
@actions = OpenStruct.new(actions)
|
18
20
|
@model.send(:initialize_class_actions, self)
|
19
21
|
end
|
20
22
|
|
21
23
|
attr_reader :api, :actions, :model
|
22
24
|
private :api, :actions, :model
|
23
25
|
|
24
|
-
delegate :nil?, :inspect, :
|
25
|
-
delegate :read_timeout, :
|
26
|
+
delegate :nil?, :inspect, to: :model
|
27
|
+
delegate :read_timeout, to: :api
|
26
28
|
|
27
29
|
has_create_action
|
28
30
|
|
@@ -40,5 +42,5 @@ class Sequencescape::Api::ResourceModelProxy
|
|
40
42
|
end
|
41
43
|
|
42
44
|
# Here are some methods that need to be delegated directly.
|
43
|
-
delegate :ai, :
|
45
|
+
delegate :ai, to: :model
|
44
46
|
end
|
data/lib/sequencescape.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'sequencescape-api'
|
2
2
|
|
3
3
|
module Sequencescape
|
4
|
-
|
5
4
|
end
|
6
5
|
|
7
6
|
require 'sequencescape/user'
|
@@ -74,8 +73,11 @@ require 'sequencescape/qcable_creator'
|
|
74
73
|
require 'sequencescape/qc_decision'
|
75
74
|
require 'sequencescape/plate_conversion'
|
76
75
|
|
76
|
+
# Support Extraction
|
77
|
+
require 'sequencescape/extraction_attribute'
|
78
|
+
|
77
79
|
# Events
|
78
80
|
require 'sequencescape/library_event'
|
79
81
|
|
80
82
|
# Ensure that the I18n stuff has been properly configured
|
81
|
-
I18n.config.load_path << File.expand_path(File.join(File.dirname(__FILE__), %w
|
83
|
+
I18n.config.load_path << File.expand_path(File.join(File.dirname(__FILE__), %w[sequencescape locale en.yml]))
|
@@ -2,7 +2,7 @@ class BaitLibrary
|
|
2
2
|
include Sequencescape::Api::Composition::Target
|
3
3
|
|
4
4
|
attribute_accessor :name
|
5
|
-
attribute_accessor :created_at, :updated_at, :
|
5
|
+
attribute_accessor :created_at, :updated_at, conversion: :to_time
|
6
6
|
|
7
7
|
attribute_group :supplier do
|
8
8
|
attribute_accessor :name, :identifier
|
@@ -2,8 +2,8 @@ require 'sequencescape-api/resource'
|
|
2
2
|
|
3
3
|
class Sequencescape::BaitLibraryLayout < ::Sequencescape::Api::Resource
|
4
4
|
belongs_to :user
|
5
|
-
belongs_to :plate, :
|
5
|
+
belongs_to :plate, class_name: 'Plate'
|
6
6
|
attribute_reader :layout
|
7
7
|
|
8
|
-
has_class_create_action(:preview!, :
|
8
|
+
has_class_create_action(:preview!, action: :preview)
|
9
9
|
end
|
data/lib/sequencescape/batch.rb
CHANGED
@@ -2,17 +2,17 @@ require 'sequencescape-api/resource'
|
|
2
2
|
|
3
3
|
class Sequencescape::Batch < ::Sequencescape::Api::Resource
|
4
4
|
belongs_to :pipeline
|
5
|
-
has_many :requests, :
|
5
|
+
has_many :requests, disposition: :inline
|
6
6
|
composed_of :user
|
7
7
|
|
8
|
-
has_update_action :start!, :
|
9
|
-
has_update_action :complete!, :
|
10
|
-
has_update_action :release!, :
|
8
|
+
has_update_action :start!, action: 'start'
|
9
|
+
has_update_action :complete!, action: 'complete'
|
10
|
+
has_update_action :release!, action: 'release'
|
11
11
|
|
12
12
|
attribute_accessor :state, :production_state, :qc_state, :barcode
|
13
13
|
|
14
14
|
def self.state_method(name)
|
15
|
-
class_eval(
|
15
|
+
class_eval("def #{name}? ; state == #{name.to_s.inspect} ; end")
|
16
16
|
end
|
17
17
|
|
18
18
|
state_method(:pending)
|
@@ -20,5 +20,5 @@ class Sequencescape::Batch < ::Sequencescape::Api::Resource
|
|
20
20
|
state_method(:completed)
|
21
21
|
state_method(:released)
|
22
22
|
|
23
|
-
validates_presence_of :requests, :
|
23
|
+
validates_presence_of :requests, allow_blank: false
|
24
24
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module Sequencescape::Behaviour
|
2
2
|
module Qced
|
3
|
-
|
4
3
|
module QcFile
|
5
4
|
def create!(attributes = nil)
|
6
5
|
attributes ||= {}
|
@@ -14,7 +13,8 @@ module Sequencescape::Behaviour
|
|
14
13
|
attributes ||= {}
|
15
14
|
|
16
15
|
new({}, false).tap do |qc_file|
|
17
|
-
api.create_from_file(actions.create, file, filename, 'sequencescape/qc_file',
|
16
|
+
api.create_from_file(actions.create, file, filename, 'sequencescape/qc_file',
|
17
|
+
Sequencescape::Api::ModifyingHandler.new(qc_file))
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -22,10 +22,9 @@ module Sequencescape::Behaviour
|
|
22
22
|
def self.included(base)
|
23
23
|
base.class_eval do
|
24
24
|
has_many :qc_files do
|
25
|
-
|
25
|
+
include Sequencescape::Behaviour::Qced::QcFile
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
29
|
-
|
30
29
|
end
|
31
30
|
end
|
@@ -4,9 +4,9 @@ require 'sequencescape/bait_library'
|
|
4
4
|
module Sequencescape::Behaviour
|
5
5
|
module Receptacle
|
6
6
|
class Aliquot < Sequencescape::Api::Resource
|
7
|
-
belongs_to :sample, :
|
7
|
+
belongs_to :sample, disposition: :inline
|
8
8
|
composed_of :tag
|
9
|
-
composed_of :tag2, :
|
9
|
+
composed_of :tag2, class_name: 'Tag'
|
10
10
|
composed_of :bait_library
|
11
11
|
|
12
12
|
attribute_accessor :suboptimal
|
@@ -14,7 +14,7 @@ module Sequencescape::Behaviour
|
|
14
14
|
|
15
15
|
def self.included(base)
|
16
16
|
base.class_eval do
|
17
|
-
has_many :aliquots, :
|
17
|
+
has_many :aliquots, disposition: :inline, class_name: 'Behaviours::Receptacle::Aliquot'
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -1,17 +1,17 @@
|
|
1
1
|
module Sequencescape::Behaviour
|
2
2
|
module StateDriven
|
3
|
-
def self.included(base)
|
3
|
+
def self.included(base) # rubocop:todo Metrics/MethodLength
|
4
4
|
base.class_eval do
|
5
5
|
attribute_reader :state
|
6
6
|
|
7
7
|
# Define a few default states
|
8
|
-
[
|
8
|
+
%i[pending started passed failed cancelled unknown qc_complete].each do |state|
|
9
9
|
line = __LINE__ + 1
|
10
|
-
class_eval(
|
10
|
+
class_eval("
|
11
11
|
def #{state}?
|
12
12
|
state == #{state.to_s.inspect}
|
13
13
|
end
|
14
|
-
|
14
|
+
", __FILE__, line)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -2,6 +2,6 @@ require 'sequencescape/tube'
|
|
2
2
|
|
3
3
|
class Sequencescape::LibraryTube < ::Sequencescape::Tube
|
4
4
|
has_many :requests
|
5
|
-
belongs_to :source_request, :
|
5
|
+
belongs_to :source_request, class_name: 'Sequencescape::Request'
|
6
6
|
belongs_to :custom_metadatum_collection
|
7
7
|
end
|
data/lib/sequencescape/lot.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
require 'sequencescape-api/resource'
|
2
2
|
|
3
3
|
class Sequencescape::LotType < ::Sequencescape::Api::Resource
|
4
|
-
|
5
4
|
module LotCreator
|
6
|
-
def create!(attributes=nil)
|
5
|
+
def create!(attributes = nil)
|
7
6
|
attributes ||= {}
|
8
7
|
new({}, false).tap do |lot|
|
9
8
|
api.create(actions.create, { 'lot' => attributes }, Sequencescape::Api::ModifyingHandler.new(lot))
|
@@ -1,9 +1,8 @@
|
|
1
1
|
require 'sequencescape-api/resource'
|
2
2
|
|
3
3
|
class Sequencescape::OrderTemplate < ::Sequencescape::Api::Resource
|
4
|
-
|
5
4
|
module OrderCreator
|
6
|
-
def create!(attributes=nil)
|
5
|
+
def create!(attributes = nil)
|
7
6
|
attributes ||= {}
|
8
7
|
new({}, false).tap do |order|
|
9
8
|
api.create(actions.create, { 'order' => attributes }, Sequencescape::Api::ModifyingHandler.new(order))
|
data/lib/sequencescape/plate.rb
CHANGED
@@ -21,17 +21,18 @@ class Sequencescape::Plate < ::Sequencescape::Asset
|
|
21
21
|
|
22
22
|
belongs_to :plate_purpose
|
23
23
|
belongs_to :custom_metadatum_collection
|
24
|
-
composed_of :stock_plate, :
|
24
|
+
composed_of :stock_plate, class_name: 'Plate'
|
25
25
|
|
26
26
|
module CommentsCreation
|
27
27
|
def create!(attributes = nil)
|
28
28
|
attributes ||= {}
|
29
29
|
|
30
30
|
new({}, false).tap do |comment|
|
31
|
-
api.create(actions.create,
|
31
|
+
api.create(actions.create,
|
32
|
+
{ 'comment' => attributes },
|
33
|
+
Sequencescape::Api::ModifyingHandler.new(comment))
|
32
34
|
end
|
33
35
|
end
|
34
|
-
|
35
36
|
end
|
36
37
|
|
37
38
|
module CurrentVolumeSubstraction
|
@@ -39,12 +40,14 @@ class Sequencescape::Plate < ::Sequencescape::Asset
|
|
39
40
|
attributes ||= {}
|
40
41
|
|
41
42
|
new({}, false).tap do |volume_update|
|
42
|
-
api.create(actions.create,
|
43
|
+
api.create(actions.create,
|
44
|
+
{ 'volume_update' => attributes },
|
45
|
+
Sequencescape::Api::ModifyingHandler.new(volume_update))
|
43
46
|
end
|
44
47
|
end
|
45
48
|
|
46
49
|
def substract_volume!(volume_change)
|
47
|
-
create!({ :volume_change
|
50
|
+
create!({ volume_change: volume_change })
|
48
51
|
end
|
49
52
|
end
|
50
53
|
has_many :volume_updates do
|
@@ -55,17 +58,32 @@ class Sequencescape::Plate < ::Sequencescape::Asset
|
|
55
58
|
include Sequencescape::Plate::CommentsCreation
|
56
59
|
end
|
57
60
|
|
58
|
-
has_many :source_transfers, :
|
59
|
-
has_many :transfers_to_tubes, :
|
60
|
-
has_many :creation_transfers, :
|
61
|
+
has_many :source_transfers, class_name: 'Transfer'
|
62
|
+
has_many :transfers_to_tubes, class_name: 'Transfer'
|
63
|
+
has_many :creation_transfers, class_name: 'Transfer'
|
61
64
|
|
62
65
|
attribute_accessor :size, :iteration, :pools, :pre_cap_groups, :location, :priority
|
63
66
|
|
64
67
|
# Provides backwards compatability
|
65
68
|
def creation_transfer
|
66
|
-
Rails.logger.warn
|
67
|
-
|
68
|
-
|
69
|
+
Rails.logger.warn 'Creation transfer is deprecated, use creation_transfers instead'
|
70
|
+
transfers_found = creation_transfers.count
|
71
|
+
return creation_transfers.first if transfers_found == 1
|
72
|
+
|
73
|
+
raise Sequencescape::Api::Error, "Unexpected number of transfers found: #{transfers_found} found, 1 expected."
|
69
74
|
end
|
70
75
|
|
76
|
+
module UpdateExtractionAttributes
|
77
|
+
def create!(attributes = nil)
|
78
|
+
attributes ||= {}
|
79
|
+
new({}, false).tap do |attrs|
|
80
|
+
api.create(actions.create, { extraction_attribute: attributes },
|
81
|
+
Sequencescape::Api::ModifyingHandler.new(attrs))
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
has_many :extraction_attributes, class_name: 'ExtractionAttribute' do
|
87
|
+
include Sequencescape::Plate::UpdateExtractionAttributes
|
88
|
+
end
|
71
89
|
end
|
@@ -3,21 +3,27 @@ module Sequencescape::Plate::Pooling
|
|
3
3
|
wells.each do |well|
|
4
4
|
pool_id, pool = pools.detect { |_, pool| pool['wells'].include?(well.location) }
|
5
5
|
next if pool.nil?
|
6
|
+
|
6
7
|
well.pool = pool
|
7
8
|
end
|
8
9
|
end
|
9
10
|
|
10
11
|
def populate_wells_with_pre_cap_group
|
11
12
|
wells.each do |well|
|
12
|
-
pre_cap_group_id, pre_cap_group = pre_cap_groups.detect
|
13
|
+
pre_cap_group_id, pre_cap_group = pre_cap_groups.detect do |_, pre_cap_group|
|
14
|
+
pre_cap_group['wells'].include?(well.location)
|
15
|
+
end
|
13
16
|
next if pre_cap_group.nil?
|
17
|
+
|
14
18
|
well.pre_cap_group = pre_cap_group
|
15
19
|
end
|
16
20
|
end
|
17
21
|
|
18
22
|
def after_load
|
19
|
-
pools
|
20
|
-
|
23
|
+
pools&.each { |pool_id, pool| pool['id'] = pool_id }
|
24
|
+
return if pre_cap_groups.nil?
|
25
|
+
|
26
|
+
pre_cap_groups.each { |pre_cap_group_id, pre_cap_group| pre_cap_group['id'] = pre_cap_group_id }
|
21
27
|
end
|
22
28
|
private :after_load
|
23
29
|
end
|
@@ -1,24 +1,24 @@
|
|
1
1
|
module Sequencescape::Plate::WellStructure
|
2
2
|
def rows
|
3
|
-
case
|
3
|
+
case size
|
4
4
|
when 96 then ('A'..'H')
|
5
5
|
when 384 then ('A'..'P')
|
6
|
-
else raise
|
6
|
+
else raise "Unknown plate size #{size}"
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
10
|
def columns
|
11
|
-
case
|
11
|
+
case size
|
12
12
|
when 96 then (1..12)
|
13
13
|
when 384 then (1..24)
|
14
|
-
else raise
|
14
|
+
else raise "Unknown plate size #{size}"
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
def locations_in_rows
|
19
19
|
[].tap do |locations|
|
20
|
-
|
21
|
-
|
20
|
+
rows.each do |row|
|
21
|
+
columns.each do |column|
|
22
22
|
locations << "#{row}#{column}"
|
23
23
|
end
|
24
24
|
end
|
@@ -2,7 +2,7 @@ require 'sequencescape-api/resource'
|
|
2
2
|
|
3
3
|
class Sequencescape::PlateConversion < ::Sequencescape::Api::Resource
|
4
4
|
belongs_to :user
|
5
|
-
belongs_to :target, :
|
6
|
-
belongs_to :parent, :
|
7
|
-
belongs_to :purpose, :
|
5
|
+
belongs_to :target, class_name: 'Plate'
|
6
|
+
belongs_to :parent, class_name: 'Plate'
|
7
|
+
belongs_to :purpose, class_name: 'PlatePurpose'
|
8
8
|
end
|
@@ -2,7 +2,7 @@ require 'sequencescape-api/resource'
|
|
2
2
|
|
3
3
|
class Sequencescape::PlateCreation < ::Sequencescape::Api::Resource
|
4
4
|
belongs_to :user
|
5
|
-
belongs_to :parent, :
|
6
|
-
belongs_to :child_purpose, :
|
7
|
-
belongs_to :child, :
|
5
|
+
belongs_to :parent, class_name: 'Plate'
|
6
|
+
belongs_to :child_purpose, class_name: 'PlatePurpose'
|
7
|
+
belongs_to :child, class_name: 'Plate'
|
8
8
|
end
|