filemaker 0.0.19 → 1.0.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 +5 -5
- data/.editorconfig +14 -0
- data/.travis.yml +1 -2
- data/README.md +24 -10
- data/filemaker.gemspec +1 -4
- data/lib/filemaker.rb +14 -16
- data/lib/filemaker/configuration.rb +6 -1
- data/lib/filemaker/errors.rb +1 -0
- data/lib/filemaker/layout.rb +1 -2
- data/lib/filemaker/metadata/field.rb +6 -4
- data/lib/filemaker/model.rb +28 -17
- data/lib/filemaker/model/batches.rb +12 -1
- data/lib/filemaker/model/builder.rb +9 -4
- data/lib/filemaker/model/components.rb +8 -0
- data/lib/filemaker/model/field.rb +35 -40
- data/lib/filemaker/model/fields.rb +25 -22
- data/lib/filemaker/model/pagination.rb +1 -0
- data/lib/filemaker/model/persistable.rb +8 -8
- data/lib/filemaker/model/selectable.rb +1 -1
- data/lib/filemaker/model/type.rb +31 -0
- data/lib/filemaker/model/types/big_decimal.rb +22 -0
- data/lib/filemaker/model/types/date.rb +24 -0
- data/lib/filemaker/model/types/email.rb +5 -23
- data/lib/filemaker/model/types/integer.rb +22 -0
- data/lib/filemaker/model/types/text.rb +19 -0
- data/lib/filemaker/model/types/time.rb +22 -0
- data/lib/filemaker/record.rb +1 -1
- data/lib/filemaker/server.rb +38 -36
- data/lib/filemaker/store/database_store.rb +1 -1
- data/lib/filemaker/store/layout_store.rb +1 -1
- data/lib/filemaker/store/script_store.rb +1 -1
- data/lib/filemaker/version.rb +1 -1
- data/spec/filemaker/layout_spec.rb +1 -1
- data/spec/filemaker/metadata/field_spec.rb +16 -16
- data/spec/filemaker/model/builder_spec.rb +5 -0
- data/spec/filemaker/model/criteria_spec.rb +8 -7
- data/spec/filemaker/model/types_spec.rb +103 -0
- data/spec/filemaker/model_spec.rb +4 -13
- data/spec/filemaker/record_spec.rb +1 -1
- data/spec/filemaker/server_spec.rb +7 -9
- data/spec/filemaker/store/database_store_spec.rb +1 -1
- data/spec/filemaker/store/layout_store_spec.rb +1 -1
- data/spec/filemaker/store/script_store_spec.rb +1 -1
- data/spec/spec_helper.rb +5 -0
- data/spec/support/models.rb +0 -1
- data/spec/support/xml_loader.rb +8 -20
- metadata +14 -48
- data/lib/filemaker/model/types/attachment.rb +0 -102
@@ -10,7 +10,7 @@ module Filemaker
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def all
|
13
|
-
response, _params = @server.perform_request(
|
13
|
+
response, _params = @server.perform_request('-dbnames', nil)
|
14
14
|
resultset = Filemaker::Resultset.new(@server, response.body)
|
15
15
|
resultset.map do |record|
|
16
16
|
record['DATABASE_NAME']
|
@@ -12,7 +12,7 @@ module Filemaker
|
|
12
12
|
|
13
13
|
def all
|
14
14
|
args = { '-db' => @database.name }
|
15
|
-
response, _params = @server.perform_request(
|
15
|
+
response, _params = @server.perform_request('-layoutnames', args)
|
16
16
|
resultset = Filemaker::Resultset.new(@server, response.body)
|
17
17
|
resultset.map do |record|
|
18
18
|
record['LAYOUT_NAME']
|
@@ -12,7 +12,7 @@ module Filemaker
|
|
12
12
|
|
13
13
|
def all
|
14
14
|
args = { '-db' => @database.name }
|
15
|
-
response, _params = @server.perform_request(
|
15
|
+
response, _params = @server.perform_request('-scriptnames', args)
|
16
16
|
resultset = Filemaker::Resultset.new(@server, response.body)
|
17
17
|
resultset.map do |record|
|
18
18
|
record['SCRIPT_NAME']
|
data/lib/filemaker/version.rb
CHANGED
@@ -14,67 +14,67 @@ describe Filemaker::Metadata::Field do
|
|
14
14
|
context 'coercion' do
|
15
15
|
it 'converts to nil for empty string' do
|
16
16
|
allow(field).to receive(:data_type).and_return 'text'
|
17
|
-
expect(field.
|
17
|
+
expect(field.raw_cast('')).to be_nil
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'converts to nil for space string' do
|
21
21
|
allow(field).to receive(:data_type).and_return 'text'
|
22
|
-
expect(field.
|
22
|
+
expect(field.raw_cast(' ')).to be_nil
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'converts to nil for nil' do
|
26
26
|
allow(field).to receive(:data_type).and_return 'text'
|
27
|
-
expect(field.
|
27
|
+
expect(field.raw_cast(nil)).to be_nil
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'converts text to String' do
|
31
31
|
allow(field).to receive(:data_type).and_return 'text'
|
32
|
-
expect(field.
|
32
|
+
expect(field.raw_cast('some text value')).to be_a String
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'converts number to BigDecimal' do
|
36
36
|
allow(field).to receive(:data_type).and_return 'number'
|
37
|
-
expect(field.
|
37
|
+
expect(field.raw_cast('100')).to be_a BigDecimal
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'removes decimal mark in number' do
|
41
41
|
allow(field).to receive(:data_type).and_return 'number'
|
42
|
-
expect(field.
|
43
|
-
expect(field.
|
42
|
+
expect(field.raw_cast('49,028.39')).to be_a BigDecimal
|
43
|
+
expect(field.raw_cast('49,028.39')).to eq 49_028.39
|
44
44
|
end
|
45
45
|
|
46
46
|
it 'removes dollar sign in number' do
|
47
47
|
allow(field).to receive(:data_type).and_return 'number'
|
48
|
-
expect(field.
|
49
|
-
expect(field.
|
48
|
+
expect(field.raw_cast('$49,028.39')).to be_a BigDecimal
|
49
|
+
expect(field.raw_cast('$49,028.39')).to eq 49_028.39
|
50
50
|
end
|
51
51
|
|
52
52
|
it 'converts date to Date' do
|
53
53
|
allow(field).to receive(:data_type).and_return 'date'
|
54
|
-
expect(field.
|
54
|
+
expect(field.raw_cast('10/31/2014')).to be_a Date
|
55
55
|
end
|
56
56
|
|
57
57
|
it 'converts time to DateTime' do
|
58
58
|
allow(field).to receive(:data_type).and_return 'time'
|
59
|
-
expect(field.
|
59
|
+
expect(field.raw_cast('12:12:12')).to be_a DateTime
|
60
60
|
end
|
61
61
|
|
62
62
|
it 'converts timestamp to DateTime' do
|
63
63
|
allow(field).to receive(:data_type).and_return 'timestamp'
|
64
|
-
expect(field.
|
64
|
+
expect(field.raw_cast('10/31/2014 12:12:12')).to be_a DateTime
|
65
65
|
end
|
66
66
|
|
67
67
|
it 'converts container to URI' do
|
68
68
|
allow(field).to receive(:data_type).and_return 'container'
|
69
|
-
expect(field.
|
70
|
-
expect(field.
|
69
|
+
expect(field.raw_cast('/fmi/xml/cnt/1234jpg')).to be_a URI
|
70
|
+
expect(field.raw_cast('/fmi/xml/cnt/1234jpg').to_s).to eq \
|
71
71
|
'https://host/fmi/xml/cnt/1234jpg'
|
72
72
|
end
|
73
73
|
|
74
74
|
it 'converts container with existing http' do
|
75
75
|
allow(field).to receive(:data_type).and_return 'container'
|
76
|
-
expect(field.
|
77
|
-
expect(field.
|
76
|
+
expect(field.raw_cast('http://host/fmi/xml/cnt/1234jpg')).to be_a URI
|
77
|
+
expect(field.raw_cast('http://host/fmi/xml/cnt/1234jpg').to_s).to eq \
|
78
78
|
'http://host/fmi/xml/cnt/1234jpg'
|
79
79
|
end
|
80
80
|
end
|
@@ -24,6 +24,11 @@ describe Filemaker::Model::Builder do
|
|
24
24
|
it 'has a modify_date' do
|
25
25
|
expect(subject.modify_date).to eq(Date.parse('2014-08-12'))
|
26
26
|
end
|
27
|
+
|
28
|
+
it 'is not dirty' do
|
29
|
+
expect(subject.changed?).to eq false
|
30
|
+
expect(subject.changes).to be_empty
|
31
|
+
end
|
27
32
|
end
|
28
33
|
|
29
34
|
context '.collection' do
|
@@ -311,13 +311,14 @@ describe Filemaker::Model::Criteria do
|
|
311
311
|
expect(criteria.per(50).options[:max]).to eq 50
|
312
312
|
end
|
313
313
|
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
314
|
+
# Disable these 2 tests because page() will immediately execute .all
|
315
|
+
# it 'sets the page to skip' do
|
316
|
+
# expect(criteria.page(2).per(50).options[:skip]).to eq 50
|
317
|
+
# end
|
318
|
+
|
319
|
+
# it 'sets the page to skip with larger page' do
|
320
|
+
# expect(criteria.page(12).per(50).options[:skip]).to eq 550
|
321
|
+
# end
|
321
322
|
|
322
323
|
it 'will not populate skip option if there is no page' do
|
323
324
|
expect(criteria.per(50).options[:skip]).to be_nil
|
@@ -0,0 +1,103 @@
|
|
1
|
+
describe Filemaker::Model::Types do
|
2
|
+
let(:model) { MyModel.new }
|
3
|
+
|
4
|
+
context 'Types::Text' do
|
5
|
+
it 'assign as a string' do
|
6
|
+
model.name = 'hello'
|
7
|
+
expect(model.name).to be_a String
|
8
|
+
expect(model.name).to eq 'hello'
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'query as a string' do
|
12
|
+
c = MyModel.where(name: 'hello')
|
13
|
+
expect(c.selector['name']).to be_a String
|
14
|
+
expect(c.selector['name']).to eq 'hello'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'Types::Date' do
|
19
|
+
it 'assign as a date' do
|
20
|
+
model.created_at = Date.new(2018, 1, 1)
|
21
|
+
expect(model.created_at).to be_a Date
|
22
|
+
expect(model.created_at).to eq Date.new(2018, 1, 1)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'can query as a string' do
|
26
|
+
c = MyModel.where(created_at: '12/2018')
|
27
|
+
expect(c.selector['created_at']).to be_a String
|
28
|
+
expect(c.selector['created_at']).to eq '12/2018'
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'can query as a date' do
|
32
|
+
c = MyModel.where(created_at: Date.new(2018, 1, 1))
|
33
|
+
expect(c.selector['created_at']).to be_a Date
|
34
|
+
expect(c.selector['created_at']).to eq Date.new(2018, 1, 1)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'Types::Time' do
|
39
|
+
it 'assign as a time' do
|
40
|
+
model.updated_at = Time.new(2018, 1, 1, 12, 12, 12)
|
41
|
+
expect(model.updated_at).to be_a Time
|
42
|
+
expect(model.updated_at).to eq Time.new(2018, 1, 1, 12, 12, 12)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'can query as a string' do
|
46
|
+
c = MyModel.where(updated_at: '2018')
|
47
|
+
expect(c.selector['modifieddate']).to be_a String
|
48
|
+
expect(c.selector['modifieddate']).to eq '2018'
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'can query as a time' do
|
52
|
+
c = MyModel.where(updated_at: Time.new(2018, 1, 1, 12, 12, 12))
|
53
|
+
expect(c.selector['modifieddate']).to be_a Time
|
54
|
+
expect(c.selector['modifieddate']).to eq Time.new(2018, 1, 1, 12, 12, 12)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'Types::BigDecimal' do
|
59
|
+
it 'assign as a big decimal' do
|
60
|
+
model.salary = '25'
|
61
|
+
expect(model.salary).to be_a BigDecimal
|
62
|
+
expect(model.salary).to eq 25.0
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'query as a big decimal' do
|
66
|
+
c = MyModel.where(salary: 23.7)
|
67
|
+
expect(c.selector['salary']).to be_a BigDecimal
|
68
|
+
expect(c.selector['salary']).to eq 23.7
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'Types::Integer' do
|
73
|
+
it 'assign as an integer' do
|
74
|
+
model.age = '25'
|
75
|
+
expect(model.age).to be_a Integer
|
76
|
+
expect(model.age).to eq 25
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'query as an integer' do
|
80
|
+
c1 = MyModel.where(age: 40)
|
81
|
+
expect(c1.selector['passage of time']).to be_a Integer
|
82
|
+
expect(c1.selector['passage of time']).to eq 40
|
83
|
+
|
84
|
+
c2 = MyModel.where(age: '31')
|
85
|
+
expect(c2.selector['passage of time']).to be_a Integer
|
86
|
+
expect(c2.selector['passage of time']).to eq 31
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'Types::Email' do
|
91
|
+
it 'assign as an email' do
|
92
|
+
model.backup_email = 'bob@example.com'
|
93
|
+
expect(model.backup_email).to be_a String
|
94
|
+
expect(model.backup_email).to eq 'bob@example.com'
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'query by replacing @ with \@' do
|
98
|
+
c = MyModel.where(backup_email: 'bob@example.com')
|
99
|
+
expect(c.selector['backup_email']).to be_a String
|
100
|
+
expect(c.selector['backup_email']).to eq 'bob\@example.com'
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -58,7 +58,8 @@ describe Filemaker::Model do
|
|
58
58
|
expect(model.backup_email.to_s).to eq 'dated@example.com'
|
59
59
|
|
60
60
|
model.backup_email = 'don want to give email add'
|
61
|
-
expect(model.backup_email.to_s).to be_nil
|
61
|
+
# expect(model.backup_email.to_s).to be_nil
|
62
|
+
expect(model.backup_email.to_s).to eq ''
|
62
63
|
|
63
64
|
model.backup_email = 'a@host.com'
|
64
65
|
expect(model.backup_email.to_s).to eq 'a@host.com'
|
@@ -71,7 +72,7 @@ describe Filemaker::Model do
|
|
71
72
|
model.backup_email = 'one@host.com'
|
72
73
|
expect(model.backup_email).to eq 'one@host.com'
|
73
74
|
|
74
|
-
other_email =
|
75
|
+
other_email = 'one@host.com'
|
75
76
|
expect(model.backup_email).to eq other_email
|
76
77
|
end
|
77
78
|
|
@@ -87,8 +88,7 @@ describe Filemaker::Model do
|
|
87
88
|
'created_at',
|
88
89
|
'modifieddate',
|
89
90
|
'salary',
|
90
|
-
'passage of time'
|
91
|
-
'document'
|
91
|
+
'passage of time'
|
92
92
|
]
|
93
93
|
end
|
94
94
|
|
@@ -140,15 +140,6 @@ describe Filemaker::Model do
|
|
140
140
|
expect(model.cache_key).to eq 'my_models/CA123'
|
141
141
|
end
|
142
142
|
|
143
|
-
it 'has attachment' do
|
144
|
-
model.document = URI.parse('http://host/somefile.pdf')
|
145
|
-
expect(model.document.url).to eq 'http://host/somefile.pdf'
|
146
|
-
expect(model.document.filename).to eq 'somefile.pdf'
|
147
|
-
model.document.body
|
148
|
-
expect(model.document.extension).to eq '.pdf'
|
149
|
-
expect(model.document.content_type).to eq 'application/pdf'
|
150
|
-
end
|
151
|
-
|
152
143
|
describe 'process_attributes' do
|
153
144
|
it 'accepts a hash of attributes' do
|
154
145
|
model = MyModel.new(name: 'Bob', email: 'bob@cern.org')
|
@@ -36,7 +36,7 @@ describe Filemaker::Record do
|
|
36
36
|
|
37
37
|
it 'Salary should be an array of BigDecimal' do
|
38
38
|
expect(@record['Salary']).to be_an Array
|
39
|
-
expect(@record['SALARY']).to eq [BigDecimal
|
39
|
+
expect(@record['SALARY']).to eq [BigDecimal(5000), BigDecimal(6000)]
|
40
40
|
end
|
41
41
|
|
42
42
|
it 'has 2 portals' do
|
@@ -11,11 +11,6 @@ describe Filemaker::Server do
|
|
11
11
|
expect(server.url).to eq 'http://example.com'
|
12
12
|
expect(server.account_name).to eq 'account_name'
|
13
13
|
expect(server.password).to eq 'password'
|
14
|
-
expect(server.connection).to be_a Faraday::Connection
|
15
|
-
expect(server.connection.headers[:user_agent]).to \
|
16
|
-
eq "filemaker-ruby-#{Filemaker::VERSION}"
|
17
|
-
expect(server.connection.headers[:authorization]).to \
|
18
|
-
eq 'Basic YWNjb3VudF9uYW1lOnBhc3N3b3Jk'
|
19
14
|
end
|
20
15
|
|
21
16
|
it 'specifically ask for no SSL' do
|
@@ -50,7 +45,7 @@ describe Filemaker::Server do
|
|
50
45
|
end
|
51
46
|
|
52
47
|
expect(server.url).to eq 'https://example.com'
|
53
|
-
expect(server.
|
48
|
+
expect(server.ssl[:verify]).to be false
|
54
49
|
end
|
55
50
|
end
|
56
51
|
|
@@ -78,7 +73,8 @@ describe Filemaker::Server do
|
|
78
73
|
end
|
79
74
|
|
80
75
|
it 'raises Filemaker::Errors::CommunicationError if status = 0' do
|
81
|
-
fake_error(@server, nil, 0)
|
76
|
+
# fake_error(@server, nil, 0)
|
77
|
+
fake_typhoeus_error(0)
|
82
78
|
|
83
79
|
expect do
|
84
80
|
@server.databases.all
|
@@ -86,7 +82,8 @@ describe Filemaker::Server do
|
|
86
82
|
end
|
87
83
|
|
88
84
|
it 'raises Filemaker::Errors::CommunicationError if status = 404' do
|
89
|
-
fake_error(@server, nil, 404)
|
85
|
+
# fake_error(@server, nil, 404)
|
86
|
+
fake_typhoeus_error(404)
|
90
87
|
|
91
88
|
expect do
|
92
89
|
@server.databases.all
|
@@ -94,7 +91,8 @@ describe Filemaker::Server do
|
|
94
91
|
end
|
95
92
|
|
96
93
|
it 'raises Filemaker::Errors::AuthenticationError if status = 401' do
|
97
|
-
fake_error(@server, nil, 401)
|
94
|
+
# fake_error(@server, nil, 401)
|
95
|
+
fake_typhoeus_error(401)
|
98
96
|
|
99
97
|
expect do
|
100
98
|
@server.databases.all
|
@@ -20,7 +20,7 @@ describe Filemaker::Store::LayoutStore do
|
|
20
20
|
config.password = 'password'
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
fake_typhoeus_post('layoutnames.xml')
|
24
24
|
|
25
25
|
expect(server.db['candidates'].layouts.all).to eq \
|
26
26
|
['Dashboard', 'Calender', 'Profile', 'Resume', 'Job Application']
|
@@ -20,7 +20,7 @@ describe Filemaker::Store::ScriptStore do
|
|
20
20
|
config.password = 'password'
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
fake_typhoeus_post('scriptnames.xml')
|
24
24
|
|
25
25
|
expect(server.db['candidates'].scripts.all).to eq \
|
26
26
|
['library', 'open job', 'copy resume']
|
data/spec/spec_helper.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'filemaker'
|
2
|
+
require 'pry'
|
2
3
|
require_relative 'support/xml_loader'
|
3
4
|
require_relative 'support/models'
|
4
5
|
|
@@ -22,6 +23,10 @@ require_relative 'support/models'
|
|
22
23
|
RSpec.configure do |config|
|
23
24
|
config.include XmlLoader
|
24
25
|
|
26
|
+
config.before :each do
|
27
|
+
Typhoeus::Expectation.clear
|
28
|
+
end
|
29
|
+
|
25
30
|
# The settings below are suggested to provide a good initial experience
|
26
31
|
# with RSpec, but feel free to customize to your heart's content.
|
27
32
|
|
data/spec/support/models.rb
CHANGED
data/spec/support/xml_loader.rb
CHANGED
@@ -3,27 +3,15 @@ module XmlLoader
|
|
3
3
|
File.read(File.dirname(__FILE__) + '/responses/' + filename)
|
4
4
|
end
|
5
5
|
|
6
|
-
def
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
11
|
-
end
|
6
|
+
def fake_typhoeus_post(xml)
|
7
|
+
Typhoeus.stub('http://example.com/fmi/xml/fmresultset.xml').and_return(
|
8
|
+
Typhoeus::Response.new(code: 200, body: import_xml_as_string(xml))
|
9
|
+
)
|
12
10
|
end
|
13
11
|
|
14
|
-
def
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def fake_error(server, body, status_code)
|
23
|
-
server.connection.builder.use Faraday::Adapter::Test do |stub|
|
24
|
-
stub.post '/fmi/xml/fmresultset.xml', body do
|
25
|
-
[status_code, {}, '']
|
26
|
-
end
|
27
|
-
end
|
12
|
+
def fake_typhoeus_error(status_code)
|
13
|
+
Typhoeus.stub('http://example.com/fmi/xml/fmresultset.xml').and_return(
|
14
|
+
Typhoeus::Response.new(code: status_code)
|
15
|
+
)
|
28
16
|
end
|
29
17
|
end
|