layervault 0.1.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 +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +151 -0
- data/Rakefile +1 -0
- data/layervault.gemspec +29 -0
- data/lib/layervault.rb +16 -0
- data/lib/layervault/client.rb +62 -0
- data/lib/layervault/client/files.rb +64 -0
- data/lib/layervault/client/folders.rb +27 -0
- data/lib/layervault/client/organizations.rb +9 -0
- data/lib/layervault/client/projects.rb +25 -0
- data/lib/layervault/client/revisions.rb +23 -0
- data/lib/layervault/client/users.rb +9 -0
- data/lib/layervault/default_options.rb +38 -0
- data/lib/layervault/file.rb +11 -0
- data/lib/layervault/folder.rb +27 -0
- data/lib/layervault/middleware/raise_error.rb +15 -0
- data/lib/layervault/mixins/authentication.rb +7 -0
- data/lib/layervault/mixins/configurable.rb +40 -0
- data/lib/layervault/mixins/connection.rb +15 -0
- data/lib/layervault/model.rb +41 -0
- data/lib/layervault/organization.rb +19 -0
- data/lib/layervault/project.rb +28 -0
- data/lib/layervault/response/error.rb +111 -0
- data/lib/layervault/revision.rb +23 -0
- data/lib/layervault/user.rb +11 -0
- data/lib/layervault/version.rb +3 -0
- data/spec/cassettes/Files/Basic_operations/_create_file/creates_the_File.json +1 -0
- data/spec/cassettes/Files/Basic_operations/_delete_file/deletes_the_File.json +1 -0
- data/spec/cassettes/Files/Basic_operations/_file/returns_the_File_info.json +1 -0
- data/spec/cassettes/Files/_move_file/moves_the_File.json +1 -0
- data/spec/cassettes/Files/_sync_check/performs_a_sync_check_on_the_path.json +1 -0
- data/spec/cassettes/Folders/_change_folder_color/changes_the_folder_color.json +1 -0
- data/spec/cassettes/Folders/_create_folder/creates_the_Folder.json +1 -0
- data/spec/cassettes/Folders/_delete_folder/deletes_the_folder.json +1 -0
- data/spec/cassettes/Folders/_folder/returns_the_Folder_info.json +1 -0
- data/spec/cassettes/Folders/_move_folder/moves_the_folder.json +1 -0
- data/spec/cassettes/Organizations/_organization/returns_the_Organization_info.json +1 -0
- data/spec/cassettes/Projects/_change_project_folder_color/changes_the_folder_color.json +1 -0
- data/spec/cassettes/Projects/_create_project/Creates_a_new_project.json +1 -0
- data/spec/cassettes/Projects/_delete_project/Deletes_the_project.json +1 -0
- data/spec/cassettes/Projects/_move_project/Moves_the_project.json +1 -0
- data/spec/cassettes/Projects/_project/returns_the_Organization_info.json +1 -0
- data/spec/cassettes/Revisions/_meta/returns_the_Meta_info.json +1 -0
- data/spec/cassettes/Revisions/_previews/returns_the_Preview_info.json +1 -0
- data/spec/cassettes/Revisions/_revision/returns_the_Revision_info.json +1 -0
- data/spec/cassettes/Revisions/_revisions/returns_the_Revisions_info.json +1 -0
- data/spec/cassettes/Users/_me/returns_the_User_info_as_JSON.json +1 -0
- data/spec/fixtures/Test.psd +0 -0
- data/spec/fixtures/dhh.png +0 -0
- data/spec/layervault/client/files_spec.rb +58 -0
- data/spec/layervault/client/folder_spec.rb +54 -0
- data/spec/layervault/client/organizations_spec.rb +16 -0
- data/spec/layervault/client/projects_spec.rb +51 -0
- data/spec/layervault/client/revisions_spec.rb +39 -0
- data/spec/layervault/client/user_spec.rb +16 -0
- data/spec/layervault/client_spec.rb +15 -0
- data/spec/layervault/error.rb +69 -0
- data/spec/layervault_spec.rb +12 -0
- data/spec/spec.opts +5 -0
- data/spec/spec_helper.rb +72 -0
- metadata +256 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b3b3c597c5f9ea686f645318bfc78bfbfbe1e5b0
|
4
|
+
data.tar.gz: bc04212e9747011fe20fb05a8fe88948a957ff64
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6831520fc7291294398f9435fd204aa560e8fd1837681733ca7462eab46e9eb8bb7f2648e5907d313978c593700562710395dbe0a5f0aa4179fc3262e227d21c
|
7
|
+
data.tar.gz: 4292f9681e83d9369c9a0f2e6d10da1bc65394961a5f0671c38dbd9944b8d86d15ebefdf887999ed6a73dddd10be1d2bcc91fecbe236bf6ad78c9ca5bbec4656
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 John McDowall
|
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,151 @@
|
|
1
|
+
# LayerVault Ruby API Client
|
2
|
+
|
3
|
+
This is the Ruby client library that wraps the [LayerVault API](https://github.com/layervault/api). It assumes you have used another oAuth 2 library to obtain and manage a valid access token.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Put this in your Gemfile and smoke it:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'layervault'
|
11
|
+
```
|
12
|
+
|
13
|
+
Or install it:
|
14
|
+
|
15
|
+
```shell
|
16
|
+
$ gem install layervault
|
17
|
+
```
|
18
|
+
|
19
|
+
## Supported oAuth flows
|
20
|
+
|
21
|
+
Currently only [Resource Owner Credentials](https://github.com/applicake/doorkeeper/wiki/Using-Resource-Owner-Password-Credentials-flow) and [Client Credentials](https://github.com/applicake/doorkeeper/wiki/Client-Credentials-flow) are supported. Client credentials are pretty much useless as 99% of the API requires a User as context for the operations.
|
22
|
+
|
23
|
+
## Requesting an Access Token
|
24
|
+
|
25
|
+
1. Register or choose an application from https://layervault.com/oauth/applications/ and note the `client_id` and `client_secret`.
|
26
|
+
2. Plug those values into the following curl snippet, including your LayerVault username and password:
|
27
|
+
|
28
|
+
```
|
29
|
+
curl -i https://api.layervault.com/oauth/token \
|
30
|
+
-F grant_type="password" \
|
31
|
+
-F username="<username_goes_here>" \
|
32
|
+
-F password="<password_goes_here>" \
|
33
|
+
-F client_id="<client_id_goes_here>" \
|
34
|
+
-F client_secret="<client_secret_goes_here>"
|
35
|
+
```
|
36
|
+
3. You now have an access token. You can make API requests by calling via CURL like so:
|
37
|
+
|
38
|
+
```
|
39
|
+
curl -H 'Authorization: Bearer <your access token>' \
|
40
|
+
'https://api.layervault.com/api/v1/me'
|
41
|
+
```
|
42
|
+
|
43
|
+
## Initializing the Client
|
44
|
+
|
45
|
+
You can initialize the client via Environment Variables or by passing configurations options into the client when you create it, like this:
|
46
|
+
|
47
|
+
@client = LayerVault::Client.new(access_token: 'your_access_token', api_endpoint: 'your_api_endpoint')
|
48
|
+
|
49
|
+
Or you can also say:
|
50
|
+
|
51
|
+
LayerVault.client.access_token = 'access_token'
|
52
|
+
LayerVault.client.api_endpoint = 'api_endpoint'
|
53
|
+
|
54
|
+
### Environment Variables
|
55
|
+
|
56
|
+
ENV['LAYERVAULT_ACCESS_TOKEN'] - You LayerVault API access token
|
57
|
+
ENV['LAYERVAULT_API_ENDPOINT'] - The API Endpoint you wish to target calls against (defaults to `https://api.layervault.com/api/v1/`)
|
58
|
+
ENV['LAYERVAULT_USER_AGENT'] - Defaults to `LayerVault Ruby Gem #{LayerVault::VERSION}`
|
59
|
+
|
60
|
+
### The User Agent
|
61
|
+
|
62
|
+
You should set the User agent to include your email address so that in the event your client does something wrong we can contact you.
|
63
|
+
|
64
|
+
## Making API calls
|
65
|
+
|
66
|
+
You can use the `LayerVault.client.<api_operation>` methods to call the API to perform actions. Alternatively, each API object has simple object model that allows you to say:
|
67
|
+
|
68
|
+
```
|
69
|
+
LayerVault.client.access_token = 'access_token'
|
70
|
+
p = LayerVault::Organization.for('layervault')
|
71
|
+
p.create_project('my new project')
|
72
|
+
```
|
73
|
+
|
74
|
+
And so on.
|
75
|
+
|
76
|
+
### Simple Object Model
|
77
|
+
|
78
|
+
There's a very simple object model provided by classes that implement [Hashie](https://github.com/intridea/hashie) objects that wrap the JSON responses from the ```LayerVault.client``` interface. The objects mostly all follow a ```.for``` pattern that accepts the appropriate number of arguments for the level of nesting the object represents. For example,
|
79
|
+
|
80
|
+
- Organizations require the name of the organization: ```Organization.for('layervault')```
|
81
|
+
- Projects require the name of the organization and the project name: ```Project.for('layervault', 'Designer News')```
|
82
|
+
- ... and so on ...
|
83
|
+
|
84
|
+
#### Associations
|
85
|
+
|
86
|
+
When using the simple object model, associations will be hydrated into the correct child objects allowing a simple level of traversal down the object model hierarchy.
|
87
|
+
|
88
|
+
## Access Tokens
|
89
|
+
|
90
|
+
Access Tokens are valid for two hours only. When you request a token, you are also told how long the token is valid for, in seconds, as part of the token response:
|
91
|
+
|
92
|
+
{
|
93
|
+
"access_token": "aec9c670cf5e673bfedf83d055d2a2e0e5f37e52d3b41cffcf7874f73a7458bf",
|
94
|
+
"token_type": "bearer",
|
95
|
+
"expires_in": 7200,
|
96
|
+
"refresh_token": "afe9c670cf5e673bfedf83d055d2a2e0e5f37e52d3b41cffcf7874f73a7458bf",
|
97
|
+
"scope": "user"
|
98
|
+
}
|
99
|
+
|
100
|
+
Here we can see that the Token is valid for 7200 more seconds, or two hours.
|
101
|
+
|
102
|
+
The API implements [Refresh Tokens](https://github.com/applicake/doorkeeper/wiki/Enable-Refresh-Token-Credentials) which allow you to request new tokens without re-authenticating the user through the Web credentials flow. You can see in the access token response above, a refresh_token was given for use in future calls. Store it, use it.
|
103
|
+
|
104
|
+
## Omniauth Strategy
|
105
|
+
|
106
|
+
If you're looking for something that makes a Rails integration more easy, we've made an [Omniauth Authentication Strategy](https://github.com/layervault/omniauth-layervault).
|
107
|
+
|
108
|
+
## Running the test suite.
|
109
|
+
|
110
|
+
You should create a test project called ```api-playground``` in your Organization. and make sure ```TEST_ORG``` and ```TEST_PROJECT``` environment variables are set correctly in the call below:
|
111
|
+
|
112
|
+
```TEST_ORG='layervault-test' TEST_PROJECT='api-playground' LAYERVAULT_API_ENDPOINT='https://api.layervault.com/api/v1/' LAYERVAULT_ACCESS_TOKEN=<your_access_token> be rspec spec/layervault/client ```
|
113
|
+
|
114
|
+
The test suite uses VCR to save making requests against the server. You always have the option of deleting the contents of the ```spec/cassettes``` folder to make real calls against the LayerVault servers.
|
115
|
+
|
116
|
+
## Client Methods Summary
|
117
|
+
|
118
|
+
### General
|
119
|
+
- LayerVault.client.me
|
120
|
+
|
121
|
+
### Organizations
|
122
|
+
|
123
|
+
- LayerVault.client.organization( organization_name )
|
124
|
+
|
125
|
+
### Projects
|
126
|
+
- LayerVault.client.project( organization_name, project )
|
127
|
+
- LayerVault.client.create_project( organization_name, project )
|
128
|
+
- LayerVault.client.delete_project( organization_name, project )
|
129
|
+
- LayerVault.client.move_project( organization_name, project, to )
|
130
|
+
- LayerVault.client.change_project_folder_color( organization_name, project, color )
|
131
|
+
|
132
|
+
### Folders
|
133
|
+
- LayerVault.client.folder( organization_name, project, folder_path )
|
134
|
+
- LayerVault.client.create_folder( organization_name, project, folder_path )
|
135
|
+
- LayerVault.client.delete_folder( organization_name, project, folder_path )
|
136
|
+
- LayerVault.client.move_folder( organization_name, project, folder_path, new_folder )
|
137
|
+
- LayerVault.client.change_folder_color( organization_name, project, folder_path, color )
|
138
|
+
|
139
|
+
### Files
|
140
|
+
- LayerVault.client.file( organization_name, project, folder_path, file_name )
|
141
|
+
- LayerVault.client.create_file( organization_name, project, folder_path, file_name, options )
|
142
|
+
- LayerVault.client.delete_file( organization_name, project, folder_path, file_name )
|
143
|
+
- LayerVault.client.move_file( organization_name, project, folder_path, new_folder, new_filename )
|
144
|
+
- LayerVault.client.sync_check( organization_name, project, folder_path, options )
|
145
|
+
|
146
|
+
### Revisions
|
147
|
+
- LayerVault.client.revision( organization_name, project, folder_path, file_name, revision )
|
148
|
+
- LayerVault.client.previews( organization_name, project, folder_path, file_name, revision, options )
|
149
|
+
- LayerVault.client.revisions( organization_name, project, folder_path, file_name, revision, options )
|
150
|
+
- LayerVault.client.meta( organization_name, project, folder_path, file_name, revision )
|
151
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/layervault.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'layervault/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "layervault"
|
8
|
+
spec.version = LayerVault::VERSION
|
9
|
+
spec.authors = ["John McDowall", "Ryan LeFevre", "Kelly Sutton"]
|
10
|
+
spec.email = ["john@mcdowall.info", "ryan@layervault.com", "kelly@layervault.com"]
|
11
|
+
spec.description = %q{The LayerVault Ruby API client.}
|
12
|
+
spec.summary = %q{Provides Ruby native wrappers for the LayerVault API.}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
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_dependency "faraday"
|
22
|
+
spec.add_dependency "hashie"
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
spec.add_development_dependency "rspec"
|
26
|
+
spec.add_development_dependency "multi_json"
|
27
|
+
spec.add_development_dependency "vcr"
|
28
|
+
spec.add_development_dependency "webmock", "1.13"
|
29
|
+
end
|
data/lib/layervault.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require "layervault/version"
|
2
|
+
require "layervault/client"
|
3
|
+
require "layervault/mixins/configurable"
|
4
|
+
require "layervault/default_options"
|
5
|
+
|
6
|
+
module LayerVault
|
7
|
+
class << self
|
8
|
+
include LayerVault::Configurable
|
9
|
+
|
10
|
+
def client
|
11
|
+
@client ||= LayerVault::Client.new(options)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
LayerVault.setup
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'multi_json'
|
3
|
+
|
4
|
+
require 'layervault/mixins/authentication'
|
5
|
+
require 'layervault/mixins/configurable'
|
6
|
+
require 'layervault/mixins/connection'
|
7
|
+
|
8
|
+
require 'layervault/client/users'
|
9
|
+
require 'layervault/client/organizations'
|
10
|
+
require 'layervault/client/projects'
|
11
|
+
require 'layervault/client/folders'
|
12
|
+
require 'layervault/client/files'
|
13
|
+
require 'layervault/client/revisions'
|
14
|
+
|
15
|
+
require 'layervault/model'
|
16
|
+
require 'layervault/organization'
|
17
|
+
require 'layervault/user'
|
18
|
+
require 'layervault/project'
|
19
|
+
require 'layervault/folder'
|
20
|
+
require 'layervault/file'
|
21
|
+
require 'layervault/revision'
|
22
|
+
|
23
|
+
module LayerVault
|
24
|
+
|
25
|
+
class ClientParamsError < Exception ; end
|
26
|
+
|
27
|
+
class Client
|
28
|
+
include LayerVault::Authentication
|
29
|
+
include LayerVault::Configurable
|
30
|
+
include LayerVault::Connection
|
31
|
+
|
32
|
+
include LayerVault::Client::Users
|
33
|
+
include LayerVault::Client::Organizations
|
34
|
+
include LayerVault::Client::Projects
|
35
|
+
include LayerVault::Client::Folders
|
36
|
+
include LayerVault::Client::Files
|
37
|
+
include LayerVault::Client::Revisions
|
38
|
+
|
39
|
+
def initialize(options={})
|
40
|
+
LayerVault::Configurable.keys.each do |key|
|
41
|
+
instance_variable_set(:"@#{key}", options[key] || LayerVault.instance_variable_get(:"@#{key}"))
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def get(url, options = {})
|
46
|
+
request :get, url, options
|
47
|
+
end
|
48
|
+
|
49
|
+
def post(url, options = {})
|
50
|
+
request :post, url, options
|
51
|
+
end
|
52
|
+
|
53
|
+
def put(url, options = {})
|
54
|
+
request :put, url, options
|
55
|
+
end
|
56
|
+
|
57
|
+
def delete(url, options = {})
|
58
|
+
request :delete, url, options
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'multi_json'
|
2
|
+
require 'digest/md5'
|
3
|
+
require 'uri'
|
4
|
+
|
5
|
+
module LayerVault
|
6
|
+
class Client
|
7
|
+
module Files
|
8
|
+
def file(organization_name, project_name, path, file_name)
|
9
|
+
get "#{organization_name}/#{project_name}/#{path}/#{file_name}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def delete_file(organization_name, project_name, path, file_name, options={})
|
13
|
+
raise ClientParamsError.new("You must specify the md5 option of the file you are trying to delete.") unless options.fetch(:md5, nil)
|
14
|
+
delete "#{organization_name}/#{project_name}/#{path}/#{file_name}", options
|
15
|
+
end
|
16
|
+
|
17
|
+
def create_file(organization_name, project_name, path, file_name, options={} )
|
18
|
+
raise ClientParamsError.new("You must specify the local_file_path option to the file you want to upload.") unless options.fetch(:local_file_path, nil)
|
19
|
+
raise ClientParamsError.new("You must specify the content_type option to the content type of the file you are uploading.") unless options.fetch(:content_type, nil)
|
20
|
+
|
21
|
+
local_file_path = options.fetch(:local_file_path, nil)
|
22
|
+
content_type = options.fetch(:content_type, nil)
|
23
|
+
|
24
|
+
md5 = Digest::MD5.hexdigest(::File.read(local_file_path))
|
25
|
+
options = {md5: md5}
|
26
|
+
|
27
|
+
json_response = put("#{organization_name}/#{project_name}/#{path}/#{file_name}", options)
|
28
|
+
|
29
|
+
s3_response = MultiJson.decode(json_response)
|
30
|
+
s3_response.merge!( "Content-Type" => content_type)
|
31
|
+
|
32
|
+
payload = s3_response.merge({ file: Faraday::UploadIO.new(local_file_path, content_type) })
|
33
|
+
|
34
|
+
conn = Faraday.new('https://omnivore-scratch.s3.amazonaws.com') do |f|
|
35
|
+
f.request :multipart
|
36
|
+
f.request :url_encoded
|
37
|
+
f.adapter :net_http # This is what ended up making it work
|
38
|
+
end
|
39
|
+
|
40
|
+
response_from_s3 = conn.post('/', payload)
|
41
|
+
redirect = response_from_s3[:location]
|
42
|
+
|
43
|
+
# Add the access_token to the query
|
44
|
+
uri = URI.parse(redirect)
|
45
|
+
new_query_ar = URI.decode_www_form(uri.query) << ["access_token", LayerVault.client.access_token]
|
46
|
+
uri.query = URI.encode_www_form(new_query_ar)
|
47
|
+
|
48
|
+
re = conn.post( uri.to_s )
|
49
|
+
end
|
50
|
+
|
51
|
+
def move_file(organization_name, project_name, path, file_name, options={})
|
52
|
+
raise ClientParamsError.new("You must specify the new_folder option to specify the destination folder") unless options.fetch(:new_folder, nil)
|
53
|
+
raise ClientParamsError.new("You must specify the new_filename option to specify the destination folder") unless options.fetch(:new_file_name, nil)
|
54
|
+
|
55
|
+
post "#{organization_name}/#{project_name}/#{path}/#{file_name}/move", options
|
56
|
+
end
|
57
|
+
|
58
|
+
def sync_check(organization_name, project_name, path, file_name, options={})
|
59
|
+
raise ClientParamsError.new("You must specify the md5 option of the file you are trying to sync check.") unless options.fetch(:md5, nil)
|
60
|
+
get "#{organization_name}/#{project_name}/#{path}/#{file_name}/sync_check", options
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module LayerVault
|
2
|
+
class Client
|
3
|
+
module Folders
|
4
|
+
def folder(organization_name, project_name, path)
|
5
|
+
get "#{organization_name}/#{project_name}/#{path}"
|
6
|
+
end
|
7
|
+
|
8
|
+
def delete_folder(organization_name, project_name, path)
|
9
|
+
delete "#{organization_name}/#{project_name}/#{path}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_folder(organization_name, project_name, path)
|
13
|
+
post "#{organization_name}/#{project_name}/#{path}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def move_folder(organization_name, project_name, path, options={})
|
17
|
+
raise ClientParamsError.new("You must specify the :to option for the destination folder.") unless options.fetch(:to, nil)
|
18
|
+
post "#{organization_name}/#{project_name}/#{path}/move", options
|
19
|
+
end
|
20
|
+
|
21
|
+
def change_folder_color(organization_name, project_name, path, options={})
|
22
|
+
raise ClientParamsError.new("You must specify the color option for the new color to apply to the folder.") unless options.fetch(:color, nil)
|
23
|
+
put "#{organization_name}/#{project_name}/#{path}", options
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module LayerVault
|
2
|
+
class Client
|
3
|
+
module Projects
|
4
|
+
def project(organization_name, project_name)
|
5
|
+
get "#{organization_name}/#{project_name}"
|
6
|
+
end
|
7
|
+
|
8
|
+
def create_project(organization_name, project_name)
|
9
|
+
post "#{organization_name}/#{project_name}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def delete_project(organization_name, project_name)
|
13
|
+
delete "#{organization_name}/#{project_name}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def move_project(organization_name, project_name, options={})
|
17
|
+
post "#{organization_name}/#{project_name}/move", options
|
18
|
+
end
|
19
|
+
|
20
|
+
def change_project_folder_color(organization_name, project_name, options={})
|
21
|
+
put "#{organization_name}/#{project_name}", options
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|