trophonius 1.2.4.10 → 1.2.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c79101c445307adbbb319a9cf07fed8e2b0fb3ae6d17a213833452ff9252f6cd
4
- data.tar.gz: 21e0bc3a18a443f3576699100c48cf4f1db6b9efe4a031d5c52a26c95a4cb464
3
+ metadata.gz: 2e0bf0bec18d8269bd620635ddc8a7c5d2f36536c1952918dfe50da452190048
4
+ data.tar.gz: e288914c11ef7049cd0213d500cca929e9f301acf6965e8a52349492e355346b
5
5
  SHA512:
6
- metadata.gz: cfef37d5c0ddca6ac545d76ed5b62df8b8f1514f247cdf6749ab0925ac33a0d889fe6f11ba9a75985164c81e7b8ffb91c24c13df79ba53e4475aa53f3e27ec37
7
- data.tar.gz: 6afb02d5bc0d8d8a33853ffc1eff5f1f7cceb4026a665e74f6ff01d3b7189a616e9cc127b8e9962ea8fa23abb381661d5c8dbb4602588668abf8168d2784be7d
6
+ metadata.gz: 77a682c6df981386dbf754341f9d0fd003753b64b36912b187954889e0858d4f43e821cfcc6b8c75b7ca40eccd5e5a9d3ec7072a15fe0821bf72a1305047a52a
7
+ data.tar.gz: 4540141348a566a973630f7ff395434bc724d0238e1f4eeed84c1006b25da78702e6add235d800055ae962d24af5c949f42b2e5cbd6c5544842b0eee1f6eed47
@@ -18,6 +18,8 @@ module Trophonius
18
18
  config_accessor(:non_modifiable_fields) { [] }
19
19
  config_accessor(:all_fields) { {} }
20
20
  config_accessor(:translations) { {} }
21
+ config_accessor(:has_many_relations) { {} }
22
+ config_accessor(:belongs_to_relations) { {} }
21
23
  config_accessor(:local_network) { false }
22
24
  config_accessor(:redis_connection) { false }
23
25
  end
@@ -19,6 +19,14 @@ module Trophonius
19
19
  class ConnectionError < StandardError; end # :nodoc:
20
20
  class EmptyFindError < StandardError; end # :nodoc:
21
21
  class ValidationError < StandardError; end # :nodoc:
22
+ class DateValueError < ValidationError; end # :nodoc:
23
+ class TimeValueError < ValidationError; end # :nodoc:
24
+ class NumberValueError < ValidationError; end # :nodoc:
25
+ class ValueOutOfRangeError < ValidationError; end # :nodoc:
26
+ class ValueNotUniqueError < ValidationError; end # :nodoc:
27
+ class ValueNotExistingError < ValidationError; end # :nodoc:
28
+ class ValueNotInValuelistError < ValidationError; end # :nodoc:
29
+ class ValueFailedCalculationError < ValidationError; end # :nodoc:
22
30
 
23
31
  ##
24
32
  # Throws an error corresponding to the error number
@@ -140,14 +148,21 @@ module Trophonius
140
148
  # when "417"
141
149
  # when "418"
142
150
  when '500'
143
- raise ValidationError.new, 'Data value does not meet validation entry options (hint make sure your date values are formatted as MM/DD/YYYY)'
144
- # when "501"
145
- # when "502"
146
- # when "503"
147
- # when "504"
148
- # when "505"
149
- # when "506"
150
- # when "507"
151
+ raise DateValueError.new, 'Date value does not meet validation entry options (hint make sure your date values are formatted as MM/DD/YYYY)'
152
+ when '501'
153
+ raise TimeValueError.new, 'Time value does not meet validation entry options'
154
+ when '502'
155
+ raise NumberValueError.new, 'Number value does not meet validation entry options'
156
+ when '503'
157
+ raise ValueOutOfRangeError.new, 'Value in field is not within the range specified in validation entry options'
158
+ when '504'
159
+ raise ValueNotUniqueError.new, 'Value in field is not unique, as required in validation entry options'
160
+ when '505'
161
+ raise ValueNotExistingError.new, 'Value in field is not an existing value in the file, as required in validation entry options'
162
+ when '506'
163
+ raise ValueNotInValuelistError.new, 'Value in field is not listed in the value list specified in validation entry options'
164
+ when '507'
165
+ raise ValueFailedCalculationError.new, 'Value in field failed calculation test of validation entry options'
151
166
  # when "508"
