fulcrum 0.1.6 → 0.2.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.
- checksums.yaml +8 -8
- data/LICENSE +2 -2
- data/README.md +189 -70
- data/Rakefile +5 -0
- data/fulcrum.gemspec +2 -3
- data/lib/fulcrum.rb +22 -14
- data/lib/fulcrum/actions/create.rb +15 -0
- data/lib/fulcrum/actions/delete.rb +12 -0
- data/lib/fulcrum/actions/find.rb +11 -0
- data/lib/fulcrum/actions/list.rb +19 -0
- data/lib/fulcrum/actions/update.rb +11 -0
- data/lib/fulcrum/changeset.rb +12 -0
- data/lib/fulcrum/choice_list.rb +6 -35
- data/lib/fulcrum/classification_set.rb +6 -36
- data/lib/fulcrum/client.rb +120 -0
- data/lib/fulcrum/form.rb +6 -35
- data/lib/fulcrum/layer.rb +6 -0
- data/lib/fulcrum/media_resource.rb +47 -0
- data/lib/fulcrum/membership.rb +5 -0
- data/lib/fulcrum/page.rb +17 -0
- data/lib/fulcrum/photo.rb +9 -29
- data/lib/fulcrum/project.rb +3 -9
- data/lib/fulcrum/record.rb +6 -35
- data/lib/fulcrum/resource.rb +40 -0
- data/lib/fulcrum/signature.rb +15 -0
- data/lib/fulcrum/version.rb +1 -1
- data/lib/fulcrum/video.rb +23 -0
- data/spec/client_helper.rb +9 -0
- data/spec/data/test.jpg +0 -0
- data/spec/data/test.mp4 +0 -0
- data/spec/data/test.png +0 -0
- data/spec/lib/choice_list_spec.rb +10 -115
- data/spec/lib/classification_set_spec.rb +11 -114
- data/spec/lib/client_spec.rb +9 -0
- data/spec/lib/form_spec.rb +10 -111
- data/spec/lib/layer_spec.rb +13 -0
- data/spec/lib/membership_spec.rb +12 -0
- data/spec/lib/photo_spec.rb +9 -88
- data/spec/lib/project_spec.rb +7 -23
- data/spec/lib/record_spec.rb +10 -115
- data/spec/lib/signature_spec.rb +16 -0
- data/spec/lib/video_spec.rb +16 -0
- data/spec/resource_examples.rb +147 -0
- data/spec/spec_helper.rb +2 -0
- metadata +37 -41
- data/.rvmrc +0 -1
- data/lib/fulcrum/api.rb +0 -99
- data/lib/fulcrum/member.rb +0 -16
- data/lib/fulcrum/validators/base_validator.rb +0 -31
- data/lib/fulcrum/validators/choice_list_validator.rb +0 -30
- data/lib/fulcrum/validators/classification_set_validator.rb +0 -38
- data/lib/fulcrum/validators/form_validator.rb +0 -150
- data/lib/fulcrum/validators/record_validator.rb +0 -18
- data/spec/data/form_data.json +0 -175
- data/spec/lib/api_spec.rb +0 -42
- data/spec/lib/member_spec.rb +0 -52
- data/spec/lib/validators/choice_list_validator_spec.rb +0 -73
- data/spec/lib/validators/classification_set_validator_spec.rb +0 -88
- data/spec/lib/validators/form_validator_spec.rb +0 -4
- data/spec/lib/validators/record_validator_spec.rb +0 -53
@@ -0,0 +1,19 @@
|
|
1
|
+
module Fulcrum
|
2
|
+
module Actions
|
3
|
+
module List
|
4
|
+
DEFAULT_PER_PAGE = 250
|
5
|
+
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
def default_list_params
|
9
|
+
{ per_page: DEFAULT_PER_PAGE }
|
10
|
+
end
|
11
|
+
|
12
|
+
def all(params = default_list_params)
|
13
|
+
result = call(:get, collection, default_list_params.merge(params))
|
14
|
+
|
15
|
+
Page.new(result, resources_name)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Fulcrum
|
2
|
+
class Changeset < Resource
|
3
|
+
include Actions::List
|
4
|
+
include Actions::Find
|
5
|
+
include Actions::Create
|
6
|
+
include Actions::Update
|
7
|
+
|
8
|
+
def close(id, object={})
|
9
|
+
call(:put, member_action(id, 'close'), attributes_for_object(object))[resource_name]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/fulcrum/choice_list.rb
CHANGED
@@ -1,38 +1,9 @@
|
|
1
1
|
module Fulcrum
|
2
|
-
class ChoiceList <
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
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
|
2
|
+
class ChoiceList < Resource
|
3
|
+
include Actions::List
|
4
|
+
include Actions::Find
|
5
|
+
include Actions::Create
|
6
|
+
include Actions::Update
|
7
|
+
include Actions::Delete
|
37
8
|
end
|
38
9
|
end
|
@@ -1,39 +1,9 @@
|
|
1
1
|
module Fulcrum
|
2
|
-
class ClassificationSet <
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
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
|
-
|
2
|
+
class ClassificationSet < Resource
|
3
|
+
include Actions::List
|
4
|
+
include Actions::Find
|
5
|
+
include Actions::Create
|
6
|
+
include Actions::Update
|
7
|
+
include Actions::Delete
|
38
8
|
end
|
39
9
|
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
3
|
+
|
4
|
+
module Fulcrum
|
5
|
+
|
6
|
+
class Client
|
7
|
+
|
8
|
+
DEFAULT_URL = 'https://api.fulcrumapp.com/api/v2'
|
9
|
+
|
10
|
+
DEFAULT_USER_AGENT = "Fulcrum Ruby API Client, Version #{Fulcrum::VERSION}"
|
11
|
+
|
12
|
+
attr_accessor :connection
|
13
|
+
attr_accessor :response
|
14
|
+
attr_accessor :key
|
15
|
+
attr_accessor :url
|
16
|
+
|
17
|
+
def initialize(key = nil, url = nil)
|
18
|
+
self.key = key
|
19
|
+
self.url = url || DEFAULT_URL
|
20
|
+
end
|
21
|
+
|
22
|
+
def key=(key)
|
23
|
+
@key = key
|
24
|
+
reset
|
25
|
+
end
|
26
|
+
|
27
|
+
def url=(url)
|
28
|
+
@url = url
|
29
|
+
reset
|
30
|
+
end
|
31
|
+
|
32
|
+
def reset
|
33
|
+
@response = nil
|
34
|
+
@connection = nil
|
35
|
+
end
|
36
|
+
|
37
|
+
def call(method = :get, path = '', params = {})
|
38
|
+
@response = connection.send(method.to_sym, path, params.with_indifferent_access)
|
39
|
+
@response.body
|
40
|
+
end
|
41
|
+
|
42
|
+
def connection
|
43
|
+
@connection ||= self.class.create_connection(url, key)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.authenticate(username, password, url=DEFAULT_URL)
|
47
|
+
connection = create_connection(url)
|
48
|
+
|
49
|
+
connection.basic_auth(username, password)
|
50
|
+
|
51
|
+
resp = connection.get('users.json')
|
52
|
+
|
53
|
+
resp.body['user']['contexts'].map do |context|
|
54
|
+
{ id: context['id'],
|
55
|
+
name: context['name'],
|
56
|
+
token: context['api_token'] }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.create_connection(url, key = nil)
|
61
|
+
Faraday.new(url) do |connection|
|
62
|
+
connection.request :multipart
|
63
|
+
connection.request :json
|
64
|
+
|
65
|
+
connection.response :raise_error
|
66
|
+
connection.response :json, content_type: 'application/json'
|
67
|
+
|
68
|
+
connection.adapter Faraday.default_adapter
|
69
|
+
|
70
|
+
connection.headers['X-ApiToken'] = key if key
|
71
|
+
connection.headers['X-Require-Media'] = 'false'
|
72
|
+
connection.headers['User-Agent'] = DEFAULT_USER_AGENT
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def choice_lists
|
77
|
+
@choice_lists ||= Fulcrum::ChoiceList.new(self)
|
78
|
+
end
|
79
|
+
|
80
|
+
def classification_sets
|
81
|
+
@classification_sets ||= Fulcrum::ClassificationSet.new(self)
|
82
|
+
end
|
83
|
+
|
84
|
+
def forms
|
85
|
+
@forms ||= Fulcrum::Form.new(self)
|
86
|
+
end
|
87
|
+
|
88
|
+
def photos
|
89
|
+
@photos ||= Fulcrum::Photo.new(self)
|
90
|
+
end
|
91
|
+
|
92
|
+
def videos
|
93
|
+
@videos ||= Fulcrum::Video.new(self)
|
94
|
+
end
|
95
|
+
|
96
|
+
def signatures
|
97
|
+
@signatures ||= Fulcrum::Signature.new(self)
|
98
|
+
end
|
99
|
+
|
100
|
+
def projects
|
101
|
+
@projects ||= Fulcrum::Project.new(self)
|
102
|
+
end
|
103
|
+
|
104
|
+
def records
|
105
|
+
@records ||= Fulcrum::Record.new(self)
|
106
|
+
end
|
107
|
+
|
108
|
+
def memberships
|
109
|
+
@memberships ||= Fulcrum::Membership.new(self)
|
110
|
+
end
|
111
|
+
|
112
|
+
def layers
|
113
|
+
@layers ||= Fulcrum::Layer.new(self)
|
114
|
+
end
|
115
|
+
|
116
|
+
def changesets
|
117
|
+
@changesets ||= Fulcrum::Changeset.new(self)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
data/lib/fulcrum/form.rb
CHANGED
@@ -1,38 +1,9 @@
|
|
1
1
|
module Fulcrum
|
2
|
-
class Form <
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
end
|
9
|
-
|
10
|
-
def find(id, opts = {})
|
11
|
-
params = parse_opts([:include_foreign_elements], opts)
|
12
|
-
call(:get, "forms/#{id}.json", params)
|
13
|
-
end
|
14
|
-
|
15
|
-
def create(form)
|
16
|
-
validation = FormValidator.new(form)
|
17
|
-
if validation.valid?
|
18
|
-
call(:post, "forms.json", form)
|
19
|
-
else
|
20
|
-
{ error: { validation: validation.errors } }
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def update(id, form)
|
25
|
-
validation = FormValidator.new(form)
|
26
|
-
if validation.valid?
|
27
|
-
call(:put, "forms/#{id}.json", form)
|
28
|
-
else
|
29
|
-
{ error: { validation: validation.errors } }
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def delete(id)
|
34
|
-
call(:delete, "forms/#{id}.json")
|
35
|
-
end
|
36
|
-
end
|
2
|
+
class Form < Resource
|
3
|
+
include Actions::List
|
4
|
+
include Actions::Find
|
5
|
+
include Actions::Create
|
6
|
+
include Actions::Update
|
7
|
+
include Actions::Delete
|
37
8
|
end
|
38
9
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
|
3
|
+
module Fulcrum
|
4
|
+
class MediaResource < Resource
|
5
|
+
include Actions::List
|
6
|
+
include Actions::Find
|
7
|
+
include Actions::Create
|
8
|
+
|
9
|
+
def default_content_type
|
10
|
+
raise NotImplementedError,
|
11
|
+
'default_content_type must be implemented in derived classes'
|
12
|
+
end
|
13
|
+
|
14
|
+
def attributes_for_upload(file, content_type = nil, attributes = {})
|
15
|
+
attributes ||= {}
|
16
|
+
|
17
|
+
file = Faraday::UploadIO.new(file, content_type || default_content_type)
|
18
|
+
|
19
|
+
attributes[:file] = file
|
20
|
+
attributes[:access_key] ||= new_access_key
|
21
|
+
|
22
|
+
media_attributes = {}
|
23
|
+
media_attributes[resource_name] = attributes
|
24
|
+
media_attributes
|
25
|
+
end
|
26
|
+
|
27
|
+
def create(file, content_type = nil, attrs = {})
|
28
|
+
call(:post, create_action, attributes_for_upload(file, content_type, attrs))
|
29
|
+
end
|
30
|
+
|
31
|
+
def download(url, &blk)
|
32
|
+
open(url, "rb", &blk)
|
33
|
+
end
|
34
|
+
|
35
|
+
def download_version(access_key, version, &blk)
|
36
|
+
download(find(access_key)[version], &blk)
|
37
|
+
end
|
38
|
+
|
39
|
+
def original(access_key, &blk)
|
40
|
+
download_version(access_key, 'original', &blk)
|
41
|
+
end
|
42
|
+
|
43
|
+
def new_access_key
|
44
|
+
SecureRandom.uuid
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/fulcrum/page.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Fulcrum
|
2
|
+
class Page
|
3
|
+
attr_accessor :objects
|
4
|
+
attr_accessor :current_page
|
5
|
+
attr_accessor :total_pages
|
6
|
+
attr_accessor :total_count
|
7
|
+
attr_accessor :per_page
|
8
|
+
|
9
|
+
def initialize(data, resources_name)
|
10
|
+
self.objects = data[resources_name]
|
11
|
+
self.current_page = data['current_page']
|
12
|
+
self.total_pages = data['total_pages']
|
13
|
+
self.total_count = data['total_count']
|
14
|
+
self.per_page = data['per_page']
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/fulcrum/photo.rb
CHANGED
@@ -1,35 +1,15 @@
|
|
1
1
|
module Fulcrum
|
2
|
-
class Photo <
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
class << self
|
7
|
-
|
8
|
-
def find(id, opts = {})
|
9
|
-
format = image_opts(opts)
|
10
|
-
call(:get, "photos/#{id}.#{format}")
|
11
|
-
end
|
12
|
-
|
13
|
-
def thumbnail(id, opts = {})
|
14
|
-
format = image_opts(opts)
|
15
|
-
call(:get, "photos/#{id}/thumbnail.#{format}")
|
16
|
-
end
|
17
|
-
|
18
|
-
def create(file, content_type, id, label = '')
|
19
|
-
photo = Faraday::UploadIO.new(file, content_type)
|
20
|
-
call(:post, 'photos.json', { photo: { file: photo, access_key: id, label: label}})
|
21
|
-
end
|
2
|
+
class Photo < MediaResource
|
3
|
+
def default_content_type
|
4
|
+
'image/jpeg'
|
5
|
+
end
|
22
6
|
|
23
|
-
|
24
|
-
|
25
|
-
|
7
|
+
def large(id, &blk)
|
8
|
+
download_version(id, 'large', &blk)
|
9
|
+
end
|
26
10
|
|
27
|
-
|
28
|
-
|
29
|
-
format = opts.delete(:format) || 'json'
|
30
|
-
raise ArgumentError, "#{format} is not an allowed format, use either 'json' or 'jpg'" unless ALLOWED_FORMATS.include?(format)
|
31
|
-
format
|
32
|
-
end
|
11
|
+
def thumbnail(id, &blk)
|
12
|
+
download_version(id, 'thumbnail', &blk)
|
33
13
|
end
|
34
14
|
end
|
35
15
|
end
|