artemis_api 0.2.0 → 0.7.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.ruby-version +1 -0
- data/Gemfile.lock +22 -14
- data/History.txt +18 -0
- data/README.md +40 -4
- data/artemis_api.gemspec +9 -7
- data/bin/console +2 -6
- data/lib/artemis_api.rb +6 -0
- data/lib/artemis_api/batch.rb +6 -4
- data/lib/artemis_api/client.rb +131 -51
- data/lib/artemis_api/crop_variety.rb +5 -0
- data/lib/artemis_api/custom_data.rb +5 -0
- data/lib/artemis_api/custom_fields.rb +5 -0
- data/lib/artemis_api/facility.rb +26 -10
- data/lib/artemis_api/model.rb +64 -21
- data/lib/artemis_api/resource_unit.rb +14 -0
- data/lib/artemis_api/stage.rb +15 -0
- data/lib/artemis_api/sub_stage.rb +5 -0
- data/lib/artemis_api/subscription.rb +4 -4
- data/lib/artemis_api/user.rb +1 -1
- data/lib/artemis_api/version.rb +1 -1
- data/lib/artemis_api/zone.rb +1 -0
- data/test/artemis_api_test.rb +7 -0
- data/test/batch_test.rb +94 -0
- data/test/client_test.rb +66 -0
- data/test/completion_test.rb +38 -0
- data/test/discard_test.rb +93 -0
- data/test/facility_test.rb +42 -0
- data/test/harvest_test.rb +33 -0
- data/test/harvest_unit_test.rb +25 -0
- data/test/item_test.rb +38 -0
- data/test/organization_test.rb +39 -0
- data/test/resource_unit_test.rb +33 -0
- data/test/seeding_unit_test.rb +24 -0
- data/test/stage_test.rb +39 -0
- data/test/subscription_test.rb +63 -0
- data/test/test_helper.rb +26 -0
- data/test/user_test.rb +66 -0
- data/test/zone_test.rb +42 -0
- metadata +62 -24
- data/artemis_api-0.1.0.gem +0 -0
data/lib/artemis_api/facility.rb
CHANGED
@@ -14,40 +14,48 @@ module ArtemisApi
|
|
14
14
|
ArtemisApi::Zone.find_all(facility_id: id, client: client, include: include)
|
15
15
|
end
|
16
16
|
|
17
|
-
def zone(zone_id, include: nil)
|
18
|
-
ArtemisApi::Zone.find(id: zone_id, facility_id: id, client: client, include: include)
|
17
|
+
def zone(zone_id, include: nil, force: false)
|
18
|
+
ArtemisApi::Zone.find(id: zone_id, facility_id: id, client: client, include: include, force: force)
|
19
19
|
end
|
20
20
|
|
21
21
|
def batches(include: nil)
|
22
22
|
ArtemisApi::Batch.find_all(facility_id: id, client: client, include: include)
|
23
23
|
end
|
24
24
|
|
25
|
-
def batch(batch_id, include: nil)
|
26
|
-
ArtemisApi::Batch.find(id: batch_id, facility_id: id, client: client, include: include)
|
25
|
+
def batch(batch_id, include: nil, force: false)
|
26
|
+
ArtemisApi::Batch.find(id: batch_id, facility_id: id, client: client, include: include, force: force)
|
27
27
|
end
|
28
28
|
|
29
29
|
def users(include: nil)
|
30
30
|
ArtemisApi::User.find_all(facility_id: id, client: client, include: include)
|
31
31
|
end
|
32
32
|
|
33
|
-
def user(user_id, include: nil)
|
34
|
-
ArtemisApi::User.find(id: user_id, facility_id: id, client: client, include: include)
|
33
|
+
def user(user_id, include: nil, force: false)
|
34
|
+
ArtemisApi::User.find(id: user_id, facility_id: id, client: client, include: include, force: force)
|
35
35
|
end
|
36
36
|
|
37
37
|
def seeding_units(include: nil)
|
38
38
|
ArtemisApi::SeedingUnit.find_all(facility_id: id, client: client, include: include)
|
39
39
|
end
|
40
40
|
|
41
|
-
def seeding_unit(unit_id, include: nil)
|
42
|
-
ArtemisApi::SeedingUnit.find(id: unit_id, facility_id: id, client: client, include: include)
|
41
|
+
def seeding_unit(unit_id, include: nil, force: false)
|
42
|
+
ArtemisApi::SeedingUnit.find(id: unit_id, facility_id: id, client: client, include: include, force: force)
|
43
|
+
end
|
44
|
+
|
45
|
+
def resource_units(include: nil)
|
46
|
+
ArtemisApi::ResourceUnit.find_all(facility_id: id, client: client, include: include)
|
47
|
+
end
|
48
|
+
|
49
|
+
def resource_unit(unit_id, include: nil, force: false)
|
50
|
+
ArtemisApi::ResourceUnit.find(id: unit_id, facility_id: id, client: client, include: include, force: force)
|
43
51
|
end
|
44
52
|
|
45
53
|
def harvest_units(include: nil)
|
46
54
|
ArtemisApi::HarvestUnit.find_all(facility_id: id, client: client, include: include)
|
47
55
|
end
|
48
56
|
|
49
|
-
def harvest_unit(unit_id, include: nil)
|
50
|
-
ArtemisApi::HarvestUnit.find(id: unit_id, facility_id: id, client: client, include: include)
|
57
|
+
def harvest_unit(unit_id, include: nil, force: false)
|
58
|
+
ArtemisApi::HarvestUnit.find(id: unit_id, facility_id: id, client: client, include: include, force: force)
|
51
59
|
end
|
52
60
|
|
53
61
|
def subscriptions
|
@@ -58,6 +66,14 @@ module ArtemisApi
|
|
58
66
|
ArtemisApi::Subscription.find(id: subscription_id, facility_id: id, client: client)
|
59
67
|
end
|
60
68
|
|
69
|
+
def stages
|
70
|
+
ArtemisApi::Stage.find_all(id, client)
|
71
|
+
end
|
72
|
+
|
73
|
+
def stage(stage_id)
|
74
|
+
ArtemisApi::Stage.find(stage_id, id, client)
|
75
|
+
end
|
76
|
+
|
61
77
|
def create_subscription(subject:, destination:)
|
62
78
|
ArtemisApi::Subscription.create(facility_id: id, subject: subject, destination: destination, client: client)
|
63
79
|
end
|
data/lib/artemis_api/model.rb
CHANGED
@@ -1,42 +1,85 @@
|
|
1
1
|
module ArtemisApi
|
2
2
|
class Model
|
3
|
-
attr_reader :client, :id, :attributes, :relationships
|
3
|
+
attr_reader :client, :id, :attributes, :relationships, :included
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
class << self
|
6
|
+
def related_to_one(name)
|
7
|
+
register_relationship(name)
|
8
|
+
|
9
|
+
send(:define_method, name.to_sym) do
|
10
|
+
related_id = relationships.dig(name.to_s, 'data', 'id')
|
11
|
+
included = client.get_record(name.to_s, related_id)
|
12
|
+
|
13
|
+
return included if included&.present?
|
14
|
+
|
15
|
+
relationship = relationships.dig(name.to_s, 'data')
|
16
|
+
return if relationship.nil?
|
17
|
+
|
18
|
+
@client.find_one(relationship['type'], relationship['id']) unless relationship['id'].to_s.empty? || relationship['id'].nil?
|
19
|
+
end
|
9
20
|
end
|
10
|
-
end
|
11
21
|
|
12
|
-
|
13
|
-
|
14
|
-
|
22
|
+
def related_to_many(name)
|
23
|
+
register_relationship(name)
|
24
|
+
|
25
|
+
send(:define_method, name.to_sym) do
|
26
|
+
included = relationships.dig(name.to_s, 'data')&.map do |related|
|
27
|
+
client.get_record(name.to_s, related['id'])
|
28
|
+
end
|
29
|
+
|
30
|
+
return included if included&.present?
|
31
|
+
|
32
|
+
@client.find_all(
|
33
|
+
relationships.dig(name.to_s, 'data', 0, 'type') || name.to_s,
|
34
|
+
filters: { name => id }
|
35
|
+
)
|
36
|
+
end
|
15
37
|
end
|
16
|
-
end
|
17
38
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
39
|
+
def json_type(type = nil)
|
40
|
+
if type
|
41
|
+
@json_type = type
|
42
|
+
@@registered_classes ||= {}
|
43
|
+
@@registered_classes[type] = self
|
44
|
+
end
|
45
|
+
@json_type
|
23
46
|
end
|
24
|
-
@json_type
|
25
|
-
end
|
26
47
|
|
27
|
-
|
28
|
-
|
48
|
+
def instance_for(type, data, included, client)
|
49
|
+
@@registered_classes[type]&.new(client, data, included)
|
50
|
+
end
|
51
|
+
|
52
|
+
def relationships
|
53
|
+
@relationships ||= []
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def register_relationship(name)
|
59
|
+
relationships << name.to_sym
|
60
|
+
end
|
29
61
|
end
|
30
62
|
|
31
63
|
def method_missing(name)
|
32
|
-
attributes[name.to_s]
|
64
|
+
respond_to_missing?(name) ? attributes[name.to_s] : super
|
65
|
+
end
|
66
|
+
|
67
|
+
def respond_to_missing?(name)
|
68
|
+
attributes.key?(name.to_s)
|
33
69
|
end
|
34
70
|
|
35
|
-
def initialize(client, data)
|
71
|
+
def initialize(client, data, included = nil)
|
36
72
|
@client = client
|
37
73
|
@id = data['id'].to_i
|
38
74
|
@attributes = data['attributes']
|
39
75
|
@relationships = data['relationships']
|
76
|
+
@included = included
|
77
|
+
end
|
78
|
+
|
79
|
+
def inspect
|
80
|
+
vars = %i[id attributes].map { |v| "#{v}=#{send(v).inspect}" }.join(', ')
|
81
|
+
vars << ", relationships={#{self.class.relationships.join(', ')}}"
|
82
|
+
"<#{self.class}: #{vars}>"
|
40
83
|
end
|
41
84
|
end
|
42
85
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module ArtemisApi
|
2
|
+
class ResourceUnit < ArtemisApi::Model
|
3
|
+
json_type 'resource_units'
|
4
|
+
related_to_one :crop_variety
|
5
|
+
|
6
|
+
def self.find(id:, facility_id:, client:, include: nil, force: false)
|
7
|
+
client.find_one(self.json_type, id, facility_id: facility_id, include: include, force: force)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.find_all(facility_id:, client:, include: nil)
|
11
|
+
client.find_all(self.json_type, facility_id: facility_id, include: include)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module ArtemisApi
|
2
|
+
class Stage < ArtemisApi::Model
|
3
|
+
json_type 'stages'
|
4
|
+
related_to_many :sub_stages
|
5
|
+
related_to_many :zones
|
6
|
+
|
7
|
+
def self.find(id, facility_id, client, include: 'sub_stages,zones', force: false)
|
8
|
+
client.find_one(self.json_type, id, facility_id: facility_id, include: include, force: force)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.find_all(facility_id, client, include: 'sub_stages,zones')
|
12
|
+
client.find_all(self.json_type, facility_id: facility_id, include: include)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -6,12 +6,12 @@ module ArtemisApi
|
|
6
6
|
client.find_one(self.json_type, id, facility_id: facility_id, include: include, force: force)
|
7
7
|
end
|
8
8
|
|
9
|
-
def self.find_all(facility_id:, client:, include: nil
|
10
|
-
client.find_all(self.json_type, facility_id: facility_id, include: include
|
9
|
+
def self.find_all(facility_id:, client:, include: nil)
|
10
|
+
client.find_all(self.json_type, facility_id: facility_id, include: include)
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.create(facility_id:, subject:, destination:, client:)
|
14
|
-
client.
|
14
|
+
client.auto_refresh!
|
15
15
|
|
16
16
|
url = "#{client.options[:base_uri]}/api/v3/facilities/#{facility_id}/subscriptions"
|
17
17
|
params = { body: { subscription: { subject: subject, destination: destination } } }
|
@@ -22,7 +22,7 @@ module ArtemisApi
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def self.delete(id:, facility_id:, client:)
|
25
|
-
client.
|
25
|
+
client.auto_refresh!
|
26
26
|
|
27
27
|
url = "#{client.options[:base_uri]}/api/v3/facilities/#{facility_id}/subscriptions/#{id}"
|
28
28
|
|
data/lib/artemis_api/user.rb
CHANGED
@@ -5,7 +5,7 @@ module ArtemisApi
|
|
5
5
|
|
6
6
|
def self.get_current(client:, include: nil)
|
7
7
|
self.json_type
|
8
|
-
client.
|
8
|
+
client.auto_refresh!
|
9
9
|
url = "#{client.options[:base_uri]}/api/v3/user"
|
10
10
|
url = "#{url}?include=#{include}" if include
|
11
11
|
response = client.oauth_token.get(url)
|
data/lib/artemis_api/version.rb
CHANGED
data/lib/artemis_api/zone.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module ArtemisApi
|
2
2
|
class Zone < ArtemisApi::Model
|
3
3
|
json_type 'zones'
|
4
|
+
related_to_one 'sub_stage'
|
4
5
|
|
5
6
|
def self.find(id:, facility_id:, client:, include: nil, force: false)
|
6
7
|
client.find_one(self.json_type, id, facility_id: facility_id, include: include, force: force)
|
data/test/batch_test.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class BatchTest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
get_client
|
6
|
+
get_facility
|
7
|
+
|
8
|
+
stub_request(:get, "http://localhost:3000/api/v3/facilities/#{@facility.id}/batches")
|
9
|
+
.to_return(body: {data: [{id: '1', type: 'batches', attributes: {id: 1, arbitrary_id: 'Jun16-Gem-Let'}}, {id: '2', type: 'batches', attributes: {id: 2, name: 'Jun19-Bok-Cho'}}]}.to_json)
|
10
|
+
|
11
|
+
stub_request(:get, "http://localhost:3000/api/v3/facilities/#{@facility.id}/batches/2")
|
12
|
+
.to_return(body: {data: {id: '2', type: 'batches', attributes: {id: 2, arbitrary_id: 'Jun19-Bok-Cho'}}}.to_json)
|
13
|
+
|
14
|
+
stub_request(:get, "http://localhost:3000/api/v3/facilities/#{@facility.id}/batches/2?include=zone")
|
15
|
+
.to_return(body: {data:
|
16
|
+
{id: '2',
|
17
|
+
type: 'batches',
|
18
|
+
attributes: {id: 2, arbitrary_id: 'Jun19-Bok-Cho'},
|
19
|
+
relationships: {zone: {data: {id: 1, type: 'zones'}}}
|
20
|
+
},
|
21
|
+
included: [{id: '1', type: 'zones', attributes: {id: 1, name: 'Germination'}}]}.to_json)
|
22
|
+
|
23
|
+
stub_request(:get, "http://localhost:3000/api/v3/facilities/#{@facility.id}/batches?filter[search]=oct")
|
24
|
+
.to_return(body: {data: [{id: '1', type: 'batches', attributes: {id: 1, arbitrary_id: 'Oct16-Gem-Let'}}, {id: '2', type: 'batches', attributes: {id: 2, name: 'Oct19-Bok-Cho'}}]}.to_json)
|
25
|
+
|
26
|
+
stub_request(:get, "http://localhost:3000/api/v3/facilities/#{@facility.id}/batches?filter[ids][]=2&filter[ids][]=3")
|
27
|
+
.to_return(body: {data: [{id: '2', type: 'batches', attributes: {id: 2, name: 'Oct19-Bok-Cho'}}]}.to_json)
|
28
|
+
|
29
|
+
stub_request(:get, "http://localhost:3000/api/v3/facilities/#{@facility.id}/batches?page[limit]=1&page[offset]=4")
|
30
|
+
.to_return(body: {data: [{id: '2', type: 'batches', attributes: {id: 2, name: 'Oct19-Bok-Cho'}}]}.to_json)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_finding_all_batches
|
34
|
+
batches = ArtemisApi::Batch.find_all(facility_id: @facility.id, client: @client)
|
35
|
+
assert_equal 2, batches.count
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_finding_all_batches_through_facility
|
39
|
+
batches = @facility.batches
|
40
|
+
assert_equal 2, batches.count
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_finding_a_specific_batch
|
44
|
+
batch = ArtemisApi::Batch.find(id: 2, facility_id: @facility.id, client: @client)
|
45
|
+
assert_equal 'Jun19-Bok-Cho', batch.arbitrary_id
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_finding_a_specific_batch_through_facility
|
49
|
+
batch = @facility.batch(2)
|
50
|
+
assert_equal 'Jun19-Bok-Cho', batch.arbitrary_id
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_finding_a_batch_with_zone_included
|
54
|
+
batch = ArtemisApi::Batch.find(id: 2, facility_id: @facility.id, client: @client, include: "zone")
|
55
|
+
assert_equal 'Jun19-Bok-Cho', batch.arbitrary_id
|
56
|
+
assert_equal @client.objects['zones'].count, 1
|
57
|
+
|
58
|
+
zone = ArtemisApi::Zone.find(id: 1, facility_id: @facility.id, client: @client)
|
59
|
+
assert_equal zone.name, 'Germination'
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_related_to_one_zone
|
63
|
+
batch = ArtemisApi::Batch.find(id: 2, facility_id: @facility.id, client: @client, include: "zone")
|
64
|
+
zone = batch.zone
|
65
|
+
assert_equal zone.name, 'Germination'
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_filtering_by_search_term
|
69
|
+
batches = ArtemisApi::Batch.find_all(facility_id: @facility.id, client: @client, filters: {search: "oct"})
|
70
|
+
assert_equal 2, batches.count
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_filtering_by_ids
|
74
|
+
batches = ArtemisApi::Batch.find_all(facility_id: @facility.id, client: @client, filters: {ids: [2, 3]})
|
75
|
+
assert_equal 1, batches.count
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_filtering_by_date_window
|
79
|
+
ending = Time.now + 2.day
|
80
|
+
beginning = ending - 15.days
|
81
|
+
date_window = [beginning, ending].join(',')
|
82
|
+
|
83
|
+
stub_request(:get, "http://localhost:3000/api/v3/facilities/#{@facility.id}/batches?filter[date_type]=seeded_at&filter[date_window]=#{CGI.escape(date_window)}")
|
84
|
+
.to_return(body: {data: [{id: 'd1', type: 'batches', attributes: {id: 1, arbitrary_id: 'Oct16-Gem-Let'}}, {id: '2', type: 'batches', attributes: {id: 2, name: 'Oct19-Bok-Cho'}}]}.to_json)
|
85
|
+
|
86
|
+
batches = ArtemisApi::Batch.find_all(facility_id: @facility.id, client: @client, filters: {date_type: "seeded_at", date_window: date_window})
|
87
|
+
assert_equal 2, batches.count
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_pagination
|
91
|
+
batches = ArtemisApi::Batch.find_all(facility_id: @facility.id, client: @client, page: {limit: 1, offset: 4})
|
92
|
+
assert_equal 1, batches.count
|
93
|
+
end
|
94
|
+
end
|
data/test/client_test.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class ClientTest < Minitest::Test
|
4
|
+
def stub_user
|
5
|
+
stub_request(:get, "http://localhost:3000/api/v3/user")
|
6
|
+
.to_return(body: {data: {id: '41', type: 'users', attributes: {id: 41, full_name: 'Jamey Hampton', email: 'jhampton@artemisag.com'}}}.to_json)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_creating_a_client_instance
|
10
|
+
get_client
|
11
|
+
|
12
|
+
assert_equal '12345', @client.oauth_client.id
|
13
|
+
assert_equal 'ya29', @client.oauth_token.token
|
14
|
+
assert_equal @expires_at.to_i, @client.oauth_token.expires_at
|
15
|
+
assert_equal false, @client.oauth_token.expired?
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_creating_a_client_instance_with_auth_code
|
19
|
+
stub_request(:post, 'http://localhost:3000/oauth/token')
|
20
|
+
.with(body: {"client_id"=>"12345",
|
21
|
+
"client_secret"=>"67890",
|
22
|
+
"code"=>"aJ7xsj7",
|
23
|
+
"grant_type"=>"authorization_code",
|
24
|
+
"redirect_uri"=>"urn:ietf:wg:oauth:2.0:oob"})
|
25
|
+
.to_return(status: 200, body: {access_token: 'ya29', refresh_token: 'eyJh', expires_in: 7200, token_type: 'Bearer', created_at: Time.now.to_i}.to_json, headers: { 'Content-Type'=> 'application/json;charset=UTF-8'})
|
26
|
+
|
27
|
+
options = {app_id: '12345',
|
28
|
+
app_secret: '67890',
|
29
|
+
base_uri: 'http://localhost:3000'}
|
30
|
+
@client = ArtemisApi::Client.new(auth_code: 'aJ7xsj7', options: options)
|
31
|
+
|
32
|
+
assert_equal '12345', @client.oauth_client.id
|
33
|
+
assert_equal 'ya29', @client.oauth_token.token
|
34
|
+
assert_equal false, @client.oauth_token.expired?
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_creating_an_invalid_client_instance
|
38
|
+
assert_raises(ArgumentError) { ArtemisApi::Client.new(access_token: 'ya29') }
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_current_user
|
42
|
+
get_client
|
43
|
+
stub_user
|
44
|
+
|
45
|
+
user = @client.current_user
|
46
|
+
assert_equal user.class, ArtemisApi::User
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_remove_record
|
50
|
+
get_client
|
51
|
+
|
52
|
+
type = 'subscriptions'
|
53
|
+
|
54
|
+
# model type added once, removed twice
|
55
|
+
@client.store_record(type, 1, 'id' => 1)
|
56
|
+
assert_equal 1, @client.get_record(type, 1).id
|
57
|
+
@client.remove_record(type, 1)
|
58
|
+
assert_nil @client.get_record(type, 1)
|
59
|
+
assert_nothing_raised { @client.remove_record(type, 1) }
|
60
|
+
|
61
|
+
# model type not added, attempt to remove one
|
62
|
+
undefined_type = 'something'
|
63
|
+
assert_nil @client.instance_variable_get(:"@objects")[undefined_type]
|
64
|
+
assert_nothing_raised { @client.remove_record(undefined_type, 1) }
|
65
|
+
end
|
66
|
+
end
|