152
167
  # when "509"
153
168
  # when "510"
@@ -28,23 +28,20 @@ module Trophonius
28
28
  @configuration.non_modifiable_fields = configuration[:non_modifiable_fields]
29
29
  @configuration.all_fields = {}
30
30
  @configuration.translations = {}
31
+ @configuration.has_many_relations = {}
32
+ @configuration.belongs_to_relations = {}
31
33
  @offset = ''
32
34
  @limit = ''
33
35
  end
34
36
 
35
37
  ##
36
- # Sets up the configuration for the model.
38
+ # Add a belongs to relationship.
37
39
  #
38
- # @param [Hash] configuration: the hash containing the config to setup the model correctly.
39
- # configuration = {layout_name: "theFileMakerLayoutForThisModel", non_modifiable_fields: ["an", "array", "containing", "calculation_fields", "etc."]}
40
- def self.config(configuration)
41
- @configuration ||= Configuration.new
42
- @configuration.layout_name = configuration[:layout_name]
43
- @configuration.non_modifiable_fields = configuration[:non_modifiable_fields]
44
- @configuration.all_fields = {}
45
- @configuration.translations = {}
46
- @offset = ''
47
- @limit = ''
40
+ # @param [Symbol] model_name: the name of the model to build a relation with
41
+ # @param [String] primary_key: the name of the field containing the primary to build the relation over
42
+ # @param [String] foreign_key: the name of the field containing the primary to build the relation over
43
+ def self.belongs_to(model_name, primary_key:, foreign_key:)
44
+ @configuration.belongs_to_relations.merge!({ model_name => { primary_key: primary_key, foreign_key: foreign_key } })
48
45
  end
49
46
 
50
47
  ##
@@ -53,17 +50,8 @@ module Trophonius
53
50
  # @param [Symbol] model_name: the name of the model to build a relation with
54
51
  # @param [String] primary_key: the name of the field containing the primary to build the relation over
55
52
  # @param [String] foreign_key: the name of the field containing the primary to build the relation over
56
- #
57
- # @return [Trophonius::Model] Self
58
53
  def self.has_many(model_name, primary_key:, foreign_key:)
59
- @configuration ||= Configuration.new
60
- @configuration.layout_name = configuration[:layout_name]
61
- @configuration.non_modifiable_fields = configuration[:non_modifiable_fields]
62
- @configuration.all_fields = {}
63
- @configuration.translations = {}
64
- @offset = ''
65
- @limit = ''
66
- self
54
+ @configuration.has_many_relations.merge!({ model_name => { primary_key: primary_key, foreign_key: foreign_key } })
67
55
  end
68
56
 
69
57
  ##
@@ -87,6 +75,22 @@ module Trophonius
87
75
  @configuration.layout_name
88
76
  end
89
77
 
78
+ ##
79
+ # Returns the Hash containing the related parent models
80
+ #
81
+ # @return [Hash] child models
82
+ def self.has_many_relations
83
+ @configuration.has_many_relations
84
+ end
85
+
86
+ ##
87
+ # Returns the Hash containing the related parent models
88
+ #
89
+ # @return [Hash] parent models
90
+ def self.belongs_to_relations
91
+ @configuration.belongs_to_relations
92
+ end
93
+
90
94
  ##
91
95
  # Returns the fields that FileMaker won't allow us to modify
92
96
  #
@@ -330,6 +334,8 @@ module Trophonius
330
334
  hash = Trophonius::Record.new
331
335
  hash.record_id = result['recordId']
332
336
  hash.layout_name = layout_name
337
+ hash.model_name = name
338
+
333
339
  result['fieldData'].keys.each do |key|
