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.
- checksums.yaml +4 -4
- data/.yardopts +2 -0
- data/CHANGELOG.md +38 -0
- data/README.md +194 -763
- metadata +70 -97
- data/.gitignore +0 -26
- data/.rspec +0 -3
- data/.travis.yml +0 -5
- data/Gemfile +0 -3
- data/Rakefile +0 -6
- data/fmrest.gemspec +0 -38
- data/lib/fmrest.rb +0 -29
- data/lib/fmrest/errors.rb +0 -28
- data/lib/fmrest/spyke.rb +0 -21
- data/lib/fmrest/spyke/base.rb +0 -23
- data/lib/fmrest/spyke/container_field.rb +0 -59
- data/lib/fmrest/spyke/model.rb +0 -36
- data/lib/fmrest/spyke/model/associations.rb +0 -82
- data/lib/fmrest/spyke/model/attributes.rb +0 -171
- data/lib/fmrest/spyke/model/auth.rb +0 -35
- data/lib/fmrest/spyke/model/connection.rb +0 -74
- data/lib/fmrest/spyke/model/container_fields.rb +0 -25
- data/lib/fmrest/spyke/model/global_fields.rb +0 -40
- data/lib/fmrest/spyke/model/http.rb +0 -37
- data/lib/fmrest/spyke/model/orm.rb +0 -212
- data/lib/fmrest/spyke/model/serialization.rb +0 -91
- data/lib/fmrest/spyke/model/uri.rb +0 -30
- data/lib/fmrest/spyke/portal.rb +0 -55
- data/lib/fmrest/spyke/relation.rb +0 -359
- data/lib/fmrest/spyke/spyke_formatter.rb +0 -273
- data/lib/fmrest/spyke/validation_error.rb +0 -25
- data/lib/fmrest/string_date.rb +0 -220
- data/lib/fmrest/token_store.rb +0 -6
- data/lib/fmrest/token_store/active_record.rb +0 -74
- data/lib/fmrest/token_store/base.rb +0 -25
- data/lib/fmrest/token_store/memory.rb +0 -26
- data/lib/fmrest/token_store/moneta.rb +0 -41
- data/lib/fmrest/token_store/redis.rb +0 -45
- data/lib/fmrest/v1.rb +0 -21
- data/lib/fmrest/v1/connection.rb +0 -89
- data/lib/fmrest/v1/container_fields.rb +0 -114
- data/lib/fmrest/v1/dates.rb +0 -81
- data/lib/fmrest/v1/paths.rb +0 -47
- data/lib/fmrest/v1/raise_errors.rb +0 -57
- data/lib/fmrest/v1/token_session.rb +0 -142
- data/lib/fmrest/v1/token_store/active_record.rb +0 -13
- data/lib/fmrest/v1/token_store/memory.rb +0 -13
- data/lib/fmrest/v1/type_coercer.rb +0 -192
- data/lib/fmrest/v1/utils.rb +0 -95
- 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
|
data/lib/fmrest/v1/utils.rb
DELETED
@@ -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
|