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