fmrest 0.10.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +2 -0
  3. data/CHANGELOG.md +38 -0
  4. data/README.md +194 -763
  5. metadata +70 -97
  6. data/.gitignore +0 -26
  7. data/.rspec +0 -3
  8. data/.travis.yml +0 -5
  9. data/Gemfile +0 -3
  10. data/Rakefile +0 -6
  11. data/fmrest.gemspec +0 -38
  12. data/lib/fmrest.rb +0 -29
  13. data/lib/fmrest/errors.rb +0 -28
  14. data/lib/fmrest/spyke.rb +0 -21
  15. data/lib/fmrest/spyke/base.rb +0 -23
  16. data/lib/fmrest/spyke/container_field.rb +0 -59
  17. data/lib/fmrest/spyke/model.rb +0 -36
  18. data/lib/fmrest/spyke/model/associations.rb +0 -82
  19. data/lib/fmrest/spyke/model/attributes.rb +0 -171
  20. data/lib/fmrest/spyke/model/auth.rb +0 -35
  21. data/lib/fmrest/spyke/model/connection.rb +0 -74
  22. data/lib/fmrest/spyke/model/container_fields.rb +0 -25
  23. data/lib/fmrest/spyke/model/global_fields.rb +0 -40
  24. data/lib/fmrest/spyke/model/http.rb +0 -37
  25. data/lib/fmrest/spyke/model/orm.rb +0 -212
  26. data/lib/fmrest/spyke/model/serialization.rb +0 -91
  27. data/lib/fmrest/spyke/model/uri.rb +0 -30
  28. data/lib/fmrest/spyke/portal.rb +0 -55
  29. data/lib/fmrest/spyke/relation.rb +0 -359
  30. data/lib/fmrest/spyke/spyke_formatter.rb +0 -273
  31. data/lib/fmrest/spyke/validation_error.rb +0 -25
  32. data/lib/fmrest/string_date.rb +0 -220
  33. data/lib/fmrest/token_store.rb +0 -6
  34. data/lib/fmrest/token_store/active_record.rb +0 -74
  35. data/lib/fmrest/token_store/base.rb +0 -25
  36. data/lib/fmrest/token_store/memory.rb +0 -26
  37. data/lib/fmrest/token_store/moneta.rb +0 -41
  38. data/lib/fmrest/token_store/redis.rb +0 -45
  39. data/lib/fmrest/v1.rb +0 -21
  40. data/lib/fmrest/v1/connection.rb +0 -89
  41. data/lib/fmrest/v1/container_fields.rb +0 -114
  42. data/lib/fmrest/v1/dates.rb +0 -81
  43. data/lib/fmrest/v1/paths.rb +0 -47
  44. data/lib/fmrest/v1/raise_errors.rb +0 -57
  45. data/lib/fmrest/v1/token_session.rb +0 -142
  46. data/lib/fmrest/v1/token_store/active_record.rb +0 -13
  47. data/lib/fmrest/v1/token_store/memory.rb +0 -13
  48. data/lib/fmrest/v1/type_coercer.rb +0 -192
  49. data/lib/fmrest/v1/utils.rb +0 -95
  50. data/lib/fmrest/version.rb +0 -5
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- warn "FmRest::V1::TokenStore::ActiveRecord is deprecated, use FmRest::TokenStore::ActiveRecord instead"
4
-
5
- require "fmrest/token_store/active_record"
6
-
7
- module FmRest
8
- module V1
9
- module TokenStore
10
- ActiveRecord = ::FmRest::TokenStore::ActiveRecord
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- warn "FmRest::V1::TokenStore::Memory is deprecated, use FmRest::TokenStore::Memory instead"
4
-
5
- require "fmrest/token_store/memory"
6
-
7
- module FmRest
8
- module V1
9
- module TokenStore
10
- Memory = ::FmRest::TokenStore::Memory
11
- end
12
- end
13
- end
@@ -1,192 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "fmrest/string_date"
4
-
5
- module FmRest
6
- module V1
7
- class TypeCoercer < Faraday::Response::Middleware
8
- # We use this date to represent a FileMaker time for consistency with
9
- # ginjo-rfm
10
- JULIAN_ZERO_DAY = "-4712/1/1"
11
-
12
- COERCE_HYBRID = [:hybrid, "hybrid", true].freeze
13
- COERCE_FULL = [:full, "full"].freeze
14
-
15
- # @param app [#call]
16
- # @param options [Hash]
17
- def initialize(app, options = FmRest.default_connection_settings)
18
- super(app)
19
- @options = options
20
- end
21
-
22
- def on_complete(env)
23
- return unless enabled?
24
- return unless env.body.kind_of?(Hash)
25
-
26
- data = env.body.dig("response", "data") || env.body.dig(:response, :data)
27
-
28
- return unless data
29
-
30
- data.each do |record|
31
- field_data = record["fieldData"] || record[:fieldData]
32
- portal_data = record["portalData"] || record[:portalData]
33
-
34
- coerce_fields(field_data)
35
-
36
- portal_data.try(:each_value) do |portal_records|
37
- portal_records.each do |pr|
38
- coerce_fields(pr)
39
- end
40
- end
41
- end
42
- end
43
-
44
- private
45
-
46
- def coerce_fields(hash)
47
- hash.each do |k, v|
48
- next unless v.is_a?(String)
49
- next if k == "recordId" || k == :recordId || k == "modId" || k == :modId
50
-
51
- if quick_check_timestamp(v)
52
- begin
53
- hash[k] = coerce_timestamp(v)
54
- next
55
- rescue ArgumentError
56
- end
57
- end
58
-
59
- if quick_check_date(v)
60
- begin
61
- hash[k] = date_class.strptime(v, date_strptime_format)
62
- next
63
- rescue ArgumentError
64
- end
65
- end
66
-
67
- if quick_check_time(v)
68
- begin
69
- hash[k] = datetime_class.strptime("#{JULIAN_ZERO_DAY} #{v}", time_strptime_format)
70
- next
71
- rescue ArgumentError
72
- end
73
- end
74
- end
75
- end
76
-
77
- def coerce_timestamp(str)
78
- str_timestamp = DateTime.strptime(str, datetime_strptime_format)
79
-
80
- if local_timezone?
81
- # Change the DateTime to the local timezone, keeping the same
82
- # time and just modifying the timezone
83
- offset = FmRest::V1.local_offset_for_datetime(str_timestamp)
84
- str_timestamp = str_timestamp.new_offset(offset) - offset
85
- end
86
-
87
- if datetime_class == StringDateTime
88
- str_timestamp = StringDateTime.new(str, str_timestamp)
89
- end
90
-
91
- str_timestamp
92
- end
93
-
94
- def date_class
95
- @date_class ||=
96
- case coerce_dates
97
- when *COERCE_HYBRID
98
- StringDate
99
- when *COERCE_FULL
100
- Date
101
- end
102
- end
103
-
104
- def datetime_class
105
- @datetime_class ||=
106
- case coerce_dates
107
- when *COERCE_HYBRID
108
- StringDateTime
109
- when *COERCE_FULL
110
- DateTime
111
- end
112
- end
113
-
114
- def date_fm_format
115
- @options[:date_format] || DEFAULT_DATE_FORMAT
116
- end
117
-
118
- def timestamp_fm_format
119
- @options[:timestamp_format] || DEFAULT_TIMESTAMP_FORMAT
120
- end
121
-
122
- def time_fm_format
123
- @options[:time_format] || DEFAULT_TIME_FORMAT
124
- end
125
-
126
- def date_strptime_format
127
- FmRest::V1.fm_date_to_strptime_format(date_fm_format)
128
- end
129
-
130
- def datetime_strptime_format
131
- FmRest::V1.fm_date_to_strptime_format(timestamp_fm_format)
132
- end
133
-
134
- def time_strptime_format
135
- @time_strptime_format ||=
136
- "%Y/%m/%d " + FmRest::V1.fm_date_to_strptime_format(time_fm_format)
137
- end
138
-
139
- # We use a string length test, followed by regexp match test to try to
140
- # identify date fields. Benchmarking shows this should be between 1 and 3
141
- # orders of magnitude faster for fails (i.e. non-dates) than just using
142
- # Date.strptime.
143
- #
144
- # user system total real
145
- # strptime: 0.268496 0.000962 0.269458 ( 0.270865)
146
- # re=~: 0.024872 0.000070 0.024942 ( 0.025057)
147
- # re.match?: 0.019745 0.000095 0.019840 ( 0.020058)
148
- # strptime fail: 0.141309 0.000354 0.141663 ( 0.142266)
149
- # re=~ fail: 0.031637 0.000095 0.031732 ( 0.031872)
150
- # re.match? fail: 0.011249 0.000056 0.011305 ( 0.011375)
151
- # length fail: 0.007177 0.000024 0.007201 ( 0.007222)
152
- #
153
- # NOTE: The faster Regexp#match? was introduced in Ruby 2.4.0, so we
154
- # can't really rely on it being available
155
- if //.respond_to?(:match?)
156
- def quick_check_timestamp(v)
157
- v.length == timestamp_fm_format.length && FmRest::V1::fm_date_to_regexp(timestamp_fm_format).match?(v)
158
- end
159
-
160
- def quick_check_date(v)
161
- v.length == date_fm_format.length && FmRest::V1::fm_date_to_regexp(date_fm_format).match?(v)
162
- end
163
-
164
- def quick_check_time(v)
165
- v.length == time_fm_format.length && FmRest::V1::fm_date_to_regexp(time_fm_format).match?(v)
166
- end
167
- else
168
- def quick_check_timestamp(v)
169
- v.length == timestamp_fm_format.length && FmRest::V1::fm_date_to_regexp(timestamp_fm_format) =~ v
170
- end
171
-
172
- def quick_check_date(v)
173
- v.length == date_fm_format.length && FmRest::V1::fm_date_to_regexp(date_fm_format) =~ v
174
- end
175
-
176
- def quick_check_time(v)
177
- v.length == time_fm_format.length && FmRest::V1::fm_date_to_regexp(time_fm_format) =~ v
178
- end
179
- end
180
-
181
- def local_timezone?
182
- @local_timezone ||= @options.fetch(:timezone, nil).try(:to_sym) == :local
183
- end
184
-
185
- def coerce_dates
186
- @options.fetch(:coerce_dates, false)
187
- end
188
-
189
- alias_method :enabled?, :coerce_dates
190
- end
191
- end
192
- end
@@ -1,95 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module FmRest
4
- module V1
5
- module Utils
6
- VALID_SCRIPT_KEYS = [:prerequest, :presort, :after].freeze
7
-
8
- # Converts custom script options to a hash with the Data API's expected
9
- # JSON script format.
10
- #
11
- # If script_options is a string or symbol it will be passed as the name
12
- # of the script to execute (after the action, e.g. save).
13
- #
14
- # If script_options is an array the first element will be the name of the
15
- # script to execute (after the action) and the second element (if any)
16
- # will be its param value.
17
- #
18
- # If script_options is a hash it will expect to contain one or more of
19
- # the following keys: :prerequest, :presort, :after
20
- #
21
- # Any of those keys should contain either a string/symbol or array, which
22
- # will be treated as described above, except for their own script
23
- # execution order (prerequest, presort or after action).
24
- #
25
- # Examples:
26
- #
27
- # convert_script_params("My Script")
28
- # # => { "script": "My Script" }
29
- #
30
- # convert_script_params(["My Script", "the param"])
31
- # # => { "script": "My Script", "script.param": "the param" }
32
- #
33
- # convert_script_params(after: "After Script", prerequest: "Prerequest Script")
34
- # # => { "script": "After Script", "script.prerequest": "Prerequest Script" }
35
- #
36
- # convert_script_params(presort: ["Presort Script", "foo"], prerequest: "Prerequest Script")
37
- # # => {
38
- # # "script.presort": "After Script",
39
- # # "script.presort.param": "foo",
40
- # # "script.prerequest": "Prerequest Script"
41
- # # }
42
- #
43
- def convert_script_params(script_options)
44
- params = {}
45
-
46
- case script_options
47
- when String, Symbol
48
- params[:script] = script_options.to_s
49
-
50
- when Array
51
- params.merge!(convert_script_arguments(script_options))
52
-
53
- when Hash
54
- script_options.each_key do |key|
55
- next if VALID_SCRIPT_KEYS.include?(key)
56
- raise ArgumentError, "Invalid script option #{key.inspect}"
57
- end
58
-
59
- if script_options.has_key?(:prerequest)
60
- params.merge!(convert_script_arguments(script_options[:prerequest], :prerequest))
61
- end
62
-
63
- if script_options.has_key?(:presort)
64
- params.merge!(convert_script_arguments(script_options[:presort], :presort))
65
- end
66
-
67
- if script_options.has_key?(:after)
68
- params.merge!(convert_script_arguments(script_options[:after]))
69
- end
70
- end
71
-
72
- params
73
- end
74
-
75
-
76
- private
77
-
78
- def convert_script_arguments(script_arguments, suffix = nil)
79
- base = suffix ? "script.#{suffix}".to_sym : :script
80
-
81
- {}.tap do |params|
82
- case script_arguments
83
- when String, Symbol
84
- params[base] = script_arguments.to_s
85
- when Array
86
- params[base] = script_arguments.first.to_s
87
- params["#{base}.param".to_sym] = script_arguments[1] if script_arguments[1]
88
- else
89
- raise ArgumentError, "Script arguments are expected as a String, Symbol or Array"
90
- end
91
- end
92
- end
93
- end
94
- end
95
- end
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module FmRest
4
- VERSION = "0.10.0"
5
- end