filemaker 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +129 -17
  3. data/filemaker.gemspec +1 -0
  4. data/lib/filemaker.rb +47 -0
  5. data/lib/filemaker/api/query_commands/findquery.rb +20 -3
  6. data/lib/filemaker/configuration.rb +1 -1
  7. data/lib/filemaker/core_ext/hash.rb +19 -15
  8. data/lib/filemaker/error.rb +5 -0
  9. data/lib/filemaker/metadata/field.rb +21 -5
  10. data/lib/filemaker/model.rb +132 -0
  11. data/lib/filemaker/model/builder.rb +52 -0
  12. data/lib/filemaker/model/components.rb +25 -0
  13. data/lib/filemaker/model/criteria.rb +101 -0
  14. data/lib/filemaker/model/field.rb +38 -0
  15. data/lib/filemaker/model/fields.rb +80 -0
  16. data/lib/filemaker/model/findable.rb +35 -0
  17. data/lib/filemaker/model/optional.rb +69 -0
  18. data/lib/filemaker/model/pagination.rb +41 -0
  19. data/lib/filemaker/model/persistable.rb +96 -0
  20. data/lib/filemaker/model/relations.rb +72 -0
  21. data/lib/filemaker/model/relations/belongs_to.rb +30 -0
  22. data/lib/filemaker/model/relations/has_many.rb +79 -0
  23. data/lib/filemaker/model/relations/proxy.rb +35 -0
  24. data/lib/filemaker/model/selectable.rb +146 -0
  25. data/lib/filemaker/railtie.rb +17 -0
  26. data/lib/filemaker/record.rb +25 -0
  27. data/lib/filemaker/resultset.rb +12 -4
  28. data/lib/filemaker/server.rb +7 -5
  29. data/lib/filemaker/version.rb +1 -1
  30. data/spec/filemaker/api/query_commands/compound_find_spec.rb +13 -1
  31. data/spec/filemaker/configuration_spec.rb +23 -0
  32. data/spec/filemaker/layout_spec.rb +0 -1
  33. data/spec/filemaker/model/criteria_spec.rb +304 -0
  34. data/spec/filemaker/model/relations_spec.rb +85 -0
  35. data/spec/filemaker/model_spec.rb +73 -0
  36. data/spec/filemaker/record_spec.rb +12 -1
  37. data/spec/spec_helper.rb +1 -0
  38. data/spec/support/filemaker.yml +13 -0
  39. data/spec/support/models.rb +38 -0
  40. metadata +44 -2
