kakaxi_parse 0.2.4
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 +7 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +17 -0
- data/kakaxi_parse.gemspec +14 -0
- data/lib/kakaxi_parse.rb +5 -0
- data/lib/kakaxi_parse/api.rb +51 -0
- data/lib/kakaxi_parse/base_model.rb +126 -0
- data/lib/kakaxi_parse/climate.rb +63 -0
- data/lib/kakaxi_parse/datatypes/add_relation.rb +19 -0
- data/lib/kakaxi_parse/datatypes/base_datatype.rb +6 -0
- data/lib/kakaxi_parse/datatypes/datatype.rb +6 -0
- data/lib/kakaxi_parse/datatypes/datetime.rb +26 -0
- data/lib/kakaxi_parse/datatypes/geopoint.rb +16 -0
- data/lib/kakaxi_parse/datatypes/pointer.rb +16 -0
- data/lib/kakaxi_parse/datatypes/remove_relation.rb +19 -0
- data/lib/kakaxi_parse/datatypes/timelapse.rb +2 -0
- data/lib/kakaxi_parse/farm.rb +67 -0
- data/lib/kakaxi_parse/farm_manager_user.rb +63 -0
- data/lib/kakaxi_parse/interval_photo.rb +65 -0
- data/lib/kakaxi_parse/kakaxi_device.rb +150 -0
- data/lib/kakaxi_parse/model.rb +9 -0
- data/lib/kakaxi_parse/role.rb +51 -0
- data/lib/kakaxi_parse/timelapse.rb +57 -0
- data/lib/kakaxi_parse/user.rb +78 -0
- metadata +66 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 82ea4d2a2843181038c22a3258ec3fb1c25756f5870f65a18d0522aece359bd2
|
4
|
+
data.tar.gz: ec38f39676503896860892afc69f1fb2a4079dff1fc7e2ebf5e0b443bcf3ca98
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6eed0c2644e8b9fa366e9715975b73060c7c1308fe6f5662dd774ac91a07f12c8b2198ad9e67baac149cbbbcf19c8c69671123f5b1a019444319616e8ba88152
|
7
|
+
data.tar.gz: 0cbdef90d74a0807b7dfe8818e78079fea1e567adaa7a6be67e6be5cbff295612eee1eb6e183d38056fe115dd6e6bca6fb23a2c5abc982a7b6dc529a386f7f2d
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'kakaxi_parse'
|
6
|
+
s.version = '0.2.4'
|
7
|
+
s.licenses = ['MIT']
|
8
|
+
s.summary = 'Kakaxi Parse SDK'
|
9
|
+
s.description = 'Make it easy to controll Parse in ruby'
|
10
|
+
s.authors = ['Naggi Goishi']
|
11
|
+
s.email = 'naggi@kakaxi.jp'
|
12
|
+
s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|pkg)/}) }
|
13
|
+
s.homepage = 'https://github.com/kakaxi-inc/kakaxi-parse-ruby.git'
|
14
|
+
end
|
data/lib/kakaxi_parse.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
module KakaxiParse
|
2
|
+
class API
|
3
|
+
BASE_URL = 'https://parseapi.back4app.com/'
|
4
|
+
|
5
|
+
def initialize(endpoint, params: {})
|
6
|
+
@uri = URI.parse(BASE_URL + endpoint)
|
7
|
+
@params = params
|
8
|
+
end
|
9
|
+
|
10
|
+
def get
|
11
|
+
@uri.query = URI.encode_www_form(@params)
|
12
|
+
request = Net::HTTP::Get.new(@uri)
|
13
|
+
set_auth_header!(request)
|
14
|
+
request(request)
|
15
|
+
end
|
16
|
+
|
17
|
+
def put
|
18
|
+
request = Net::HTTP::Put.new(@uri)
|
19
|
+
request.body = @params.to_json
|
20
|
+
set_auth_header!(request)
|
21
|
+
request['Content-Type'] = 'application/json'
|
22
|
+
request(request)
|
23
|
+
end
|
24
|
+
|
25
|
+
def post
|
26
|
+
request = Net::HTTP::Post.new(@uri)
|
27
|
+
request.body = @params.to_json
|
28
|
+
set_auth_header!(request)
|
29
|
+
request['Content-Type'] = 'application/json'
|
30
|
+
request(request)
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete
|
34
|
+
request = Net::HTTP::Delete.new(@uri)
|
35
|
+
set_auth_header!(request)
|
36
|
+
request(request)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def set_auth_header!(request)
|
41
|
+
request['X-Parse-Application-Id'] = ENV['PARSE_ID']
|
42
|
+
request['X-Parse-Master-Key'] = ENV['PARSE_MASTER_KEY']
|
43
|
+
end
|
44
|
+
|
45
|
+
def request(request)
|
46
|
+
Net::HTTP.start(@uri.host, @uri.port, use_ssl: true) do |https|
|
47
|
+
JSON.parse(https.request(request).body)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'kakaxi_parse/api'
|
2
|
+
|
3
|
+
module KakaxiParse
|
4
|
+
class BaseModel
|
5
|
+
DEFUALT_LIMIT = 1000
|
6
|
+
attr_accessor :id, :name, :updated_at, :created_at
|
7
|
+
|
8
|
+
def initialize(id, name, updated_at, created_at)
|
9
|
+
@id = id
|
10
|
+
@name = name if name
|
11
|
+
@updated_at = DateTime.strptime(updated_at, '%Y-%m-%dT%H:%M:%S.%LZ') if updated_at
|
12
|
+
@created_at = DateTime.strptime(created_at, '%Y-%m-%dT%H:%M:%S.%LZ') if created_at
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.all(limit: DEFUALT_LIMIT)
|
16
|
+
to_objects(API.new("classes/#{ self.demodulize }", params: { limit: limit }).get['results'])
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.where(model, hash, limit, belongs_to = [], related_to = [])
|
20
|
+
params = { limit: limit }.merge(where: format(hash, belongs_to, related_to).to_json)
|
21
|
+
API.new("classes/#{ model.demodulize }", params: params).get['results']
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.order(order='created_at', limit=DEFUALT_LIMIT)
|
25
|
+
params = { limit: limit }.merge(order: camelize(order))
|
26
|
+
to_objects(API.new("classes/#{ self.demodulize }", params: params).get['results'])
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.short_name
|
30
|
+
raise NotImplementedError
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.find(id)
|
34
|
+
where(id: id).first
|
35
|
+
end
|
36
|
+
|
37
|
+
def save(record, params, belongs_to = [], related_to = [])
|
38
|
+
result = API.new("classes/#{record.class.demodulize}", params: BaseModel.format(params, belongs_to, related_to)).post
|
39
|
+
if result.has_key? 'objectId'
|
40
|
+
self.created_at = DateTime.strptime(result['createdAt'], '%Y-%m-%dT%H:%M:%S.%LZ')
|
41
|
+
self.id = result['objectId']
|
42
|
+
true
|
43
|
+
else
|
44
|
+
false
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def update(record, params, belongs_to = [], related_to = [])
|
49
|
+
result = API.new("classes/#{record.class.demodulize}/#{record.id}", params: BaseModel.format(params, belongs_to, related_to)).put
|
50
|
+
if result.has_key? 'updatedAt'
|
51
|
+
self.updated_at = DateTime.strptime(result['updatedAt'], '%Y-%m-%dT%H:%M:%S.%LZ')
|
52
|
+
true
|
53
|
+
else
|
54
|
+
false
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def delete
|
59
|
+
API.new("classes/#{self.class.demodulize}/#{self.id}").delete
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.demodulize
|
63
|
+
self.name.split('::').last
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
def self.replace_key(hash, old_key, new_key)
|
68
|
+
hash[new_key] = hash.delete(old_key) if hash.has_key? old_key
|
69
|
+
hash
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.keys_to_camel(hash)
|
73
|
+
hash.keys.each { |key, _| replace_key(hash, key, camelize(key.to_s)) }
|
74
|
+
hash
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.camelize(string)
|
78
|
+
if ['imsi', 'imei', 'iccid'].include?(string)
|
79
|
+
return string.upcase
|
80
|
+
end
|
81
|
+
string.split('_').map(&:capitalize).join.tap { |e| e[0] = e[0].downcase }
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.to_reference_key(reference_name)
|
85
|
+
(reference_name.to_s + '_id').to_sym
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.to_reference_key_array(reference_names)
|
89
|
+
reference_names.map { |name| to_reference_key(name) }
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.validate_relation(hash, belongs_to, related_to)
|
93
|
+
belongs_to.each do |klass|
|
94
|
+
short_name = klass.short_name
|
95
|
+
reference = to_reference_key(short_name)
|
96
|
+
if hash.has_key? reference
|
97
|
+
replace_key(hash, reference, short_name)
|
98
|
+
hash[short_name] = Datatype::Pointer.new(klass, hash[short_name]).to_hash
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
related_to.each do |klass|
|
103
|
+
short_name = klass.short_name
|
104
|
+
reference = to_reference_key(short_name)
|
105
|
+
if hash.has_key? reference
|
106
|
+
replace_key(hash, reference, '$related_to')
|
107
|
+
hash['$related_to'] = { object: Datatype::Pointer.new(klass, hash['$related_to']).to_hash, key: self.reference_name }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
hash
|
111
|
+
end
|
112
|
+
|
113
|
+
def self.format(hash, belongs_to, related_to)
|
114
|
+
hash = validate_relation(hash, belongs_to, related_to)
|
115
|
+
replace_key(hash, :id, :object_id)
|
116
|
+
keys_to_camel(hash)
|
117
|
+
end
|
118
|
+
|
119
|
+
def build_original_params(params)
|
120
|
+
original_params = {}
|
121
|
+
params.each { |key, value| original_params[key] = value }
|
122
|
+
original_params
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module KakaxiParse
|
2
|
+
class Climate < BaseModel
|
3
|
+
@@belongs_to = [KakaxiDevice]
|
4
|
+
@@attributes = %i(solar_radiation recorded_at rain_amount rainfall humidity temperature weather device_id power_feeding interpolation)
|
5
|
+
attr_accessor *@@attributes
|
6
|
+
|
7
|
+
def initialize(
|
8
|
+
id: nil,
|
9
|
+
updated_at: nil,
|
10
|
+
created_at: nil,
|
11
|
+
solar_radiation: nil,
|
12
|
+
recorded_at: nil,
|
13
|
+
rain_amount: nil,
|
14
|
+
rainfall: nil,
|
15
|
+
humidity: nil,
|
16
|
+
temperature: nil,
|
17
|
+
weather: nil,
|
18
|
+
device_id: nil,
|
19
|
+
power_feeding: nil,
|
20
|
+
interpolation: nil
|
21
|
+
)
|
22
|
+
@solar_radiation = solar_radiation
|
23
|
+
@recorded_at = DateTime.strptime(recorded_at, '%Y-%m-%dT%H:%M:%S.%LZ')
|
24
|
+
@rain_amount = rain_amount
|
25
|
+
@humidity = humidity
|
26
|
+
@temperature = temperature
|
27
|
+
@weather = weather
|
28
|
+
@device_id = device_id
|
29
|
+
@power_feeding = power_feeding
|
30
|
+
@interpolation = interpolation
|
31
|
+
super(id, nil, updated_at, created_at)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.where(hash, limit: DEFUALT_LIMIT)
|
35
|
+
to_objects(super(self, hash, limit, @@belongs_to)) if valid_key?(hash)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def self.to_objects(climates)
|
40
|
+
climates.map do |climate|
|
41
|
+
new(
|
42
|
+
id: climate['objectId'],
|
43
|
+
updated_at: climate['updatedAt'],
|
44
|
+
created_at: climate['createdAt'],
|
45
|
+
solar_radiation: climate['solarRadiation'],
|
46
|
+
recorded_at: climate['recordedAt']['iso'],
|
47
|
+
rain_amount: climate['rainAmount'],
|
48
|
+
rainfall: climate['rainfall'],
|
49
|
+
humidity: climate['humidity'],
|
50
|
+
temperature: climate['temperature'],
|
51
|
+
weather: climate['weather'],
|
52
|
+
device_id: climate['device']['objectId'],
|
53
|
+
power_feeding: climate['powerFeeding'],
|
54
|
+
interpolation: climate['interpolation']
|
55
|
+
)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.valid_key?(hash)
|
60
|
+
hash.keys.all? { |key| %i(id updated_at created_at solar_radiation recorded_at rain_amount rainfall humidity temperature weather device_id power_feeding interpolation).include? key }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module KakaxiParse
|
2
|
+
module Datatype
|
3
|
+
class AddRelation
|
4
|
+
def initialize(klass, ids)
|
5
|
+
@klass = klass
|
6
|
+
@ids = ids
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_hash
|
10
|
+
{
|
11
|
+
@klass.reference_name.to_sym => {
|
12
|
+
__op: "AddRelation",
|
13
|
+
objects: @ids.map { |id| Datatype::Pointer.new(@klass, id).to_hash }
|
14
|
+
}
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
require 'kakaxi_parse/datatypes/base_datatype'
|
2
|
+
require 'kakaxi_parse/datatypes/pointer'
|
3
|
+
require 'kakaxi_parse/datatypes/geopoint'
|
4
|
+
require 'kakaxi_parse/datatypes/datetime'
|
5
|
+
require 'kakaxi_parse/datatypes/add_relation'
|
6
|
+
require 'kakaxi_parse/datatypes/remove_relation'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module KakaxiParse
|
2
|
+
module Datatype
|
3
|
+
class DateTime
|
4
|
+
attr_accessor :year, :month, :day, :hour, :minute, :second
|
5
|
+
|
6
|
+
def initialize(*args)
|
7
|
+
if args.length == 1 && args[0].class == String
|
8
|
+
datetime = DateTime.strptime(args[0], '%Y-%m-%dT%H:%M:%S.%LZ')
|
9
|
+
@year = datetime.year
|
10
|
+
@month = datetime.month
|
11
|
+
@day = datetime.day
|
12
|
+
@hour = datetime.hour
|
13
|
+
@minute = datetime.minute
|
14
|
+
@second = datetime.second
|
15
|
+
else
|
16
|
+
@year = args[0] || nil
|
17
|
+
@month = args[1] || nil
|
18
|
+
@day = args[2] || nil
|
19
|
+
@hour = args[3] || nil
|
20
|
+
@minute = args[4] || nil
|
21
|
+
@second = args[5] || nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module KakaxiParse
|
2
|
+
module Datatype
|
3
|
+
class GeoPoint
|
4
|
+
attr_accessor :lat, :lon
|
5
|
+
|
6
|
+
def initialize(lat=nil, lon=nil)
|
7
|
+
@lat = lat.to_f
|
8
|
+
@lon = lon.to_f
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_hash
|
12
|
+
{ __type: 'GeoPoint', latitude: @lat, longitude: @lon }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module KakaxiParse
|
2
|
+
module Datatype
|
3
|
+
class Pointer < Base
|
4
|
+
attr_accessor :id
|
5
|
+
|
6
|
+
def initialize(klass, id)
|
7
|
+
@id = id
|
8
|
+
@klass = klass
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_hash
|
12
|
+
{ __type: 'Pointer', className: @klass.demodulize, objectId: @id }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module KakaxiParse
|
2
|
+
module Datatype
|
3
|
+
class RemoveRelation
|
4
|
+
def initialize(klass, ids)
|
5
|
+
@klass = klass
|
6
|
+
@ids = ids
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_hash
|
10
|
+
{
|
11
|
+
@klass.reference_name.to_sym => {
|
12
|
+
__op: "RemoveRelation",
|
13
|
+
objects: @ids.map { |id| Datatype::Pointer.new(@klass, id).to_hash }
|
14
|
+
}
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module KakaxiParse
|
2
|
+
class Farm < BaseModel
|
3
|
+
attr_accessor :farmer_id, :location
|
4
|
+
@@belongs_to = [User]
|
5
|
+
|
6
|
+
def initialize(
|
7
|
+
id: nil,
|
8
|
+
name: nil,
|
9
|
+
farmer_id: nil,
|
10
|
+
location: nil,
|
11
|
+
updated_at: nil,
|
12
|
+
created_at: nil
|
13
|
+
)
|
14
|
+
@farmer_id = farmer_id
|
15
|
+
@location = location
|
16
|
+
super(id, name, updated_at, created_at)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.where(hash, limit: DEFUALT_LIMIT)
|
20
|
+
to_objects(super(self, hash, limit, @@belongs_to)) if valid_key?(hash)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.short_name
|
24
|
+
'farm'
|
25
|
+
end
|
26
|
+
|
27
|
+
def save
|
28
|
+
id ? false : super(self, { name: name, farmer_id: farmer_id }, @@belongs_to)
|
29
|
+
end
|
30
|
+
|
31
|
+
def update(params)
|
32
|
+
original_params = build_original_params(params)
|
33
|
+
if super(self, params, @@belongs_to)
|
34
|
+
original_params.each { |key, value| self.send("#{key}=", value) }
|
35
|
+
true
|
36
|
+
else
|
37
|
+
false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def farmer
|
42
|
+
User.find(farmer_id)
|
43
|
+
end
|
44
|
+
|
45
|
+
def devices
|
46
|
+
KakaxiDevice.where(farm_id: id)
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
def self.valid_key?(hash)
|
51
|
+
hash.keys.all? { |key| %i(id name farmer_id updated_at created_at).include? key }
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.to_objects(farms)
|
55
|
+
farms.map do |farm|
|
56
|
+
new(
|
57
|
+
id: farm['objectId'],
|
58
|
+
name: farm['name'],
|
59
|
+
farmer_id: farm['farmer'] && farm['farmer']['objectId'],
|
60
|
+
location: farm['location'],
|
61
|
+
updated_at: farm['updatedAt'],
|
62
|
+
created_at: farm['createdAt']
|
63
|
+
)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module KakaxiParse
|
2
|
+
class FarmManagerUser < BaseModel
|
3
|
+
def initialize(id: nil, devices: nil, updated_at: nil, created_at: nil)
|
4
|
+
@devices = devices
|
5
|
+
super(id, nil, updated_at, created_at)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.short_name
|
9
|
+
'farm_manager_user'
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.all(limit: DEFUALT_LIMIT)
|
13
|
+
to_objects(API.new("classes/#{self.demodulize}", params: { limit: limit }).get)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.where(hash, limit: DEFUALT_LIMIT)
|
17
|
+
to_objects(super(self, hash, limit)) if valid_key?(hash)
|
18
|
+
end
|
19
|
+
|
20
|
+
def save
|
21
|
+
params = {}
|
22
|
+
params = Datatype::AddRelation.new(KakaxiDevice, @devices.map(&:id)).to_hash if @devices
|
23
|
+
id ? false : super(self, params)
|
24
|
+
end
|
25
|
+
|
26
|
+
def add_device(id)
|
27
|
+
params = Datatype::AddRelation.new(KakaxiDevice, [id]).to_hash
|
28
|
+
result = API.new("classes/#{ self.class.demodulize }/#{ self.id }", params: params).put
|
29
|
+
if result.has_key? 'updatedAt'
|
30
|
+
self.updated_at = DateTime.strptime(result['updatedAt'], '%Y-%m-%dT%H:%M:%S.%LZ')
|
31
|
+
true
|
32
|
+
else
|
33
|
+
false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def remove_device(id)
|
38
|
+
params = Datatype::RemoveRelation.new(KakaxiDevice, [id]).to_hash
|
39
|
+
result = API.new("classes/#{ self.class.demodulize }/#{ self.id }", params: params).put
|
40
|
+
if result.has_key? 'updatedAt'
|
41
|
+
self.updated_at = DateTime.strptime(result['updatedAt'], '%Y-%m-%dT%H:%M:%S.%LZ')
|
42
|
+
true
|
43
|
+
else
|
44
|
+
false
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def self.valid_key?(hash)
|
50
|
+
hash.keys.all? { |key| %i(id devices updated_at created_at).include? key }
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.to_objects(farm_manager_users)
|
54
|
+
farm_manager_users.map do |user|
|
55
|
+
new(
|
56
|
+
id: user['objectId'],
|
57
|
+
updated_at: user['updatedAt'],
|
58
|
+
created_at: user['createdAt']
|
59
|
+
)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# String id
|
2
|
+
# String name
|
3
|
+
# String url
|
4
|
+
# String device_id
|
5
|
+
# Datetime taken_at
|
6
|
+
# Datetime updated_at
|
7
|
+
# Datetime created_at
|
8
|
+
|
9
|
+
module KakaxiParse
|
10
|
+
class IntervalPhoto < BaseModel
|
11
|
+
attr_accessor :url, :taken_at, :device_id
|
12
|
+
@@belongs_to = [KakaxiDevice]
|
13
|
+
|
14
|
+
def initialize(
|
15
|
+
id: nil,
|
16
|
+
name: nil,
|
17
|
+
url: nil,
|
18
|
+
device_id: nil,
|
19
|
+
taken_at: nil,
|
20
|
+
updated_at: nil,
|
21
|
+
created_at: nil
|
22
|
+
)
|
23
|
+
@url = url
|
24
|
+
@device_id = Datatype::Pointer.new(KakaxiDevice, device_id)
|
25
|
+
@taken_at = DateTime.strptime(taken_at, '%Y-%m-%dT%H:%M:%S.%LZ')
|
26
|
+
super(id, name, updated_at, created_at)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.where(hash, limit: DEFUALT_LIMIT)
|
30
|
+
to_objects(super(self, hash, limit, @@belongs_to)) if valid_key?(hash)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.short_name
|
34
|
+
'photo'
|
35
|
+
end
|
36
|
+
|
37
|
+
def device_id
|
38
|
+
@device_id.id
|
39
|
+
end
|
40
|
+
|
41
|
+
def device_id=(id)
|
42
|
+
@device_id.id = id
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
def self.valid_key?(hash)
|
47
|
+
hash.keys.all? { |key| %i(id name url device_id taken_at updated_at created_at).include? key }
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.to_objects(photos)
|
51
|
+
photos.map do |photo|
|
52
|
+
new(
|
53
|
+
id: photo['objectId'],
|
54
|
+
name: photo['photo'] && photo['photo']['name'],
|
55
|
+
url: photo['photo'] && photo['photo']['url'],
|
56
|
+
device_id: photo['device'] && photo['device']['objectId'],
|
57
|
+
taken_at: photo['takenAt']['iso'],
|
58
|
+
updated_at: photo['updatedAt'],
|
59
|
+
created_at: photo['createdAt']
|
60
|
+
)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
@@ -0,0 +1,150 @@
|
|
1
|
+
module KakaxiParse
|
2
|
+
class KakaxiDevice < BaseModel
|
3
|
+
COLUMNS = %i(carrier_name iccid camera_finish_hour camera_start_hour imei
|
4
|
+
camera_interval udid battery upload_start_hour beacon_minor scfg
|
5
|
+
status avatar_type auto_post_interval beacon_major coordinates
|
6
|
+
tzoffset camera_quality imsi tel serial_number farm_id farm_manager_user_id)
|
7
|
+
attr_accessor *COLUMNS
|
8
|
+
|
9
|
+
@@belongs_to = [Farm]
|
10
|
+
@@related_to = [FarmManagerUser]
|
11
|
+
|
12
|
+
def initialize(
|
13
|
+
id: nil,
|
14
|
+
name: nil,
|
15
|
+
carrier_name: nil,
|
16
|
+
iccid: nil,
|
17
|
+
camera_finish_hour: nil,
|
18
|
+
camera_start_hour: nil,
|
19
|
+
imei: nil,
|
20
|
+
camera_interval: nil,
|
21
|
+
udid: nil,
|
22
|
+
battery: nil,
|
23
|
+
upload_start_hour: nil,
|
24
|
+
beacon_minor: nil,
|
25
|
+
scfg: nil,
|
26
|
+
status: nil,
|
27
|
+
avatar_type: nil,
|
28
|
+
auto_post_interval: nil,
|
29
|
+
beacon_major: nil,
|
30
|
+
coordinates: nil,
|
31
|
+
tzoffset: nil,
|
32
|
+
camera_quality: nil,
|
33
|
+
imsi: nil,
|
34
|
+
tel: nil,
|
35
|
+
serial_number: nil,
|
36
|
+
farm_id: nil,
|
37
|
+
updated_at: nil,
|
38
|
+
created_at: nil
|
39
|
+
)
|
40
|
+
@carrier_name = carrier_name
|
41
|
+
@iccid = iccid
|
42
|
+
@camera_finish_hour = camera_finish_hour
|
43
|
+
@camera_start_hour = camera_start_hour
|
44
|
+
@imei = imei
|
45
|
+
@camera_interval = camera_interval
|
46
|
+
@udid = udid
|
47
|
+
@battery = battery
|
48
|
+
@upload_start_hour = upload_start_hour
|
49
|
+
@beacon_minor = beacon_minor
|
50
|
+
@scfg = scfg
|
51
|
+
@status = status
|
52
|
+
@avatar_type = avatar_type
|
53
|
+
@auto_post_interval = auto_post_interval
|
54
|
+
@beacon_major = beacon_major
|
55
|
+
@coordinates = coordinates
|
56
|
+
@tzoffset = tzoffset
|
57
|
+
@camera_quality = camera_quality
|
58
|
+
@imsi = imsi
|
59
|
+
@tel = tel
|
60
|
+
@serial_number = serial_number
|
61
|
+
@farm_id = farm_id
|
62
|
+
super(id, name, updated_at, created_at)
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.where(hash, limit: DEFUALT_LIMIT)
|
66
|
+
to_objects(super(self, validate_params(hash), limit, @@belongs_to, @@related_to)) if valid_key?(hash)
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.short_name
|
70
|
+
'device'
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.reference_name
|
74
|
+
'devices'
|
75
|
+
end
|
76
|
+
|
77
|
+
def farm
|
78
|
+
Farm.find(farm_id: farm_id)
|
79
|
+
end
|
80
|
+
|
81
|
+
def save
|
82
|
+
params = COLUMNS.push(:name).each_with_object({}) do |column, params|
|
83
|
+
params[column] = self.send(column) unless self.send(column).nil?
|
84
|
+
end
|
85
|
+
id ? false : super(self, params, @@belongs_to)
|
86
|
+
end
|
87
|
+
|
88
|
+
def update(params)
|
89
|
+
original_params = build_original_params(params)
|
90
|
+
if super(self, KakaxiDevice.validate_params(params), @@belongs_to)
|
91
|
+
original_params.each { |key, value| self.send("#{key}=", value) }
|
92
|
+
true
|
93
|
+
else
|
94
|
+
false
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
def self.hour_to_time(params)
|
100
|
+
%i(camera_finish_hour camera_start_hour upload_start_hour).each { |hour| BaseModel.replace_key(params, hour, hour.to_s.gsub(/hour/, 'time').to_sym) }
|
101
|
+
params
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.validate_params(params)
|
105
|
+
params = hour_to_time(params)
|
106
|
+
if params.has_key? :coordinates
|
107
|
+
params = replace_key(params, :coordinates, :coordinate)
|
108
|
+
params[:coordinate] = params[:coordinate].to_hash
|
109
|
+
end
|
110
|
+
params
|
111
|
+
end
|
112
|
+
|
113
|
+
def self.valid_key?(hash)
|
114
|
+
hash.keys.all? { |key| COLUMNS.push(*%i(id name updated_at created_at)).include? key }
|
115
|
+
end
|
116
|
+
|
117
|
+
def self.to_objects(devices)
|
118
|
+
devices.map do |device|
|
119
|
+
new(
|
120
|
+
id: device['objectId'],
|
121
|
+
name: device['name'],
|
122
|
+
updated_at: device['updatedAt'],
|
123
|
+
created_at: device['createdAt'],
|
124
|
+
farm_id: device['farm'] && device['farm']['objectId'],
|
125
|
+
carrier_name: device['carrierName'],
|
126
|
+
iccid: device['ICCID'],
|
127
|
+
camera_finish_hour: device['cameraFinishTime'],
|
128
|
+
camera_start_hour: device['cameraStartTime'],
|
129
|
+
imei: device['IMEI'],
|
130
|
+
camera_interval: device['cameraInterval'],
|
131
|
+
udid: device['udid'],
|
132
|
+
battery: device['battery'],
|
133
|
+
upload_start_hour: device['uploadStartTime'],
|
134
|
+
beacon_minor: device['beaconMinor'],
|
135
|
+
scfg: device['scfg'],
|
136
|
+
status: device['status'],
|
137
|
+
avatar_type: device['avatarType'],
|
138
|
+
auto_post_interval: device['autoPostInterval'],
|
139
|
+
beacon_major: device['beaconMajor'],
|
140
|
+
coordinates: device['coordinate'] && Datatype::GeoPoint.new(device['coordinate']['latitude'], device['coordinate']['longitude']),
|
141
|
+
tzoffset: device['tzoffset'],
|
142
|
+
camera_quality: device['cameraQuality'],
|
143
|
+
imsi: device['IMSI'],
|
144
|
+
tel: device['tel'],
|
145
|
+
serial_number: device['serialNumber'] || device['serialnumber'],
|
146
|
+
)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'kakaxi_parse/base_model'
|
2
|
+
require 'kakaxi_parse/role'
|
3
|
+
require 'kakaxi_parse/user'
|
4
|
+
require 'kakaxi_parse/farm'
|
5
|
+
require 'kakaxi_parse/farm_manager_user'
|
6
|
+
require 'kakaxi_parse/kakaxi_device'
|
7
|
+
require 'kakaxi_parse/interval_photo'
|
8
|
+
require 'kakaxi_parse/timelapse'
|
9
|
+
require 'kakaxi_parse/climate'
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module KakaxiParse
|
2
|
+
class Role < BaseModel
|
3
|
+
def initialize(
|
4
|
+
id: nil,
|
5
|
+
name: nil,
|
6
|
+
updated_at: nil,
|
7
|
+
created_at: nil
|
8
|
+
)
|
9
|
+
super(id, name, updated_at, created_at)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.where(hash, limit: DEFUALT_LIMIT)
|
13
|
+
to_objects(super(self, hash, limit)) if valid_key?(hash)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.name
|
17
|
+
'_Role'
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.short_name
|
21
|
+
'role'
|
22
|
+
end
|
23
|
+
|
24
|
+
def add_user(id)
|
25
|
+
params = Datatype::AddRelation.new(User, [id]).to_hash
|
26
|
+
result = API.new("classes/#{self.class.demodulize}/#{ self.id }", params: params).put
|
27
|
+
if result.has_key? 'updatedAt'
|
28
|
+
self.updated_at = DateTime.strptime(result['updatedAt'], '%Y-%m-%dT%H:%M:%S.%LZ')
|
29
|
+
true
|
30
|
+
else
|
31
|
+
false
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def self.valid_key?(hash)
|
37
|
+
hash.keys.all? { |key| %i(id name farmer_id updated_at created_at).include? key }
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.to_objects(roles)
|
41
|
+
roles.map do |role|
|
42
|
+
new(
|
43
|
+
id: role['objectId'],
|
44
|
+
name: role['name'],
|
45
|
+
updated_at: role['updatedAt'],
|
46
|
+
created_at: role['createdAt']
|
47
|
+
)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module KakaxiParse
|
2
|
+
class Timelapse < BaseModel
|
3
|
+
COLUMNS = [:start_datetime, :end_datetime, :thumbnail_url, :url, :device_id]
|
4
|
+
attr_accessor *COLUMNS
|
5
|
+
|
6
|
+
@@belongs_to = [KakaxiDevice]
|
7
|
+
|
8
|
+
def initialize(
|
9
|
+
id: nil,
|
10
|
+
name: nil,
|
11
|
+
created_at: nil,
|
12
|
+
updated_at: nil,
|
13
|
+
start_datetime: nil,
|
14
|
+
end_datetime: nil,
|
15
|
+
thumbnail_url: nil,
|
16
|
+
url: nil,
|
17
|
+
device_id: nil
|
18
|
+
)
|
19
|
+
|
20
|
+
@start_datetime = DateTime.iso8601(start_datetime)
|
21
|
+
@end_datetime = DateTime.iso8601(end_datetime)
|
22
|
+
@thumbnail_url = thumbnail_url
|
23
|
+
@url = url
|
24
|
+
@device_id = device_id
|
25
|
+
|
26
|
+
super(id, name, updated_at, created_at)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.where(hash, limit: DEFUALT_LIMIT)
|
30
|
+
to_objects(super(self, hash, limit, @@belongs_to)) if valid_key?(hash)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.short_name
|
34
|
+
'timelapse'
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def self.valid_key?(hash)
|
39
|
+
hash.keys.all? { |key| COLUMNS.push(*%i(id name updated_at created_at)).include? key }
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.to_objects(timelapses)
|
43
|
+
timelapses.map do |timelapse|
|
44
|
+
new(
|
45
|
+
id: timelapse['objectId'],
|
46
|
+
url: timelapse['videoURL'],
|
47
|
+
thumbnail_url: timelapse['thumbnail'] && timelapse['thumbnail']['url'],
|
48
|
+
device_id: timelapse['device'] && timelapse['device']['objectId'],
|
49
|
+
start_datetime: timelapse['beginningTime'] && timelapse['beginningTime']['iso'],
|
50
|
+
end_datetime: timelapse['endTime'] && timelapse['endTime']['iso'],
|
51
|
+
updated_at: timelapse['updatedAt'],
|
52
|
+
created_at: timelapse['createdAt']
|
53
|
+
)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module KakaxiParse
|
2
|
+
class User < BaseModel
|
3
|
+
attr_accessor :email, :password
|
4
|
+
@@related_to = [Role]
|
5
|
+
|
6
|
+
def initialize(
|
7
|
+
id: nil,
|
8
|
+
name: nil,
|
9
|
+
email: nil,
|
10
|
+
password: nil,
|
11
|
+
updated_at: nil,
|
12
|
+
created_at: nil
|
13
|
+
)
|
14
|
+
@email = email
|
15
|
+
@password = password
|
16
|
+
super(id, name, updated_at, created_at)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.where(hash, limit: DEFUALT_LIMIT)
|
20
|
+
to_objects(super(self, name_to_nickname(hash), limit, [], @@related_to)) if valid_key?(hash)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.name
|
24
|
+
'_User'
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.short_name
|
28
|
+
'farmer'
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.reference_name
|
32
|
+
'users'
|
33
|
+
end
|
34
|
+
|
35
|
+
def sign_in
|
36
|
+
API.new('login', params: {username: email, password: password}).get
|
37
|
+
end
|
38
|
+
|
39
|
+
def save
|
40
|
+
id ? false : super(self, { nickname: name, email: email, password: password, username: email })
|
41
|
+
end
|
42
|
+
|
43
|
+
def update(params)
|
44
|
+
original_params = build_original_params(params)
|
45
|
+
if super(self, User.name_to_nickname(params))
|
46
|
+
original_params.each { |key, value| self.send("#{key}=", value) }
|
47
|
+
true
|
48
|
+
else
|
49
|
+
false
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def farms
|
54
|
+
Farm.where(farmer_id: id)
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
def self.name_to_nickname(params)
|
59
|
+
replace_key(params, :name, :nickname)
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.valid_key?(hash)
|
63
|
+
hash.keys.all? { |key| %i(id name email password updated_at created_at role_id).include? key }
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.to_objects(users)
|
67
|
+
users.map do |user|
|
68
|
+
new(
|
69
|
+
id: user['objectId'],
|
70
|
+
name: user['nickname'],
|
71
|
+
email: user['email'],
|
72
|
+
updated_at: user['updatedAt'],
|
73
|
+
created_at: user['createdAt']
|
74
|
+
)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kakaxi_parse
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Naggi Goishi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-02-24 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Make it easy to controll Parse in ruby
|
14
|
+
email: naggi@kakaxi.jp
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- Gemfile
|
20
|
+
- Gemfile.lock
|
21
|
+
- kakaxi_parse.gemspec
|
22
|
+
- lib/kakaxi_parse.rb
|
23
|
+
- lib/kakaxi_parse/api.rb
|
24
|
+
- lib/kakaxi_parse/base_model.rb
|
25
|
+
- lib/kakaxi_parse/climate.rb
|
26
|
+
- lib/kakaxi_parse/datatypes/add_relation.rb
|
27
|
+
- lib/kakaxi_parse/datatypes/base_datatype.rb
|
28
|
+
- lib/kakaxi_parse/datatypes/datatype.rb
|
29
|
+
- lib/kakaxi_parse/datatypes/datetime.rb
|
30
|
+
- lib/kakaxi_parse/datatypes/geopoint.rb
|
31
|
+
- lib/kakaxi_parse/datatypes/pointer.rb
|
32
|
+
- lib/kakaxi_parse/datatypes/remove_relation.rb
|
33
|
+
- lib/kakaxi_parse/datatypes/timelapse.rb
|
34
|
+
- lib/kakaxi_parse/farm.rb
|
35
|
+
- lib/kakaxi_parse/farm_manager_user.rb
|
36
|
+
- lib/kakaxi_parse/interval_photo.rb
|
37
|
+
- lib/kakaxi_parse/kakaxi_device.rb
|
38
|
+
- lib/kakaxi_parse/model.rb
|
39
|
+
- lib/kakaxi_parse/role.rb
|
40
|
+
- lib/kakaxi_parse/timelapse.rb
|
41
|
+
- lib/kakaxi_parse/user.rb
|
42
|
+
homepage: https://github.com/kakaxi-inc/kakaxi-parse-ruby.git
|
43
|
+
licenses:
|
44
|
+
- MIT
|
45
|
+
metadata: {}
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
requirements: []
|
61
|
+
rubyforge_project:
|
62
|
+
rubygems_version: 2.7.4
|
63
|
+
signing_key:
|
64
|
+
specification_version: 4
|
65
|
+
summary: Kakaxi Parse SDK
|
66
|
+
test_files: []
|