filemaker 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +17 -0
  5. data/.travis.yml +4 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +116 -0
  9. data/Rakefile +6 -0
  10. data/diagram.png +0 -0
  11. data/filemaker.gemspec +30 -0
  12. data/lib/filemaker.rb +13 -0
  13. data/lib/filemaker/api.rb +13 -0
  14. data/lib/filemaker/api/query_commands/delete.rb +16 -0
  15. data/lib/filemaker/api/query_commands/dup.rb +22 -0
  16. data/lib/filemaker/api/query_commands/edit.rb +26 -0
  17. data/lib/filemaker/api/query_commands/find.rb +46 -0
  18. data/lib/filemaker/api/query_commands/findall.rb +34 -0
  19. data/lib/filemaker/api/query_commands/findany.rb +26 -0
  20. data/lib/filemaker/api/query_commands/findquery.rb +84 -0
  21. data/lib/filemaker/api/query_commands/new.rb +21 -0
  22. data/lib/filemaker/api/query_commands/view.rb +11 -0
  23. data/lib/filemaker/configuration.rb +28 -0
  24. data/lib/filemaker/core_ext/hash.rb +32 -0
  25. data/lib/filemaker/database.rb +29 -0
  26. data/lib/filemaker/error.rb +391 -0
  27. data/lib/filemaker/layout.rb +38 -0
  28. data/lib/filemaker/metadata/field.rb +71 -0
  29. data/lib/filemaker/record.rb +64 -0
  30. data/lib/filemaker/resultset.rb +124 -0
  31. data/lib/filemaker/script.rb +9 -0
  32. data/lib/filemaker/server.rb +197 -0
  33. data/lib/filemaker/store/database_store.rb +21 -0
  34. data/lib/filemaker/store/layout_store.rb +23 -0
  35. data/lib/filemaker/store/script_store.rb +23 -0
  36. data/lib/filemaker/version.rb +3 -0
  37. data/spec/filemaker/api/query_commands/compound_find_spec.rb +69 -0
  38. data/spec/filemaker/error_spec.rb +257 -0
  39. data/spec/filemaker/layout_spec.rb +229 -0
  40. data/spec/filemaker/metadata/field_spec.rb +62 -0
  41. data/spec/filemaker/record_spec.rb +47 -0
  42. data/spec/filemaker/resultset_spec.rb +65 -0
  43. data/spec/filemaker/server_spec.rb +106 -0
  44. data/spec/filemaker/store/database_store_spec.rb +34 -0
  45. data/spec/filemaker/store/layout_store_spec.rb +31 -0
  46. data/spec/filemaker/store/script_store_spec.rb +31 -0
  47. data/spec/spec_helper.rb +84 -0
  48. data/spec/support/responses/dbnames.xml +34 -0
  49. data/spec/support/responses/employment.xml +55 -0
  50. data/spec/support/responses/jobs.xml +199 -0
  51. data/spec/support/responses/layoutnames.xml +39 -0
  52. data/spec/support/responses/portal.xml +108 -0
  53. data/spec/support/responses/scriptnames.xml +29 -0
  54. data/spec/support/xml_loader.rb +29 -0
  55. metadata +227 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: da908ea60c24ec21422e5405e5c18e149825bb78
4
+ data.tar.gz: cf777449498d727f9c15ab765f5e610b292d0f8d
5
+ SHA512:
6
+ metadata.gz: f6d6523f795649e9f2b09cc66ce21fff013586713a677b002734ffbc03eb3d5cdec949198764361d594c896851d1c7000f58e2adb28c76293091cd37b9acc029
7
+ data.tar.gz: 2b44e3649cfce1a9fa65ce5d7264f717ede0c86f63eafd695b9370deebd14f4870d2d5eb626860317e9cd5013e7f579cfa4bf64bd81125bd3ca7c38c1a49eda0
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
@@ -0,0 +1,17 @@
1
+ AllCops:
2
+ Exclude:
3
+ - .bundle/**
4
+ - filemaker.gemspec
5
+ - lib/filemaker/error.rb
6
+
7
+ Documentation:
8
+ Enabled: false
9
+
10
+ BracesAroundHashParameters:
11
+ Enabled: false
12
+
13
+ MethodLength:
14
+ Enabled: false
15
+
16
+ LineLength:
17
+ Max: 80
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.2
4
+ script: "bundle exec rake"
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in filemaker.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 mech
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,116 @@
1
+ # Filemaker
2
+
3
+ [![Build Status](https://travis-ci.org/mech/filemaker-ruby.svg?branch=master)](https://travis-ci.org/mech/filemaker-ruby)
4
+
5
+ A Ruby wrapper to FileMaker XML API.
6
+
7
+ ![UML - just kidding](diagram.png)
8
+
9
+ ## Installation
10
+
11
+ Put this in your Gemfile and you are ready to go:
12
+
13
+ ```
14
+ gem 'filemaker'
15
+ ```
16
+
17
+ ## Initializing the Server
18
+
19
+ Ensure you have Web Publishing Engine (XML Publishing) enabled. Please turn on SSL also or credential will not be protected. Remember to also set the "Extended Privileges" to this keyword: `fmxml`.
20
+
21
+ Configuration for initializing a server:
22
+
23
+ * `host` - IP or hostname
24
+ * `ssl` - `{ verify: false }` if you are using FileMaker's unsigned certificate. You can also pass a hash which will be forwarded to Faraday directly like `ssl: { client_cert: '', client_key: '', ca_file: '', ca_path: '/path/to/certs', cert_store: '' }`. See [Setting up SSL certificates](https://github.com/lostisland/faraday/wiki/Setting-up-SSL-certificates)
25
+ * `account` - Please use `ENV` variable like `ENV['FILEMAKER_ACCOUNT']`
26
+ * `password` - Please use `ENV` variable like `ENV['FILEMAKER_PASSWORD']`
27
+
28
+ ```ruby
29
+ server = Filemaker::Server.new do |config|
30
+ config.host = 'localhost'
31
+ config.account = ENV['FILEMAKER_ACCOUNT']
32
+ config.password = ENV['FILEMAKER_PASSWORD']
33
+ config.ssl = { verify: false }
34
+ config.log = :curl
35
+ end
36
+
37
+ server.databases.all # Using -dbnames
38
+ server.database['candidates'].layouts # Using -layoutnames and -db=candidates
39
+
40
+ api = server.db['candidates'].lay['profile']
41
+ api = server.db['candidates']['profile']
42
+ api = server.database['candidates'].layout['profile']
43
+ ```
44
+
45
+ Once you are able to grab the `api`, you are golden and can make request to read/write to FileMaker API.
46
+
47
+ ## Using the API
48
+
49
+ `Filemaker::Api::QueryCommands` is the main modules to use the API.
50
+
51
+ * `api.find()` for `-find`
52
+ * `api.findany()` for `-findany`
53
+ * `api.findquery()` for `-findquery`
54
+ * `api.new()` for `-new`
55
+ * `api.edit()` for `-edit`
56
+ * `api.delete()` for `-delete`
57
+ * `api.dup()` for `-dup`
58
+ * `api.view()` for `-view`
59
+
60
+ Most API will be smart enough to reject invalid query parameters if passed in incorrectly.
61
+
62
+ ## Using Filemaker::Model
63
+
64
+ If you want ActiveModel-like access with a decent query DSL like `where`, `find`, `all`, you can include `Filemaker::Model` to your model. Your Rails form will work as well as JSON serialization.
65
+
66
+ ```ruby
67
+ class Job
68
+ include Filemaker::Model
69
+
70
+ server :default # Taken from filemaker.yml config file
71
+ database :jobs
72
+ layout :job
73
+
74
+ string :title, :requirements
75
+ datetime :created_at, :published_at
76
+
77
+ validates :title, presence: true
78
+
79
+ def as_json(options = {})
80
+ options[:except] ||= [:created_at]
81
+ super(options)
82
+ end
83
+ end
84
+ ```
85
+
86
+ ```yml
87
+ # filemaker.yml
88
+
89
+ development:
90
+ default:
91
+ host: localhost
92
+ ssl: true
93
+ ```
94
+
95
+ ## Query DSL
96
+
97
+ ## Credits
98
+
99
+ This project is heavily inspired by the following Filemaker Ruby effort and several other ORM gems.
100
+
101
+ * [Rfm](https://github.com/lardawge/rfm)
102
+ * [ginjo/rfm](https://github.com/ginjo/rfm)
103
+ * [mongoid](https://github.com/mongoid/mongoid)
104
+ * [elasticsearch-ruby](https://github.com/elasticsearch/elasticsearch-ruby)
105
+
106
+ ## Contributing
107
+
108
+ We welcome pull request with specs.
109
+
110
+ 1. Fork it ( https://github.com/mech/filemaker-ruby/fork )
111
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
112
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
113
+ 4. Push to the branch (`git push origin my-new-feature`)
114
+ 5. Create a new Pull Request
115
+
116
+ Do run `rubocop -D -f simple` before committing.
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
Binary file
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'filemaker/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'filemaker'
8
+ spec.version = Filemaker::VERSION
9
+ spec.authors = ['mech']
10
+ spec.email = ['mech@me.com']
11
+ spec.summary = 'A Ruby wrapper to FileMaker XML API.'
12
+ spec.description = 'Provides ActiveModel-like object to read and write.'
13
+ spec.homepage = ''
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_runtime_dependency 'faraday'
22
+ spec.add_runtime_dependency 'typhoeus'
23
+ spec.add_runtime_dependency 'nokogiri'
24
+
25
+ spec.add_development_dependency 'bundler', '~> 1.6'
26
+ spec.add_development_dependency 'rake', '~> 10.0'
27
+ spec.add_development_dependency 'rspec', '~> 3.0'
28
+ spec.add_development_dependency 'rubocop'
29
+ spec.add_development_dependency 'pry-byebug'
30
+ end
@@ -0,0 +1,13 @@
1
+ require 'filemaker/version'
2
+ require 'filemaker/core_ext/hash'
3
+ require 'filemaker/server'
4
+ require 'filemaker/api'
5
+ require 'filemaker/database'
6
+ require 'filemaker/store/database_store'
7
+ require 'filemaker/store/layout_store'
8
+ require 'filemaker/store/script_store'
9
+ require 'filemaker/resultset'
10
+ require 'filemaker/record'
11
+ require 'filemaker/layout'
12
+ require 'filemaker/script'
13
+ require 'filemaker/error'
@@ -0,0 +1,13 @@
1
+ Dir[File.expand_path('../api/query_commands/**/*.rb', __FILE__)].each do |lib|
2
+ require lib
3
+ end
4
+
5
+ module Filemaker
6
+ module Api
7
+ module QueryCommands; end
8
+
9
+ def self.included(base)
10
+ base.send :include, Filemaker::Api::QueryCommands
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ module Filemaker
2
+ module Api
3
+ module QueryCommands
4
+ # Delete record.
5
+ #
6
+ # -recid
7
+ # -script
8
+ # -script.param
9
+ #
10
+ def delete(id, options = {})
11
+ valid_options(options, :script)
12
+ perform_request('-delete', { '-recid' => id }, options)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,22 @@
1
+ module Filemaker
2
+ module Api
3
+ module QueryCommands
4
+ # Duplicate record.
5
+ #
6
+ # -recid
7
+ # -script
8
+ # -script.param
9
+ # -relatedsets.filter
10
+ # -relatedsets.max
11
+ #
12
+ def dup(id, options = {})
13
+ valid_options(options,
14
+ :script,
15
+ :relatedsets_filter,
16
+ :relatedsets_max)
17
+
18
+ perform_request('-dup', { '-recid' => id }, options)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,26 @@
1
+ module Filemaker
2
+ module Api
3
+ module QueryCommands
4
+ # Edit record.
5
+ #
6
+ # -recid
7
+ # -modid
8
+ # -script
9
+ # -script.param
10
+ # -relatedsets.filter
11
+ # -relatedsets.max
12
+ # -delete.related
13
+ #
14
+ def edit(id, values, options = {})
15
+ valid_options(options,
16
+ :modid,
17
+ :script,
18
+ :relatedsets_filter,
19
+ :relatedsets_max,
20
+ :delete_related)
21
+
22
+ perform_request('-edit', { '-recid' => id }.merge(values), options)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,46 @@
1
+ module Filemaker
2
+ module Api
3
+ module QueryCommands
4
+ # Find record(s).
5
+ #
6
+ # -max
7
+ # -skip
8
+ # -sortfield.[1-9]
9
+ # -sortorder.[1-9]
10
+ # -fieldname
11
+ # -fieldname.op
12
+ # -lop
13
+ # -recid
14
+ # -lay.response
15
+ # -script
16
+ # -script.param
17
+ # -script.prefind
18
+ # -script.prefind.param
19
+ # -script.presort
20
+ # -script.presort.param
21
+ # -relatedsets.filter
22
+ # -relatedsets.max
23
+ #
24
+ def find(id_or_hash, options = {})
25
+ valid_options(options,
26
+ :max,
27
+ :skip,
28
+ :sortfield,
29
+ :sortorder,
30
+ :lop,
31
+ :lay_response,
32
+ :script,
33
+ :script_prefind,
34
+ :script_presort,
35
+ :relatedsets_filter,
36
+ :relatedsets_max)
37
+
38
+ if id_or_hash.is_a? Hash
39
+ perform_request('-find', id_or_hash, options)
40
+ else
41
+ perform_request('-find', { '-recid' => id_or_hash }, options)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,34 @@
1
+ module Filemaker
2
+ module Api
3
+ module QueryCommands
4
+ # Find all records.
5
+ # Sorting may be slow for huge records.
6
+ #
7
+ # Acceptable params are:
8
+ # -max
9
+ # -skip
10
+ # -sortfield.[1-9]
11
+ # -sortorder.[1-9]
12
+ # -script
13
+ # -script.param
14
+ # -script.prefind
15
+ # -script.prefind.param
16
+ # -script.presort
17
+ # -script.presort.param
18
+ # -relatedsets.filter
19
+ #
20
+ def findall(options = {})
21
+ valid_options(options,
22
+ :max,
23
+ :skip,
24
+ :sortfield,
25
+ :sortorder,
26
+ :script,
27
+ :script_prefind,
28
+ :relatedsets_filter)
29
+
30
+ perform_request('-findall', {}, options)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,26 @@
1
+ module Filemaker
2
+ module Api
3
+ module QueryCommands
4
+ # Find a random record.
5
+ #
6
+ # If data cannot be coerced, it will crash!
7
+ # Acceptable params are:
8
+ # -script
9
+ # -script.param
10
+ # -script.prefind
11
+ # -script.prefind.param
12
+ # -relatedsets.filter
13
+ # -relatedsets.max
14
+ #
15
+ def findany(options = {})
16
+ valid_options(options,
17
+ :script,
18
+ :script_prefind,
19
+ :relatedsets_filter,
20
+ :relatedsets_max)
21
+
22
+ perform_request('-findany', {}, options)
23
+ end
24
+ end
25
+ end
26
+ end