@@ -0,0 +1,85 @@
1
+ describe Filemaker::Model::Relations do
2
+
3
+ it 'every model has a relations hash' do
4
+ expect(MyModel.new.relations).to eq({})
5
+ end
6
+
7
+ describe 'belongs_to' do
8
+ context 'when using default reference_key' do
9
+ before do
10
+ @model = MyModel.new(candidate_id: '123')
11
+ allow(Candidate).to receive(:where).and_return([Candidate.new])
12
+ end
13
+
14
+ it 'appends _id to missing reference_key' do
15
+ expect(@model.candidate.reference_key).to eq 'candidate_id'
16
+ end
17
+
18
+ it 'target class should be Candidate' do
19
+ expect(@model.candidate.target_class).to eq Candidate
20
+ end
21
+
22
+ it 'owner belongs to MyModel' do
23
+ expect(@model.candidate.owner).to eq @model
24
+ end
25
+
26
+ it 'relations hash will be populated' do
27
+ @model.candidate
28
+ expect(@model.relations.fetch('candidate')).to eq \
29
+ @model.candidate.target
30
+ end
31
+ end
32
+
33
+ context 'when using supplied reference_key' do
34
+ before do
35
+ @model = MyModel.new(name: 'ABC')
36
+ allow(User).to receive(:where).and_return([User.new])
37
+ end
38
+
39
+ it 'will use the supplied class_name' do
40
+ expect(@model.applicant.target_class).to eq User
41
+ end
42
+
43
+ it 'will use the supplied reference_key' do
44
+ expect(@model.applicant.reference_key).to eq :name
45
+ end
46
+ end
47
+ end
48
+
49
+ describe 'has_many' do
50
+ before do
51
+ @model = MyModel.new(candidate_id: '123')
52
+ end
53
+
54
+ context 'when using default reference_key' do
55
+ it 'will use owner identity name' do
56
+ expect(@model.posts.reference_key).to eq :candidate_id
57
+ end
58
+
59
+ it 'target class should be Post' do
60
+ expect(@model.posts.target_class).to eq Post
61
+ end
62
+
63
+ it 'owner belongs to MyModel' do
64
+ expect(@model.posts.owner).to eq @model
65
+ end
66
+
67
+ it 'returns criteria instead of an array of model objects' do
68
+ expect(@model.posts).to be_a Filemaker::Model::Criteria
69
+ end
70
+ end
71
+
72
+ context 'when using supplied reference_key' do
73
+ it 'will use supplied class_name' do
74
+ expect(@model.posters.target_class).to eq User
75
+ end
76
+
77
+ it 'will use the supplied reference_key' do
78
+ expect(@model.posters.reference_key).to eq :email
79
+ end
80
+ end
81
+ end
82
+
83
+ describe 'has_portal' do
84
+ end
85
+ end
@@ -0,0 +1,73 @@
1
+ describe Filemaker::Model do
2
+
3
+ let(:model) { MyModel.new }
4
+
5
+ it 'sets up -db and -lay' do
6
+ expect(MyModel.db).to eq :candidates
7
+ expect(MyModel.lay).to eq :profile
8
+ expect(model.db).to eq :candidates
9
+ expect(model.lay).to eq :profile
10
+ end
11
+
12
+ it 'sets up server and api' do
13
+ expect(MyModel.api.default_params).to eq \
14
+ ({ '-db' => :candidates, '-lay' => :profile })
15
+ expect(MyModel.server.host).to eq 'host'
16
+ expect(model.api.default_params).to eq \
17
+ ({ '-db' => :candidates, '-lay' => :profile })
18
+ expect(model.server.host).to eq 'host'
19
+ end
20
+
21
+ it 'is a new record' do
22
+ expect(model.new_record).to be true
23
+ end
24
+
25
+ it 'has identity' do
26
+ model.candidate_id = 'CA123'
27
+ expect(model.id).to eq 'CA123'
28
+ end
29
+
30
+ it 'name and email default to UNTITLED' do
31
+ expect(model.name).to eq 'UNTITLED'
32
+ expect(model.email).to eq 'UNTITLED'
33
+ end
34
+
35
+ it 'stores the real FileMaker name under fm_name' do
36
+ expect(model.fm_names).to eq \
37
+ [
38
+ 'name',
39
+ 'email',
40
+ 'ca id',
41
+ 'created_at',
42
+ 'modifieddate',
43
+ 'salary',
44
+ 'passage of time'
45
+ ]
46
+ end
47
+
48
+ it 'salary is BigDecimal' do
49
+ model.salary = 100
50
+ expect(model.salary).to be_a BigDecimal
51
+ end
52
+
53
+ it 'created_at is Date' do
54
+ model.created_at = '4/12/2014'
55
+ expect(model.created_at).to be_a Date
56
+ end
57
+
58
+ it 'check for presence of name and salary' do
59
+ expect(model.name?).to be true
60
+ expect(model.salary?).to be false
61
+ model.salary = 100
62
+ expect(model.salary?).to be true
63
+ end
64
+
65
+ describe 'process_attributes' do
66
+ it 'accepts a hash of attributes' do
67
+ model = MyModel.new(name: 'Bob', email: 'bob@cern.org')
68
+ expect(model.name).to eq 'Bob'
69
+ expect(model.email).to eq 'bob@cern.org'
70
+ end
71
+ end
72
+
73
+ end
@@ -40,8 +40,19 @@ describe Filemaker::Record do
40
40
 
41
41
  it 'has 2 portals' do
42
42
  expect(@record.portals.size).to eq 2
43
- # Test for case insentive hash!
43
+ # Test for case insensitive hash!
44
44
  expect(@record.portals[:PORTAL_1]).to eq @record.portals['portal_1']
45
45
  end
46
46
 
47
+ it 'key access as plain method' do
48
+ expect(@record.portalid).to eq '1234'
49
+ end
50
+
51
+ context 'dirty checking' do
52
+ it 'tracks changes if you modify any value' do
53
+ @record.year = 2014
54
+ expect(@record.dirty).to eq({ 'year' => 2014 })
55
+ end
56
+ end
57
+
47
58
  end
@@ -1,5 +1,6 @@
1
1
  require 'filemaker'
2
2
  require_relative 'support/xml_loader'
3
+ require_relative 'support/models'
3
4
 
4
5
  # This file was generated by the `rspec --init` command. Conventionally, all
5
6
  # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