334
340
  # unless key[/\s/] || key[/\W/]
335
341
  @configuration.translations.merge!(
@@ -8,7 +8,7 @@ module Trophonius
8
8
  #
9
9
  # A Record is contained in a RecordSet and has methods to retrieve data from the fields inside the Record-hash
10
10
  class Trophonius::Record < Hash
11
- attr_accessor :record_id, :layout_name, :modifiable_fields, :modified_fields
11
+ attr_accessor :record_id, :model_name, :layout_name, :modifiable_fields, :modified_fields
12
12
 
13
13
  ##
14
14
  # Initializes a new Record
@@ -22,20 +22,147 @@ module Trophonius
22
22
  super
23
23
  end
24
24
 
25
+ def method_missing(method, *args, &block)
26
+ if ActiveSupport::Inflector.pluralize(method).to_s == method.to_s
27
+ model = ActiveSupport::Inflector.constantize(ActiveSupport::Inflector.classify(ActiveSupport::Inflector.singularize(method)))
28
+ pk_model = ActiveSupport::Inflector.constantize(ActiveSupport::Inflector.classify(ActiveSupport::Inflector.singularize(model_name)))
29
+
30
+ if model.belongs_to_relations[ActiveSupport::Inflector.parameterize(model_name).to_sym]
31
+ relation = model.belongs_to_relations[ActiveSupport::Inflector.parameterize(model_name).to_sym]
32
+ layout = model.layout_name
33
+ model.create_translations if model.translations.keys.empty?
34
+
35
+ url =
36
+ URI(
37
+ "http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
38
+ Trophonius.config.database
39
+ }/layouts/#{layout}/_find"
40
+ )
41
+
42
+ if model.translations.key?(relation[:foreign_key])
43
+ foreign_key_field = model.translations[relation[:foreign_key]].to_s
44
+ else
45
+ foreign_key_field = relation[:foreign_key].to_s
46
+ end
47
+
48
+ if pk_model.translations.key?(relation[:primary_key])
49
+ primary_key_field = pk_model.translations[relation[:primary_key]].to_s
50
+ else
51
+ primary_key_field = relation[:primary_key].to_s
52
+ end
53
+
54
+ body = { query: [{ foreign_key_field => self[primary_key_field].to_s }], limit: 100_000 }.to_json
55
+ response = Request.make_request(url, "Bearer #{Request.get_token}", 'post', body)
56
+
57
+ if response['messages'][0]['code'] != '0'
58
+ if response['messages'][0]['code'] == '101' || response['messages'][0]['code'] == '401'
59
+ resp = RecordSet.new(layout, model.non_modifiable_fields)
60
+ return resp
61
+ else
62
+ if response['messages'][0]['code'] == '102'
63
+ results = Request.retrieve_first(layout)
64
+ if results['messages'][0]['code'] != '0'
65
+ Error.throw_error('102')
66
+ else
67
+ r_results = results['response']['data']
68
+ ret_val = r_results.empty? ? Error.throw_error('102') : r_results[0]['fieldData']
69
+ query_keys = [foreign_key_field]
70
+ Error.throw_error('102', (query_keys - ret_val.keys.map(&:downcase)).flatten.join(', '), layout)
71
+ end
72
+ end
73
+ Error.throw_error(response['messages'][0]['code'])
74
+ end
75
+ else
76
+ r_results = response['response']['data']
77
+ ret_val = RecordSet.new(layout, model.non_modifiable_fields)
78
+ r_results.each do |r|
79
+ hash = model.build_result(r)
80
+ ret_val << hash
81
+ end
82
+ @response = ret_val
83
+ return @response
84
+ end
85
+ end
86
+ elsif ActiveSupport::Inflector.constantize(ActiveSupport::Inflector.classify(ActiveSupport::Inflector.singularize(method))).respond_to?('first')
87
+ fk_model = ActiveSupport::Inflector.constantize(ActiveSupport::Inflector.classify(ActiveSupport::Inflector.singularize(model_name)))
88
+ pk_model = ActiveSupport::Inflector.constantize(ActiveSupport::Inflector.classify(ActiveSupport::Inflector.singularize(method)))
89
+
90
+ if pk_model.has_many_relations[ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.pluralize(model_name)).to_sym]
91
+ relation = pk_model.has_many_relations[ActiveSupport::Inflector.parameterize(ActiveSupport::Inflector.pluralize(model_name)).to_sym]
92
+ layout = pk_model.layout_name
93
+ pk_model.create_translations if pk_model.translations.keys.empty?
94
+
95
+ url =
96
+ URI(
97
+ "http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
98
+ Trophonius.config.database
99
+ }/layouts/#{layout}/_find"
100
+ )
101
+
102
+ if fk_model.translations.key?(relation[:foreign_key])
103
+ foreign_key_field = fk_model.translations[relation[:foreign_key]].to_s
104
+ else
105
+ foreign_key_field = relation[:foreign_key].to_s
106
+ end
107
+
108
+ if pk_model.translations.key?(relation[:primary_key])
109
+ primary_key_field = pk_model.translations[relation[:primary_key]].to_s
110
+ else
111
+ primary_key_field = relation[:primary_key].to_s
112
+ end
113
+
114
+ body = { query: [{ primary_key_field => self[foreign_key_field].to_s }], limit: 1 }.to_json
115
+
116
+ response = Request.make_request(url, "Bearer #{Request.get_token}", 'post', body)
117
+ if response['messages'][0]['code'] != '0'
118
+ if response['messages'][0]['code'] == '101' || response['messages'][0]['code'] == '401'
119
+ resp = RecordSet.new(layout, pk_model.non_modifiable_fields)
120
+ return resp
121
+ else
122
+ if response['messages'][0]['code'] == '102'
123
+ results = Request.retrieve_first(layout)
124
+ if results['messages'][0]['code'] != '0'
125
+ Error.throw_error('102')
126
+ else
127
+ r_results = results['response']['data']
128
+ ret_val = r_results.empty? ? Error.throw_error('102') : r_results[0]['fieldData']
129
+ query_keys = [primary_key_field]
130
+ Error.throw_error('102', (query_keys - ret_val.keys.map(&:downcase)).flatten.join(', '), layout)
131
+ end
132
+ end
133
+ Error.throw_error(response['messages'][0]['code'])
134
+ end
135
+ else
136
+ r_results = response['response']['data']
137
+ ret_val = RecordSet.new(layout, pk_model.non_modifiable_fields)
138
+ r_results.each do |r|
139
+ hash = pk_model.build_result(r)
140
+ ret_val << hash
141
+ end
142
+ @response = ret_val
143
+ return @response.first
144
+ end
145
+ end
146
+ else
147
+ super
148
+ end
149
+ end
150
+
25
151
  ##
