sequencescape-client-api 0.3.10 → 0.4.0.pre.rc1
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 +4 -4
- 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 +1 -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 +1 -1
- 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 +19 -15
- 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 +0 -3
- 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 +4 -5
- 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 +53 -35
- 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'
|
|
@@ -81,4 +80,4 @@ require 'sequencescape/extraction_attribute'
|
|
|
81
80
|
require 'sequencescape/library_event'
|
|
82
81
|
|
|
83
82
|
# Ensure that the I18n stuff has been properly configured
|
|
84
|
-
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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require 'sequencescape-api/resource'
|
|
2
2
|
|
|
3
3
|
class Sequencescape::ExtractionAttribute < ::Sequencescape::Api::Resource
|
|
4
|
-
belongs_to :plate, :
|
|
4
|
+
belongs_to :plate, class_name: 'Asset', disposition: :inline
|
|
5
5
|
attribute_accessor :attributes_update, :created_by
|
|
6
6
|
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,31 +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
|
-
end
|
|
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
|
|
70
72
|
|
|
73
|
+
raise Sequencescape::Api::Error, "Unexpected number of transfers found: #{transfers_found} found, 1 expected."
|
|
74
|
+
end
|
|
71
75
|
|
|
72
76
|
module UpdateExtractionAttributes
|
|
73
77
|
def create!(attributes = nil)
|
|
74
78
|
attributes ||= {}
|
|
75
79
|
new({}, false).tap do |attrs|
|
|
76
|
-
api.create(actions.create, {:
|
|
80
|
+
api.create(actions.create, { extraction_attribute: attributes },
|
|
81
|
+
Sequencescape::Api::ModifyingHandler.new(attrs))
|
|
77
82
|
end
|
|
78
83
|
end
|
|
79
84
|
end
|
|
80
85
|
|
|
81
|
-
has_many :extraction_attributes, :
|
|
86
|
+
has_many :extraction_attributes, class_name: 'ExtractionAttribute' do
|
|
82
87
|
include Sequencescape::Plate::UpdateExtractionAttributes
|
|
83
88
|
end
|
|
84
|
-
|
|
85
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
|
|
@@ -4,7 +4,7 @@ class Sequencescape::PlatePurpose < ::Sequencescape::Api::Resource
|
|
|
4
4
|
module PlateCreation
|
|
5
5
|
def create!(attributes = nil)
|
|
6
6
|
attributes ||= {}
|
|
7
|
-
attributes[:wells].delete_if { |_,v| v.blank? } if attributes.key?(:wells)
|
|
7
|
+
attributes[:wells].delete_if { |_, v| v.blank? } if attributes.key?(:wells)
|
|
8
8
|
|
|
9
9
|
new({}, false).tap do |plate|
|
|
10
10
|
api.create(actions.create, { 'plate' => attributes }, Sequencescape::Api::ModifyingHandler.new(plate))
|
|
@@ -12,8 +12,8 @@ class Sequencescape::PlatePurpose < ::Sequencescape::Api::Resource
|
|
|
12
12
|
end
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
has_many :children, :
|
|
16
|
-
has_many :parents, :
|
|
15
|
+
has_many :children, class_name: 'PlatePurpose'
|
|
16
|
+
has_many :parents, class_name: 'PlatePurpose'
|
|
17
17
|
|
|
18
18
|
has_many :plates do
|
|
19
19
|
include Sequencescape::PlatePurpose::PlateCreation
|