@@ -0,0 +1,13 @@
1
+ development:
2
+ default:
3
+ host: host.com
4
+ account_name: FILEMAKER_ACCOUNT_NAME
5
+ password: FILEMAKER_PASSWORD
6
+ ssl: { verify: false }
7
+ log: :curl
8
+
9
+ read_slave:
10
+ host: host.com
11
+ account_name: FILEMAKER_ACCOUNT_NAME
12
+ password: FILEMAKER_PASSWORD
13
+ ssl: true
@@ -0,0 +1,38 @@
1
+ Filemaker.registry['default'] = Filemaker::Server.new do |config|
2
+ config.host = 'host'
3
+ config.account_name = 'account_name'
4
+ config.password = 'password'
5
+ end
6
+
7
+ class Candidate
8
+ include Filemaker::Model
9
+ end
10
+
11
+ class User
12
+ include Filemaker::Model
13
+ end
14
+
15
+ class Post
16
+ include Filemaker::Model
17
+
18
+ string :candidate_id, :email
19
+ end
20
+
21
+ class MyModel
22
+ include Filemaker::Model
23
+
24
+ database :candidates
25
+ layout :profile
26
+
27
+ string :name, :email, default: 'UNTITLED'
28
+ string :candidate_id, fm_name: 'CA ID', identity: true
29
+ date :created_at
30
+ datetime :updated_at, fm_name: 'ModifiedDate'
31
+ money :salary
32
+ integer :age, fm_name: 'passage of time'
33
+
34
+ belongs_to :candidate
35
+ belongs_to :applicant, class_name: User, reference_key: :name
36
+ has_many :posts
37
+ has_many :posters, class_name: User, reference_key: :email
38
+ end
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.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - mech
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-28 00:00:00.000000000 Z
11
+ date: 2014-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activemodel
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: bundler
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -156,6 +170,22 @@ files:
156
170
  - lib/filemaker/error.rb
157
171
  - lib/filemaker/layout.rb
158
172
  - lib/filemaker/metadata/field.rb
173
+ - lib/filemaker/model.rb
174
+ - lib/filemaker/model/builder.rb
175
+ - lib/filemaker/model/components.rb
176
+ - lib/filemaker/model/criteria.rb
177
+ - lib/filemaker/model/field.rb
178
+ - lib/filemaker/model/fields.rb
179
+ - lib/filemaker/model/findable.rb
180
+ - lib/filemaker/model/optional.rb
181
+ - lib/filemaker/model/pagination.rb
182
+ - lib/filemaker/model/persistable.rb
183
+ - lib/filemaker/model/relations.rb
184
+ - lib/filemaker/model/relations/belongs_to.rb
185
+ - lib/filemaker/model/relations/has_many.rb
186
+ - lib/filemaker/model/relations/proxy.rb
187
+ - lib/filemaker/model/selectable.rb
188
+ - lib/filemaker/railtie.rb
159
189
  - lib/filemaker/record.rb
160
190
  - lib/filemaker/resultset.rb
161
191
  - lib/filemaker/script.rb
@@ -165,9 +195,13 @@ files:
165
195
  - lib/filemaker/store/script_store.rb
166
196
  - lib/filemaker/version.rb
167
197
  - spec/filemaker/api/query_commands/compound_find_spec.rb
198
+ - spec/filemaker/configuration_spec.rb
168
199
  - spec/filemaker/error_spec.rb
169
200
  - spec/filemaker/layout_spec.rb
170
201
  - spec/filemaker/metadata/field_spec.rb
202
+ - spec/filemaker/model/criteria_spec.rb
203
+ - spec/filemaker/model/relations_spec.rb
204
+ - spec/filemaker/model_spec.rb
171
205
  - spec/filemaker/record_spec.rb
172
206
  - spec/filemaker/resultset_spec.rb
173
207
  - spec/filemaker/server_spec.rb
@@ -175,6 +209,8 @@ files:
175
209
  - spec/filemaker/store/layout_store_spec.rb
176
210
  - spec/filemaker/store/script_store_spec.rb
177
211
  - spec/spec_helper.rb
212
+ - spec/support/filemaker.yml
213
+ - spec/support/models.rb
178
214
  - spec/support/responses/dbnames.xml
179
215
  - spec/support/responses/employment.xml
180
216
  - spec/support/responses/jobs.xml
@@ -208,9 +244,13 @@ specification_version: 4
208
244
  summary: A Ruby wrapper to FileMaker XML API.
209
245
  test_files:
210
246
  - spec/filemaker/api/query_commands/compound_find_spec.rb
247
+ - spec/filemaker/configuration_spec.rb
211
248
  - spec/filemaker/error_spec.rb
212
249
  - spec/filemaker/layout_spec.rb
213
250
  - spec/filemaker/metadata/field_spec.rb
251
+ - spec/filemaker/model/criteria_spec.rb
252
+ - spec/filemaker/model/relations_spec.rb
253
+ - spec/filemaker/model_spec.rb
214
254
  - spec/filemaker/record_spec.rb
215
255
  - spec/filemaker/resultset_spec.rb
216
256
  - spec/filemaker/server_spec.rb
@@ -218,6 +258,8 @@ test_files:
218
258
  - spec/filemaker/store/layout_store_spec.rb
219
259
  - spec/filemaker/store/script_store_spec.rb
220
260
  - spec/spec_helper.rb
261
+ - spec/support/filemaker.yml
262
+ - spec/support/models.rb
221
263
  - spec/support/responses/dbnames.xml
222
264
  - spec/support/responses/employment.xml
223
265
  - spec/support/responses/jobs.xml