26
152
  # Saves the last changes made to the Record to FileMaker.
27
153
  # Throws a FileMaker error if save failed
28
154
  #
29
155
  # @return [True] if successful
30
156
  def save
31
- url = URI("http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{Trophonius.config.database}/layouts/#{layout_name}/records/#{record_id}")
157
+ url =
158
+ URI(
159
+ "http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{Trophonius.config.database}/layouts/#{
160
+ layout_name
161
+ }/records/#{record_id}"
162
+ )
32
163
  body = "{\"fieldData\": #{modified_fields.to_json}}"
33
164
  response = Request.make_request(url, "Bearer #{Request.get_token}", 'patch', body)
34
- if response['messages'][0]['code'] != '0'
35
- Error.throw_error(response['messages'][0]['code'])
36
- else
37
- true
38
- end
165
+ response['messages'][0]['code'] != '0' ? Error.throw_error(response['messages'][0]['code']) : true
39
166
  end
40
167
 
41
168
  ##
@@ -44,13 +171,14 @@ module Trophonius
44
171
  #
45
172
  # @return [True] if successful
46
173
  def delete
47
- url = URI("http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{Trophonius.config.database}/layouts/#{layout_name}/records/#{record_id}")
174
+ url =
175
+ URI(
176
+ "http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{Trophonius.config.database}/layouts/#{
177
+ layout_name
178
+ }/records/#{record_id}"
179
+ )
48
180
  response = Request.make_request(url, "Bearer #{Request.get_token}", 'delete', '{}')
