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.
Files changed (48) hide show
  1. checksums.yaml +5 -5
  2. data/.editorconfig +14 -0
  3. data/.travis.yml +1 -2
  4. data/README.md +24 -10
  5. data/filemaker.gemspec +1 -4
  6. data/lib/filemaker.rb +14 -16
  7. data/lib/filemaker/configuration.rb +6 -1
  8. data/lib/filemaker/errors.rb +1 -0
  9. data/lib/filemaker/layout.rb +1 -2
  10. data/lib/filemaker/metadata/field.rb +6 -4
  11. data/lib/filemaker/model.rb +28 -17
  12. data/lib/filemaker/model/batches.rb +12 -1
  13. data/lib/filemaker/model/builder.rb +9 -4
  14. data/lib/filemaker/model/components.rb +8 -0
  15. data/lib/filemaker/model/field.rb +35 -40
  16. data/lib/filemaker/model/fields.rb +25 -22
  17. data/lib/filemaker/model/pagination.rb +1 -0
  18. data/lib/filemaker/model/persistable.rb +8 -8
  19. data/lib/filemaker/model/selectable.rb +1 -1
  20. data/lib/filemaker/model/type.rb +31 -0
  21. data/lib/filemaker/model/types/big_decimal.rb +22 -0
  22. data/lib/filemaker/model/types/date.rb +24 -0
  23. data/lib/filemaker/model/types/email.rb +5 -23
  24. data/lib/filemaker/model/types/integer.rb +22 -0
  25. data/lib/filemaker/model/types/text.rb +19 -0
  26. data/lib/filemaker/model/types/time.rb +22 -0
  27. data/lib/filemaker/record.rb +1 -1
  28. data/lib/filemaker/server.rb +38 -36
  29. data/lib/filemaker/store/database_store.rb +1 -1
  30. data/lib/filemaker/store/layout_store.rb +1 -1
  31. data/lib/filemaker/store/script_store.rb +1 -1
  32. data/lib/filemaker/version.rb +1 -1
  33. data/spec/filemaker/layout_spec.rb +1 -1
  34. data/spec/filemaker/metadata/field_spec.rb +16 -16
  35. data/spec/filemaker/model/builder_spec.rb +5 -0
  36. data/spec/filemaker/model/criteria_spec.rb +8 -7
  37. data/spec/filemaker/model/types_spec.rb +103 -0
  38. data/spec/filemaker/model_spec.rb +4 -13
  39. data/spec/filemaker/record_spec.rb +1 -1
  40. data/spec/filemaker/server_spec.rb +7 -9
  41. data/spec/filemaker/store/database_store_spec.rb +1 -1
  42. data/spec/filemaker/store/layout_store_spec.rb +1 -1
  43. data/spec/filemaker/store/script_store_spec.rb +1 -1
  44. data/spec/spec_helper.rb +5 -0
  45. data/spec/support/models.rb +0 -1
  46. data/spec/support/xml_loader.rb +8 -20
  47. metadata +14 -48
  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(:post, '-dbnames', nil)
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(:post, '-layoutnames', args)
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(:post, '-scriptnames', args)
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']
@@ -1,3 +1,3 @@
1
1
  module Filemaker
2
- VERSION = '0.0.19'.freeze
2
+ VERSION = '1.0.0'.freeze
3
3
  end
@@ -14,7 +14,7 @@ describe Filemaker::Layout do
14
14
  config.password = 'password'
15
15
  end
16
16
 
17
- fake_post_response(@server, nil, 'employment.xml')
17
+ fake_typhoeus_post('employment.xml')
18
18
  @layout = @server.db['candidates']['Profile']
19
19
  end
20
20
 
@@ -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.coerce('')).to be_nil
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.coerce(' ')).to be_nil
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.coerce(nil)).to be_nil
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.coerce('some text value')).to be_a String
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.coerce('100')).to be_a BigDecimal
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.coerce('49,028.39')).to be_a BigDecimal
43
- expect(field.coerce('49,028.39')).to eq 49_028.39
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.coerce('$49,028.39')).to be_a BigDecimal
49
- expect(field.coerce('$49,028.39')).to eq 49_028.39
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.coerce('10/31/2014')).to be_a Date
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.coerce('12:12:12')).to be_a DateTime
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.coerce('10/31/2014 12:12:12')).to be_a DateTime
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.coerce('/fmi/xml/cnt/1234jpg')).to be_a URI
70
- expect(field.coerce('/fmi/xml/cnt/1234jpg').to_s).to eq \
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.coerce('http://host/fmi/xml/cnt/1234jpg')).to be_a URI
77
- expect(field.coerce('http://host/fmi/xml/cnt/1234jpg').to_s).to eq \
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
- it 'sets the page to skip' do
315
- expect(criteria.page(2).per(50).options[:skip]).to eq 50
316
- end
317
-
318
- it 'sets the page to skip with larger page' do
319
- expect(criteria.page(12).per(50).options[:skip]).to eq 550
320
- end
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 = Filemaker::Model::Types::Email.new('one@host.com')
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.new(5000), BigDecimal.new(6000)]
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.connection.ssl[:verify]).to be false
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::DatabaseStore do
20
20
  config.password = 'password'
21
21
  end
22
22
 
23
- fake_post_response(server, nil, 'dbnames.xml')
23
+ fake_typhoeus_post('dbnames.xml')
24
24
 
25
25
  expected_result = %w[Billing Candidates Employee Jobs]
26
26
 
@@ -20,7 +20,7 @@ describe Filemaker::Store::LayoutStore do
20
20
  config.password = 'password'
21
21
  end
22
22
 
23
- fake_post_response(server, nil, 'layoutnames.xml')
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
- fake_post_response(server, nil, 'scriptnames.xml')
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']
@@ -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
 
@@ -73,7 +73,6 @@ class MyModel
73
73
  datetime :updated_at, fm_name: 'ModifiedDate'
74
74
  money :salary
75
75
  integer :age, fm_name: 'passage of time'
76
- object :document
77
76
  end
78
77
 
79
78
  class Project
@@ -3,27 +3,15 @@ module XmlLoader
3
3
  File.read(File.dirname(__FILE__) + '/responses/' + filename)
4
4
  end
5
5
 
6
- def fake_post_response(server, body, xml)
7
- server.connection.builder.use Faraday::Adapter::Test do |stub|
8
- stub.post '/fmi/xml/fmresultset.xml', body do
9
- [200, {}, import_xml_as_string(xml)]
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 fake_get_response(server, query_string, xml)
15
- server.connection.builder.use Faraday::Adapter::Test do |stub|
16
- stub.get "/fmi/xml/fmresultset.xml?#{query_string}" do
17
- [200, {}, import_xml_as_string(xml)]
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