filemaker 0.0.17 → 0.0.18
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|