fmrest 0.10.0 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|