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.
@@ -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
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,17 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ kakaxi_parse (0.1.2)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+
10
+ PLATFORMS
11
+ ruby
12
+
13
+ DEPENDENCIES
14
+ kakaxi_parse!
15
+
16
+ BUNDLED WITH
17
+ 1.15.4
@@ -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
@@ -0,0 +1,5 @@
1
+ require 'net/http'
2
+ require 'date'
3
+ require 'json'
4
+ require 'kakaxi_parse/datatypes/datatype'
5
+ require 'kakaxi_parse/model'
@@ -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
+ module KakaxiParse
2
+ module Datatype
3
+ class Base
4
+ end
5
+ end
6
+ 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,2 @@
1
+ class Timelapse
2
+ 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: []