kakaxi_parse 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []