From d0f59845e230756c45114901aebeac90835335eb Mon Sep 17 00:00:00 2001 From: James Glover Date: Fri, 2 Jun 2017 14:27:08 +0100 Subject: [PATCH 1/3] Allow nested attributes on create --- lib/sequencescape-api/resource/attribute_groups.rb | 6 +++++- lib/sequencescape-api/resource/json.rb | 2 +- spec/sequencescape-api/modifications_spec.rb | 10 ++++++++++ spec/support/namespaces.rb | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/sequencescape-api/resource/attribute_groups.rb b/lib/sequencescape-api/resource/attribute_groups.rb index 70e3e8a..53846db 100644 --- a/lib/sequencescape-api/resource/attribute_groups.rb +++ b/lib/sequencescape-api/resource/attribute_groups.rb @@ -29,7 +29,11 @@ module Json def as_json_for_update(options) super.tap do |json| begin - json.fetch(json_root).merge!(attribute_group_json(options)) + if options[:root] + json.fetch(json_root).merge!(attribute_group_json(options)) + else + json.merge!(attribute_group_json(options)) + end rescue KeyError => e # If we get a key error, append the json to out exception to assist diagnosing issues e.message << " in #{json.to_json}" diff --git a/lib/sequencescape-api/resource/json.rb b/lib/sequencescape-api/resource/json.rb index 0cc1c4d..dec3019 100644 --- a/lib/sequencescape-api/resource/json.rb +++ b/lib/sequencescape-api/resource/json.rb @@ -109,7 +109,7 @@ def associations_for_json(options) ] end private :associations_for_json - + def must_output_full_json?(options, target = self) options[:force] or (options[:action] == :create) or target.changed? end diff --git a/spec/sequencescape-api/modifications_spec.rb b/spec/sequencescape-api/modifications_spec.rb index 1b61798..45e46af 100644 --- a/spec/sequencescape-api/modifications_spec.rb +++ b/spec/sequencescape-api/modifications_spec.rb @@ -70,6 +70,16 @@ it 'raises if not given an enumerable' end + context 'has_many disposition: :inline nested' do + stub_request_from('create-model-c-has-many-inline-nested') { response('model-c-instance-created') } + + it 'takes an array of objects and converts them to UUID' + it 'assumes an array of strings are UUIDs' do + target.create!(:model_bs => [{ "test_attribute" => "test_value" }]) + end + it 'raises if not given an enumerable' + end + context 'has_many' do stub_request_from('create-model-c-has-many') { response('model-c-instance-created') } diff --git a/spec/support/namespaces.rb b/spec/support/namespaces.rb index 9117ffe..163bce3 100644 --- a/spec/support/namespaces.rb +++ b/spec/support/namespaces.rb @@ -27,6 +27,7 @@ class ModelB < Sequencescape::Api::Resource belongs_to :model_by_simple_name, :class_name => 'ModelA' belongs_to :model_by_full_name, :class_name => 'Nested::Model' belongs_to :model_with_early_data, :class_name => 'ModelA' + attribute_accessor :test_attribute end class ModelC < Sequencescape::Api::Resource From 45a33ddbefd98003bb42003f623d9ccbbd94f2b4 Mon Sep 17 00:00:00 2001 From: James Glover Date: Tue, 6 Jun 2017 11:13:37 +0100 Subject: [PATCH 2/3] Add transfer request collections --- lib/sequencescape-api/associations/belongs_to.rb | 6 ++++++ lib/sequencescape.rb | 3 +++ lib/sequencescape/plate.rb | 1 + lib/sequencescape/transfer_request.rb | 10 ++++++++++ lib/sequencescape/transfer_request_collection.rb | 8 ++++++++ .../create-model-c-has-many-inline-nested.txt | 10 ++++++++++ 6 files changed, 38 insertions(+) create mode 100644 lib/sequencescape/transfer_request.rb create mode 100644 lib/sequencescape/transfer_request_collection.rb create mode 100644 spec/sequencescape-api/contracts/create-model-c-has-many-inline-nested.txt diff --git a/lib/sequencescape-api/associations/belongs_to.rb b/lib/sequencescape-api/associations/belongs_to.rb index 79d06be..1c7f0cb 100644 --- a/lib/sequencescape-api/associations/belongs_to.rb +++ b/lib/sequencescape-api/associations/belongs_to.rb @@ -101,6 +101,12 @@ def object def uuid_only? @object.__send__(:uuid_only?) end + + delegate :hash, to: :uuid + + def eql?(other) + uuid == other.uuid + end end def belongs_to(association, options = {}, &block) diff --git a/lib/sequencescape.rb b/lib/sequencescape.rb index fcb5982..fe80645 100644 --- a/lib/sequencescape.rb +++ b/lib/sequencescape.rb @@ -40,6 +40,9 @@ module Sequencescape require 'sequencescape/work_completion' require 'sequencescape/custom_metadatum_collection' +require 'sequencescape/transfer_request_collection' +require 'sequencescape/transfer_request' + # Pulldown API support require 'sequencescape/plate_creation' require 'sequencescape/pooled_plate_creation' diff --git a/lib/sequencescape/plate.rb b/lib/sequencescape/plate.rb index d3dfe1a..24af76c 100644 --- a/lib/sequencescape/plate.rb +++ b/lib/sequencescape/plate.rb @@ -17,6 +17,7 @@ class Sequencescape::Plate < ::Sequencescape::Asset has_many :wells has_many :submission_pools + has_many :transfer_request_collections belongs_to :plate_purpose belongs_to :custom_metadatum_collection diff --git a/lib/sequencescape/transfer_request.rb b/lib/sequencescape/transfer_request.rb new file mode 100644 index 0000000..2f12327 --- /dev/null +++ b/lib/sequencescape/transfer_request.rb @@ -0,0 +1,10 @@ +require 'sequencescape-api/resource' + +class Sequencescape::TransferRequest < ::Sequencescape::Api::Resource + + belongs_to :source_asset, :class_name => 'Asset' + belongs_to :target_asset, :class_name => 'Asset' + + attribute_accessor :type, :state + +end diff --git a/lib/sequencescape/transfer_request_collection.rb b/lib/sequencescape/transfer_request_collection.rb new file mode 100644 index 0000000..d89da75 --- /dev/null +++ b/lib/sequencescape/transfer_request_collection.rb @@ -0,0 +1,8 @@ +require 'sequencescape-api/resource' + +class Sequencescape::TransferRequestCollection < ::Sequencescape::Api::Resource + belongs_to :user + # attribute_accessor :transfer_requests + has_many :transfer_requests, disposition: :inline + has_many :target_tubes, disposition: :inline, class_name: 'Tube' +end diff --git a/spec/sequencescape-api/contracts/create-model-c-has-many-inline-nested.txt b/spec/sequencescape-api/contracts/create-model-c-has-many-inline-nested.txt new file mode 100644 index 0000000..f5de759 --- /dev/null +++ b/spec/sequencescape-api/contracts/create-model-c-has-many-inline-nested.txt @@ -0,0 +1,10 @@ +POST /model_c/create HTTP/1.1 +Accept: application/json +Content-Type: application/json +Cookie: WTSISignOn=single-sign-on-cookie + +{ + "model_c": { + "model_bs": [{"test_attribute":"test_value"}] + } +} From 27b6f286f7a65fac28c6561970d119700d6d284b Mon Sep 17 00:00:00 2001 From: Yana Proskurina Date: Thu, 8 Jun 2017 11:16:02 +0100 Subject: [PATCH 3/3] Create transfer_request_collection.rb --- lib/sequencescape/transfer_request_collection.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/sequencescape/transfer_request_collection.rb b/lib/sequencescape/transfer_request_collection.rb index d89da75..a08aea2 100644 --- a/lib/sequencescape/transfer_request_collection.rb +++ b/lib/sequencescape/transfer_request_collection.rb @@ -2,7 +2,6 @@ class Sequencescape::TransferRequestCollection < ::Sequencescape::Api::Resource belongs_to :user - # attribute_accessor :transfer_requests has_many :transfer_requests, disposition: :inline has_many :target_tubes, disposition: :inline, class_name: 'Tube' end