fmrest 0.10.0 → 0.13.0

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.
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