filemaker 0.0.17 → 0.0.18
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/.rubocop.yml +18 -0
- data/.travis.yml +1 -0
- data/LICENSE.txt +17 -18
- data/README.md +5 -1
- data/filemaker.gemspec +4 -4
- data/lib/filemaker/api/query_commands/findquery.rb +2 -1
- data/lib/filemaker/configuration.rb +5 -1
- data/lib/filemaker/metadata/field.rb +5 -1
- data/lib/filemaker/model/field.rb +1 -1
- data/lib/filemaker/model/persistable.rb +1 -1
- data/lib/filemaker/model/relations/belongs_to.rb +2 -2
- data/lib/filemaker/model/relations/has_many.rb +3 -3
- data/lib/filemaker/model/relations/proxy.rb +5 -1
- data/lib/filemaker/model/selectable.rb +26 -14
- data/lib/filemaker/railtie.rb +3 -3
- data/lib/filemaker/record.rb +5 -1
- data/lib/filemaker/resultset.rb +1 -1
- data/lib/filemaker/server.rb +7 -5
- data/lib/filemaker/version.rb +1 -1
- data/spec/filemaker/metadata/field_spec.rb +12 -0
- data/spec/support/models.rb +4 -1
- metadata +13 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ee29da2611c5857916b7f97e6785080495caafb
|
4
|
+
data.tar.gz: 85142a5af79b15ca89df2c2df05c272ece4c1b96
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bdf8376dfd66c133f426264a67e5c2aaf0277d90561436f9a3944bcb91100c4a55dcb65457181b8a88d349369348b970e46d5fe086bec2753eb64539292213ef
|
7
|
+
data.tar.gz: 378d3ba7d1f34637dce2913fb5961c89c8717e28923df5089668e6e56ae8b44b788b5007d4248cce4540a65de71b81517bc56582573f4d87545f76cd1be8fb32
|
data/.rubocop.yml
CHANGED
@@ -22,3 +22,21 @@ SpecialGlobalVars:
|
|
22
22
|
|
23
23
|
PredicateName:
|
24
24
|
Enabled: false
|
25
|
+
|
26
|
+
Metrics/AbcSize:
|
27
|
+
Max: 50
|
28
|
+
|
29
|
+
Metrics/ClassLength:
|
30
|
+
Max: 200
|
31
|
+
|
32
|
+
Metrics/BlockLength:
|
33
|
+
Max: 100
|
34
|
+
|
35
|
+
Metrics/CyclomaticComplexity:
|
36
|
+
Enabled: false
|
37
|
+
|
38
|
+
Metrics/PerceivedComplexity:
|
39
|
+
Enabled: false
|
40
|
+
|
41
|
+
Style/DoubleNegation:
|
42
|
+
Enabled: false
|
data/.travis.yml
CHANGED
data/LICENSE.txt
CHANGED
@@ -1,22 +1,21 @@
|
|
1
|
-
|
1
|
+
The MIT License (MIT)
|
2
2
|
|
3
|
-
|
3
|
+
Copyright (c) 2017 mech
|
4
4
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
the following conditions:
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
12
11
|
|
13
|
-
The above copyright notice and this permission notice shall be
|
14
|
-
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
15
14
|
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
OF
|
22
|
-
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
CHANGED
@@ -197,8 +197,8 @@ Note: It is vitally important that you get the order right for mixing in the use
|
|
197
197
|
- [x] Please test the comparison operators with keyword as well as applied to value.
|
198
198
|
- [x] Test serialization of BigDecimal and other types.
|
199
199
|
- [x] Caching of relation models.
|
200
|
+
- [x] Dirty checking API for model.
|
200
201
|
- [ ] Test the order for `in` and `not_in` found set accuracy.
|
201
|
-
- [ ] Dirty checking API for model.
|
202
202
|
|
203
203
|
## Pagination
|
204
204
|
|
@@ -222,6 +222,10 @@ end
|
|
222
222
|
Job.per_page # => 50
|
223
223
|
```
|
224
224
|
|
225
|
+
## Overview
|
226
|
+
|
227
|
+
`Model` include `Findable` which create `Criteria` and `execute()` to return `Resultset` to be built by `Builder`.
|
228
|
+
|
225
229
|
## Credits
|
226
230
|
|
227
231
|
This project is heavily inspired by the following Filemaker Ruby effort and several other ORM gems.
|
data/filemaker.gemspec
CHANGED
@@ -20,13 +20,13 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_runtime_dependency 'faraday'
|
22
22
|
spec.add_runtime_dependency 'typhoeus'
|
23
|
-
spec.add_runtime_dependency 'nokogiri'
|
23
|
+
spec.add_runtime_dependency 'nokogiri', '~> 1.7'
|
24
24
|
spec.add_runtime_dependency 'activemodel'
|
25
25
|
spec.add_runtime_dependency 'globalid'
|
26
26
|
|
27
|
-
spec.add_development_dependency 'bundler', '~> 1.
|
28
|
-
spec.add_development_dependency 'rake', '~>
|
29
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
27
|
+
spec.add_development_dependency 'bundler', '~> 1.13'
|
28
|
+
spec.add_development_dependency 'rake', '~> 12.0'
|
29
|
+
spec.add_development_dependency 'rspec', '~> 3.5'
|
30
30
|
spec.add_development_dependency 'rubocop'
|
31
31
|
spec.add_development_dependency 'pry-byebug'
|
32
32
|
end
|
@@ -80,7 +80,8 @@ module Filemaker
|
|
80
80
|
omit = q_tag_array.delete('-omit')
|
81
81
|
len = q_tag_array.length
|
82
82
|
result = q_tag_array.flatten.combination(len).select do |c|
|
83
|
-
q_tag_array.all? { |a| (a & c).size > 0 }
|
83
|
+
# q_tag_array.all? { |a| (a & c).size > 0 }
|
84
|
+
q_tag_array.all? { |a| !(a & c).empty? }
|
84
85
|
end
|
85
86
|
result = result.each { |c| c.unshift('-omit') if omit }
|
86
87
|
@key_maps.concat result
|
@@ -21,8 +21,12 @@ module Filemaker
|
|
21
21
|
ssl.is_a?(Hash) ? { ssl: ssl } : {}
|
22
22
|
end
|
23
23
|
|
24
|
+
def is_ssl?
|
25
|
+
ssl.is_a?(Hash) || ssl == true
|
26
|
+
end
|
27
|
+
|
24
28
|
def url
|
25
|
-
|
29
|
+
is_ssl? ? "https://#{host}" : "http://#{host}"
|
26
30
|
end
|
27
31
|
end
|
28
32
|
end
|
@@ -33,13 +33,17 @@ module Filemaker
|
|
33
33
|
@resultset = resultset
|
34
34
|
end
|
35
35
|
|
36
|
+
def remove_decimal_mark(value)
|
37
|
+
value.delete('$,')
|
38
|
+
end
|
39
|
+
|
36
40
|
def coerce(value)
|
37
41
|
value = value.to_s.strip
|
38
42
|
return nil if value.empty?
|
39
43
|
|
40
44
|
case data_type
|
41
45
|
when 'number'
|
42
|
-
BigDecimal.new(value)
|
46
|
+
BigDecimal.new(remove_decimal_mark(value))
|
43
47
|
when 'date'
|
44
48
|
# date_format likely will be '%m/%d/%Y', but if we got '19/8/2014',
|
45
49
|
# then `strptime` will raise invalid date error
|
@@ -25,8 +25,8 @@ module Filemaker
|
|
25
25
|
# all must be findable using `to find_field_by_name`
|
26
26
|
def final_reference_key
|
27
27
|
target_class.find_field_by_name(source_key).try(:name) ||
|
28
|
-
|
29
|
-
|
28
|
+
target_class.find_field_by_name(reference_key).try(:name) ||
|
29
|
+
target_class.identity.try(:name)
|
30
30
|
end
|
31
31
|
|
32
32
|
protected
|
@@ -25,8 +25,8 @@ module Filemaker
|
|
25
25
|
|
26
26
|
def final_reference_key
|
27
27
|
target_class.find_field_by_name(source_key).try(:name) ||
|
28
|
-
|
29
|
-
|
28
|
+
target_class.find_field_by_name(reference_key).try(:name) ||
|
29
|
+
target_class.identity.try(:name)
|
30
30
|
end
|
31
31
|
|
32
32
|
# Append a model or array of models to the relation. Will set the owner
|
@@ -47,7 +47,7 @@ module Filemaker
|
|
47
47
|
end
|
48
48
|
self
|
49
49
|
end
|
50
|
-
|
50
|
+
alias push <<
|
51
51
|
|
52
52
|
# def concat(docs)
|
53
53
|
# # TODO: Find out how to do batch insert in FileMaker
|
@@ -27,7 +27,11 @@ module Filemaker
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def method_missing(name, *args, &block)
|
30
|
-
target.send(name, *args, &block)
|
30
|
+
target.send(name, *args, &block) || super
|
31
|
+
end
|
32
|
+
|
33
|
+
def respond_to_missing?(method_name, include_private = false)
|
34
|
+
super
|
31
35
|
end
|
32
36
|
end
|
33
37
|
end
|
@@ -7,8 +7,11 @@ module Filemaker
|
|
7
7
|
#
|
8
8
|
# @return [Filemaker::Model::Criteria]
|
9
9
|
def where(criterion)
|
10
|
-
|
11
|
-
|
10
|
+
if chains.include?(:in)
|
11
|
+
raise Filemaker::Errors::MixedClauseError,
|
12
|
+
"Can't mix 'where' with 'in'."
|
13
|
+
end
|
14
|
+
|
12
15
|
chains.push(:where)
|
13
16
|
chains.delete(:in)
|
14
17
|
|
@@ -55,8 +58,11 @@ module Filemaker
|
|
55
58
|
|
56
59
|
%w(eq cn bw ew gt gte lt lte neq).each do |operator|
|
57
60
|
define_method(operator) do |criterion, &block|
|
58
|
-
|
59
|
-
|
61
|
+
if chains.include?(:in)
|
62
|
+
raise Filemaker::Errors::MixedClauseError,
|
63
|
+
"Can't mix 'where' with 'in'."
|
64
|
+
end
|
65
|
+
|
60
66
|
chains.push(operator.to_sym)
|
61
67
|
chains.push(:where) unless chains.include?(:where) # Just one time
|
62
68
|
chains.delete(:in)
|
@@ -81,11 +87,11 @@ module Filemaker
|
|
81
87
|
end
|
82
88
|
end
|
83
89
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
90
|
+
alias equals eq
|
91
|
+
alias contains cn
|
92
|
+
alias begins_with bw
|
93
|
+
alias ends_with ew
|
94
|
+
alias not neq
|
89
95
|
|
90
96
|
# Find records based on FileMaker's compound find syntax.
|
91
97
|
#
|
@@ -99,15 +105,18 @@ module Filemaker
|
|
99
105
|
#
|
100
106
|
# @return [Filemaker::Model::Criteria]
|
101
107
|
def in(criterion, negating = false)
|
102
|
-
|
103
|
-
|
108
|
+
if chains.include?(:where)
|
109
|
+
raise Filemaker::Errors::MixedClauseError,
|
110
|
+
"Can't mix 'in' with 'where'."
|
111
|
+
end
|
112
|
+
|
104
113
|
chains.push(:in)
|
105
114
|
chains.delete(:where)
|
106
115
|
@selector ||= []
|
107
116
|
|
108
117
|
become_array(criterion).each do |hash|
|
109
118
|
accepted_hash = klass.with_model_fields(hash)
|
110
|
-
accepted_hash
|
119
|
+
accepted_hash['-omit'] = true if negating
|
111
120
|
@selector << accepted_hash
|
112
121
|
end
|
113
122
|
|
@@ -138,8 +147,11 @@ module Filemaker
|
|
138
147
|
#
|
139
148
|
# @return [Filemaker::Model::Criteria]
|
140
149
|
def or(criterion)
|
141
|
-
|
142
|
-
|
150
|
+
if chains.include?(:in)
|
151
|
+
raise Filemaker::Errors::MixedClauseError,
|
152
|
+
"Can't mix 'or' with 'in'."
|
153
|
+
end
|
154
|
+
|
143
155
|
@selector ||= {}
|
144
156
|
selector.merge!(klass.with_model_fields(criterion))
|
145
157
|
options[:lop] = 'or'
|
data/lib/filemaker/railtie.rb
CHANGED
@@ -6,11 +6,11 @@ module Rails
|
|
6
6
|
initializer 'filemaker-load-config-yml' do
|
7
7
|
config_file = Rails.root.join('config', 'filemaker.yml')
|
8
8
|
|
9
|
-
|
10
|
-
::Filemaker.load!(config_file, Rails.env)
|
11
|
-
else
|
9
|
+
unless config_file.file?
|
12
10
|
raise ::Filemaker::Errors::ConfigurationError, 'No config file'
|
13
11
|
end
|
12
|
+
|
13
|
+
::Filemaker.load!(config_file, Rails.env)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
data/lib/filemaker/record.rb
CHANGED
@@ -77,7 +77,7 @@ module Filemaker
|
|
77
77
|
|
78
78
|
def normalize_data(datum)
|
79
79
|
return nil if datum.empty?
|
80
|
-
|
80
|
+
datum.size == 1 ? datum.first : datum
|
81
81
|
end
|
82
82
|
|
83
83
|
def method_missing(symbol, *args, &block)
|
@@ -86,5 +86,9 @@ module Filemaker
|
|
86
86
|
return @dirty[$`] = args.first if method =~ /(=)$/ && key?($`)
|
87
87
|
super
|
88
88
|
end
|
89
|
+
|
90
|
+
def respond_to_missing?
|
91
|
+
super
|
92
|
+
end
|
89
93
|
end
|
90
94
|
end
|
data/lib/filemaker/resultset.rb
CHANGED
data/lib/filemaker/server.rb
CHANGED
@@ -11,8 +11,8 @@ module Filemaker
|
|
11
11
|
|
12
12
|
# @return [Filemaker::Store::DatabaseStore] the database store
|
13
13
|
attr_reader :databases
|
14
|
-
|
15
|
-
|
14
|
+
alias database databases
|
15
|
+
alias db databases
|
16
16
|
|
17
17
|
def_delegators :@config, :host, :url, :ssl, :endpoint, :log
|
18
18
|
def_delegators :@config, :account_name, :password
|
@@ -168,8 +168,6 @@ module Filemaker
|
|
168
168
|
when :simple then log_simple(params)
|
169
169
|
when :curl then log_curl(params)
|
170
170
|
when :curl_auth then log_curl(params, true)
|
171
|
-
else
|
172
|
-
return
|
173
171
|
end
|
174
172
|
end
|
175
173
|
|
@@ -188,7 +186,7 @@ module Filemaker
|
|
188
186
|
end
|
189
187
|
|
190
188
|
def log_simple(params)
|
191
|
-
warn "#{endpoint}?#{log_params(params)}"
|
189
|
+
warn colorize('48;2;255;0;0', "#{endpoint}?#{log_params(params)}")
|
192
190
|
end
|
193
191
|
|
194
192
|
def log_params(params)
|
@@ -196,5 +194,9 @@ module Filemaker
|
|
196
194
|
"#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s)}"
|
197
195
|
end.join('&')
|
198
196
|
end
|
197
|
+
|
198
|
+
def colorize(color, message)
|
199
|
+
"\e[#{color}m#{message}\e[0m"
|
200
|
+
end
|
199
201
|
end
|
200
202
|
end
|
data/lib/filemaker/version.rb
CHANGED
@@ -36,6 +36,18 @@ describe Filemaker::Metadata::Field do
|
|
36
36
|
expect(field.coerce('100')).to be_a BigDecimal
|
37
37
|
end
|
38
38
|
|
39
|
+
it 'removes decimal mark in number' do
|
40
|
+
allow(field).to receive(:data_type).and_return 'number'
|
41
|
+
expect(field.coerce('49,028.39')).to be_a BigDecimal
|
42
|
+
expect(field.coerce('49,028.39')).to eq 49_028.39
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'removes dollar sign in number' do
|
46
|
+
allow(field).to receive(:data_type).and_return 'number'
|
47
|
+
expect(field.coerce('$49,028.39')).to be_a BigDecimal
|
48
|
+
expect(field.coerce('$49,028.39')).to eq 49_028.39
|
49
|
+
end
|
50
|
+
|
39
51
|
it 'converts date to Date' do
|
40
52
|
allow(field).to receive(:data_type).and_return 'date'
|
41
53
|
expect(field.coerce('10/31/2014')).to be_a Date
|
data/spec/support/models.rb
CHANGED
@@ -57,7 +57,10 @@ class MyModel
|
|
57
57
|
belongs_to :applicant, class_name: User, reference_key: :name
|
58
58
|
belongs_to :member
|
59
59
|
belongs_to :manager, source_key: :mg_id
|
60
|
-
belongs_to :another_manager,
|
60
|
+
belongs_to :another_manager,
|
61
|
+
class_name: Manager,
|
62
|
+
source_key: :mg_id,
|
63
|
+
reference_key: :candidate_id
|
61
64
|
has_many :posts
|
62
65
|
has_many :posters, class_name: User, reference_key: :email
|
63
66
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: filemaker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mech
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -42,16 +42,16 @@ dependencies:
|
|
42
42
|
name: nokogiri
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '1.7'
|
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: '
|
54
|
+
version: '1.7'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: activemodel
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,42 +86,42 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '1.
|
89
|
+
version: '1.13'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '1.
|
96
|
+
version: '1.13'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rake
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
103
|
+
version: '12.0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
110
|
+
version: '12.0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: rspec
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '3.
|
117
|
+
version: '3.5'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: '3.
|
124
|
+
version: '3.5'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: rubocop
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -257,7 +257,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
257
257
|
version: '0'
|
258
258
|
requirements: []
|
259
259
|
rubyforge_project:
|
260
|
-
rubygems_version: 2.6.
|
260
|
+
rubygems_version: 2.6.8
|
261
261
|
signing_key:
|
262
262
|
specification_version: 4
|
263
263
|
summary: A Ruby wrapper to FileMaker XML API.
|
@@ -287,4 +287,3 @@ test_files:
|
|
287
287
|
- spec/support/responses/portal.xml
|
288
288
|
- spec/support/responses/scriptnames.xml
|
289
289
|
- spec/support/xml_loader.rb
|
290
|
-
has_rdoc:
|