49
- if response['messages'][0]['code'] != '0'
50
- Error.throw_error(response['messages'][0]['code'])
51
- else
52
- true
53
- end
181
+ response['messages'][0]['code'] != '0' ? Error.throw_error(response['messages'][0]['code']) : true
54
182
  end
55
183
 
56
184
  ##
@@ -61,24 +189,27 @@ module Trophonius
61
189
  #
62
190
  # @return [True] if successful
63
191
  def update(fieldData)
64
- url = URI("http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{Trophonius.config.database}/layouts/#{layout_name}/records/#{record_id}")
65
- fieldData.keys.each do |field|
66
- modifiable_fields[field] = fieldData[field]
67
- end
192
+ url =
193
+ URI(
194
+ "http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{Trophonius.config.database}/layouts/#{
195
+ layout_name
196
+ }/records/#{record_id}"
197
+ )
198
+ fieldData.keys.each { |field| modifiable_fields[field] = fieldData[field] }
68
199
  body = "{\"fieldData\": #{fieldData.to_json}}"
69
200
  response = Request.make_request(url, "Bearer #{Request.get_token}", 'patch', body)
70
201
  if response['messages'][0]['code'] != '0'
71
- if response["messages"][0]["code"] == "102"
202
+ if response['messages'][0]['code'] == '102'
72
203
  results = Request.retrieve_first(layout_name)
73
- if results["messages"][0]["code"] != "0"
74
- Error.throw_error("102")
204
+ if results['messages'][0]['code'] != '0'
205
+ Error.throw_error('102')
75
206
  else
76
- r_results = results["response"]["data"]
77
- ret_val = r_results.empty? ? Error.throw_error("102") : r_results[0]['fieldData']
78
- Error.throw_error("102", (fieldData.keys.map(&:downcase) - ret_val.keys.map(&:downcase)).flatten.join(', '), layout_name)
207
+ r_results = results['response']['data']
208
+ ret_val = r_results.empty? ? Error.throw_error('102') : r_results[0]['fieldData']
209
+ Error.throw_error('102', (fieldData.keys.map(&:downcase) - ret_val.keys.map(&:downcase)).flatten.join(', '), layout_name)
79
210
  end
80
211
  end
81
- Error.throw_error(response["messages"][0]["code"])
212
+ Error.throw_error(response['messages'][0]['code'])
82
213
  else
83
214
  true
84
215
  end
@@ -94,14 +225,15 @@ module Trophonius
94
225
  #
95
226
  # @return [True] if successful
96
227
  def upload(container_name:, container_repetition: 1, file:)
97
- url = URI("http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{Trophonius.config.database}/layouts/#{layout_name}/records/#{record_id}/containers/#{container_name}/#{container_repetition}")
228
+ url =
229
+ URI(
230
+ "http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{Trophonius.config.database}/layouts/#{
231
+ layout_name
232
+ }/records/#{record_id}/containers/#{container_name}/#{container_repetition}"
233
+ )
98
234
 
99
235
  response = Request.upload_file_request(url, "Bearer #{Request.get_token}", file)
100
- if response['messages'][0]['code'] != '0'
101
- Error.throw_error(response['messages'][0]['code'])
102
- else
103
- true
104
- end
236
+ response['messages'][0]['code'] != '0' ? Error.throw_error(response['messages'][0]['code']) : true
105
237
  end
106
238
  end
107
239
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trophonius
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.4.10
4
+ version: 1.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kempen Automatisering
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: activesupport
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 6.x
47
+ version: 6.0.3.1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 6.x
54
+ version: 6.0.3.1
55
55
  description: An easy to use link between Ruby (on Rails) and FileMaker using the FileMaker
56
56
  Data-API.
57
57
  email: