fulcrum 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +123 -0
- data/Rakefile +8 -0
- data/fulcrum.gemspec +27 -0
- data/lib/fulcrum.rb +13 -0
- data/lib/fulcrum/api.rb +95 -0
- data/lib/fulcrum/choice_list.rb +38 -0
- data/lib/fulcrum/classification_set.rb +39 -0
- data/lib/fulcrum/form.rb +39 -0
- data/lib/fulcrum/member.rb +16 -0
- data/lib/fulcrum/photo.rb +36 -0
- data/lib/fulcrum/record.rb +38 -0
- data/lib/fulcrum/validators/base_validator.rb +31 -0
- data/lib/fulcrum/validators/choice_list_validator.rb +30 -0
- data/lib/fulcrum/validators/classification_set_validator.rb +38 -0
- data/lib/fulcrum/validators/form_validator.rb +150 -0
- data/lib/fulcrum/validators/record_validator.rb +18 -0
- data/lib/fulcrum/version.rb +3 -0
- data/spec/data/form_data.json +175 -0
- data/spec/data/test.jpg +0 -0
- data/spec/lib/api_spec.rb +39 -0
- data/spec/lib/choice_list_spec.rb +120 -0
- data/spec/lib/classification_set_spec.rb +119 -0
- data/spec/lib/form_spec.rb +120 -0
- data/spec/lib/member_spec.rb +52 -0
- data/spec/lib/photo_spec.rb +94 -0
- data/spec/lib/record_spec.rb +120 -0
- data/spec/lib/validators/choice_list_validator_spec.rb +73 -0
- data/spec/lib/validators/classification_set_validator_spec.rb +88 -0
- data/spec/lib/validators/form_validator_spec.rb +4 -0
- data/spec/lib/validators/record_validator_spec.rb +53 -0
- data/spec/spec_helper.rb +5 -0
- metadata +182 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use ruby-1.9.3@fulcrum_api
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Chris Hall
|
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.
|
data/README.md
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
# Fulcrum
|
2
|
+
|
3
|
+
Fulcrum API Gem
|
4
|
+
|
5
|
+
## Requirements
|
6
|
+
|
7
|
+
ruby 1.9.x
|
8
|
+
a [fulcrum user account](http://web.fulcrumapp.com)
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
Add this line to your application's Gemfile:
|
13
|
+
|
14
|
+
gem 'fulcrum'
|
15
|
+
|
16
|
+
And then execute:
|
17
|
+
|
18
|
+
$ bundle
|
19
|
+
|
20
|
+
Or install it yourself as:
|
21
|
+
|
22
|
+
$ gem install fulcrum
|
23
|
+
|
24
|
+
## Configuration
|
25
|
+
|
26
|
+
Fulcrum::Api.configure do |config|
|
27
|
+
config.uri = 'http://web.fulcrumapp.com/api/v2'
|
28
|
+
config.key = 'your_api_key'
|
29
|
+
end
|
30
|
+
|
31
|
+
## Forms
|
32
|
+
|
33
|
+
Fulcrum::Form.all(opts)
|
34
|
+
# opts = { 'page' => page_number, 'schema' => true_or_false }
|
35
|
+
|
36
|
+
Fulcrum::Form.find(id, opts)
|
37
|
+
# opts = { 'include_foreign_elements' => true_or_false }
|
38
|
+
|
39
|
+
Fulcrum::Form.create(form)
|
40
|
+
# form = { 'form' => { ... } }
|
41
|
+
|
42
|
+
Fulcrum::Form.update(id, form)
|
43
|
+
# form = { 'form' => { ... } }
|
44
|
+
|
45
|
+
Fulcrum::Form.delete(id)
|
46
|
+
|
47
|
+
## Records
|
48
|
+
|
49
|
+
Fulcrum::Record.all(opts)
|
50
|
+
# opts = { 'page' => page_number,
|
51
|
+
# 'form_id' => form_id,
|
52
|
+
# 'bounding_box' => 'lat_bottom,lng_left,lat_top,lng_right',
|
53
|
+
# 'updated_since' => date_since_epoch_in_seconds }
|
54
|
+
|
55
|
+
Fulcrum::Record.find(id)
|
56
|
+
Fulcrum::Record.create(record)
|
57
|
+
# record = { 'record' => { ... } }
|
58
|
+
|
59
|
+
Fulcrum::Record.update(id, record)
|
60
|
+
# record = { 'record' => { ... } }
|
61
|
+
|
62
|
+
Fulcrum::Record.delete(id)
|
63
|
+
|
64
|
+
## Photos
|
65
|
+
|
66
|
+
Fulcrum::Photo.find(access_key, opts)
|
67
|
+
# opts = { 'format' => 'json|image' }
|
68
|
+
|
69
|
+
Fulcrum::Photo.thumbnail(access_key, opts)
|
70
|
+
# opts = { 'format' => 'json|image' }
|
71
|
+
|
72
|
+
Fulcrum::Photo.create(photo, content_type, unique_id, label)
|
73
|
+
|
74
|
+
Fulcrum::Photo.delete(access_key)
|
75
|
+
|
76
|
+
## Choice Lists
|
77
|
+
|
78
|
+
Fulcrum::ChoiceList.all(opts)
|
79
|
+
# opts = { 'page' => page_number }
|
80
|
+
|
81
|
+
Fulcrum::ChoiceList.find(id)
|
82
|
+
|
83
|
+
Fulcrum::ChoiceList.create(choice_list)
|
84
|
+
# choice_list = { 'choice_list' => { ... } }
|
85
|
+
|
86
|
+
Fulcrum::ChoiceList.update(id, choice_list)
|
87
|
+
# choice_list = { 'choice_list' => { ... } }
|
88
|
+
|
89
|
+
Fulcrum::ChoiceList.delete(id)
|
90
|
+
|
91
|
+
## Classification Sets
|
92
|
+
|
93
|
+
Fulcrum::ClassificationSet.all(opts)
|
94
|
+
# opts = { 'page' => page_number }
|
95
|
+
|
96
|
+
Fulcrum::ClassificationSet.find(id)
|
97
|
+
|
98
|
+
Fulcrum::ClassificationSet.create(classification_set)
|
99
|
+
# classification_set = { 'classification_set' => { ... } }
|
100
|
+
|
101
|
+
Fulcrum::ClassificationSet.update(id, classification_set)
|
102
|
+
# classification_set = { 'classification_set' => { ... } }
|
103
|
+
|
104
|
+
Fulcrum::ClassificationSet.delete(id)
|
105
|
+
|
106
|
+
## Members
|
107
|
+
|
108
|
+
Fulcrum::Member.all(opts)
|
109
|
+
# opts = { 'page' => page_number }
|
110
|
+
|
111
|
+
Fulcrum::Member.find(id)
|
112
|
+
|
113
|
+
## Extra Reading
|
114
|
+
|
115
|
+
[Fulcrum API docs](http://developer.fulcrumapp.com/api/fulcrum-api.html)
|
116
|
+
|
117
|
+
## Contributing
|
118
|
+
|
119
|
+
1. Fork it
|
120
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
121
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
122
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
123
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/fulcrum.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/fulcrum/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Chris Hall"]
|
6
|
+
gem.email = ["chris@spatialnetworks.com"]
|
7
|
+
gem.description = %q{Fulcrum API Gem}
|
8
|
+
gem.summary = %q{Fulcrum API Gem}
|
9
|
+
gem.homepage = "http://docs.fulcrumapp.com/"
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "fulcrum"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Fulcrum::VERSION
|
17
|
+
|
18
|
+
gem.add_development_dependency 'rake'
|
19
|
+
gem.add_development_dependency 'rspec'
|
20
|
+
gem.add_development_dependency 'webmock'
|
21
|
+
gem.add_development_dependency 'debugger'
|
22
|
+
|
23
|
+
gem.add_dependency 'activesupport'
|
24
|
+
gem.add_dependency 'faraday'
|
25
|
+
gem.add_dependency 'hashie'
|
26
|
+
gem.add_dependency 'faraday_middleware'
|
27
|
+
end
|
data/lib/fulcrum.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require "fulcrum/version"
|
2
|
+
require "fulcrum/api"
|
3
|
+
require "fulcrum/form"
|
4
|
+
require "fulcrum/record"
|
5
|
+
require "fulcrum/choice_list"
|
6
|
+
require "fulcrum/classification_set"
|
7
|
+
require "fulcrum/member"
|
8
|
+
require "fulcrum/photo"
|
9
|
+
require "fulcrum/validators/base_validator"
|
10
|
+
require "fulcrum/validators/form_validator"
|
11
|
+
require "fulcrum/validators/record_validator"
|
12
|
+
require "fulcrum/validators/choice_list_validator"
|
13
|
+
require "fulcrum/validators/classification_set_validator"
|
data/lib/fulcrum/api.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
3
|
+
|
4
|
+
module Fulcrum
|
5
|
+
|
6
|
+
class ApiError < Faraday::Error::ClientError; end
|
7
|
+
class ConnectionError < StandardError; end
|
8
|
+
|
9
|
+
class Api
|
10
|
+
|
11
|
+
VALID_METHODS = [:get, :post, :put, :delete]
|
12
|
+
|
13
|
+
attr :connection
|
14
|
+
attr :response
|
15
|
+
attr_writer :configuration
|
16
|
+
|
17
|
+
class << self
|
18
|
+
|
19
|
+
def key
|
20
|
+
@configuration.key
|
21
|
+
end
|
22
|
+
|
23
|
+
def uri
|
24
|
+
@configuration.uri
|
25
|
+
end
|
26
|
+
|
27
|
+
def response
|
28
|
+
@response
|
29
|
+
end
|
30
|
+
|
31
|
+
def parse_opts(keys = [], opts = {})
|
32
|
+
opts = opts.with_indifferent_access
|
33
|
+
{}.tap do |p|
|
34
|
+
keys.each { |key| p[key.to_sym] = opts[key] if opts.has_key?(key) }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def call(method = :get, path = '', params = {})
|
39
|
+
raise ArgumentError, "Invalid method: #{method.to_s}" unless VALID_METHODS.include?(method.to_sym)
|
40
|
+
@response = connection.send(method.to_sym, path, params)
|
41
|
+
@response.body
|
42
|
+
rescue Faraday::Error::ClientError => e
|
43
|
+
@response = e.response
|
44
|
+
{ error: { status: @response[:status], message: @response[:body] } }
|
45
|
+
end
|
46
|
+
|
47
|
+
def configure
|
48
|
+
yield(configuration)
|
49
|
+
end
|
50
|
+
|
51
|
+
def configuration
|
52
|
+
@configuration ||= Configuration.new
|
53
|
+
end
|
54
|
+
|
55
|
+
def connection
|
56
|
+
if !@connection
|
57
|
+
@connection = Faraday.new(Fulcrum::Api.configuration.uri) do |b|
|
58
|
+
b.request :multipart
|
59
|
+
b.request :json
|
60
|
+
b.response :raise_error
|
61
|
+
b.response :json , :content_type => 'application/json'
|
62
|
+
b.adapter Faraday.default_adapter
|
63
|
+
end
|
64
|
+
@connection.headers['X-ApiToken'] = Fulcrum::Api.configuration.key
|
65
|
+
@connection.headers['User-Agent'] = "Ruby Fulcrum API Client, Version #{Fulcrum::VERSION}"
|
66
|
+
end
|
67
|
+
@connection
|
68
|
+
end
|
69
|
+
|
70
|
+
def get_key(username, password)
|
71
|
+
conn = Faraday.new(uri) do |b|
|
72
|
+
b.request :url_encoded
|
73
|
+
b.response :raise_error
|
74
|
+
b.response :json, :content_type => "application/json"
|
75
|
+
b.adapter Faraday.default_adapter
|
76
|
+
end
|
77
|
+
|
78
|
+
conn.headers['User-Agent'] = "Ruby Fulcrum API Client version #{Fulcrum::VERSION}"
|
79
|
+
conn.basic_auth(username, password)
|
80
|
+
resp = conn.get('users.json')
|
81
|
+
body = JSON.parse(resp.body)
|
82
|
+
if body['user']
|
83
|
+
body['user']['api_token']
|
84
|
+
else
|
85
|
+
nil
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
class Configuration
|
91
|
+
attr_accessor :uri
|
92
|
+
attr_accessor :key
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Fulcrum
|
2
|
+
class ChoiceList < Api
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def all(opts = {})
|
7
|
+
params = parse_opts([:page], opts)
|
8
|
+
call(:get, 'choice_lists.json', params)
|
9
|
+
end
|
10
|
+
|
11
|
+
def find(id)
|
12
|
+
call(:get, "choice_lists/#{id}.json")
|
13
|
+
end
|
14
|
+
|
15
|
+
def create(choice_list)
|
16
|
+
validation = ChoiceListValidator.new(choice_list)
|
17
|
+
if validation.valid?
|
18
|
+
call(:post, 'choice_lists.json', choice_list)
|
19
|
+
else
|
20
|
+
{ error: { validation: validation.errors } }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def update(id, choice_list)
|
25
|
+
validation = ChoiceListValidator.new(choice_list)
|
26
|
+
if validation.valid?
|
27
|
+
call(:put, "choice_lists/#{id}.json", choice_list)
|
28
|
+
else
|
29
|
+
{ error: { validation: validation.errors } }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete(id)
|
34
|
+
call(:delete, "choice_lists/#{id}.json")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Fulcrum
|
2
|
+
class ClassificationSet < Api
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def all(opts = {})
|
7
|
+
params = parse_opts([:page], opts)
|
8
|
+
call(:get, 'classification_sets.json', params)
|
9
|
+
end
|
10
|
+
|
11
|
+
def find(id)
|
12
|
+
call(:get, "classification_sets/#{id}.json")
|
13
|
+
end
|
14
|
+
|
15
|
+
def create(classification_set)
|
16
|
+
validation = ClassificationSetValidator.new(classification_set)
|
17
|
+
if validation.valid?
|
18
|
+
call(:post, 'classification_sets.json', classification_set)
|
19
|
+
else
|
20
|
+
{ error: { validation: validation.errors } }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def update(id, classification_set)
|
25
|
+
validation = ClassificationSetValidator.new(classification_set)
|
26
|
+
if validation.valid?
|
27
|
+
call(:put, "classification_sets/#{id}.json", classification_set)
|
28
|
+
else
|
29
|
+
{ error: { validation: validation.errors } }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete(id)
|
34
|
+
call(:delete, "classification_sets/#{id}.json")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
data/lib/fulcrum/form.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
module Fulcrum
|
2
|
+
class Form < Api
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def all(opts = {})
|
7
|
+
params = self.parse_opts([:page, :schema], opts)
|
8
|
+
self.call(:get, 'forms.json', params)
|
9
|
+
end
|
10
|
+
|
11
|
+
def find(id, opts = {})
|
12
|
+
params = parse_opts([:include_foreign_elements], opts)
|
13
|
+
call(:get, "forms/#{id}.json", params)
|
14
|
+
end
|
15
|
+
|
16
|
+
def create(form)
|
17
|
+
validation = FormValidator.new(form)
|
18
|
+
if validation.valid?
|
19
|
+
call(:post, "forms.json", form)
|
20
|
+
else
|
21
|
+
{ error: { validation: validation.errors } }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def update(id, form)
|
26
|
+
validation = FormValidator.new(form)
|
27
|
+
if validation.valid?
|
28
|
+
call(:put, "forms/#{id}.json", form)
|
29
|
+
else
|
30
|
+
{ error: { validation: validation.errors } }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def delete(id)
|
35
|
+
call(:delete, "forms/#{id}.json")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|