frameio-api 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +101 -0
- data/Rakefile +3 -0
- data/lib/frame_io/account.rb +17 -0
- data/lib/frame_io/active_record_extension.rb +8 -0
- data/lib/frame_io/asset.rb +23 -0
- data/lib/frame_io/client.rb +90 -0
- data/lib/frame_io/collaborator.rb +7 -0
- data/lib/frame_io/custom_action.rb +11 -0
- data/lib/frame_io/project.rb +31 -0
- data/lib/frame_io/railtie.rb +4 -0
- data/lib/frame_io/team.rb +23 -0
- data/lib/frame_io/user.rb +7 -0
- data/lib/frame_io/version.rb +3 -0
- data/lib/frame_io.rb +47 -0
- data/lib/tasks/frame_io_tasks.rake +4 -0
- metadata +90 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: '0901a5840882914621de78e0c9e36bbff287aca801994e5b88201b96ecf31683'
|
4
|
+
data.tar.gz: 5223091ad97b2e6b46220e98d3b476e4b71351840b6b29de00dd5795306f474b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6f4eca7dc8eb1cd7c2b8ddab1093412e37d7c8fbcee759513b00feac7367e45c957d215d4116e921438bf98ce30193b25b9db0b3fa2dda848ff6d5278249c836
|
7
|
+
data.tar.gz: 631a196ecd6d488ebf56f085b414783c07fda7bc4b6c44751897b2f85903e0a06d34868b90f225ae1ec56df574ee2468e8b08a01f85e17d786f454ba612852bb
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright Victor Holl
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
# FrameIo
|
2
|
+
Very basic (and wip) Frame.io API wrapper
|
3
|
+
Only OAuth2 authentification available at the moment.
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem "frame_io"
|
12
|
+
```
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
```bash
|
16
|
+
$ bundle
|
17
|
+
```
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
```bash
|
21
|
+
$ gem install frame_io
|
22
|
+
```
|
23
|
+
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
This gem uses and bundles [omniauth-frameio](https://github.com/boxprod/omniauth-frameio)
|
27
|
+
|
28
|
+
### Omniauth configuration:
|
29
|
+
|
30
|
+
This Strategy is meant to be used with [Omniauth](https://github.com/omniauth/omniauth) and has been tested and used with [Devise](https://github.com/heartcombo/devise#omniauth)
|
31
|
+
|
32
|
+
If using Devise, add this in your Devise.setup in /config/initializers/devise.rb
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
config.omniauth :frameio,
|
36
|
+
ENV['FRAME_CLIENT_ID'], # Your app client ID (on Frame.io Oauth app mgmt)
|
37
|
+
ENV['FRAME_CLIENT_SECRET'], # Your app client Secret (on Frame.io Oauth app mgmt)
|
38
|
+
scope: 'offline' # list of availables scopes to find on Frame.io dev doc
|
39
|
+
```
|
40
|
+
|
41
|
+
Please follow Omniauth & Devise instructions for complete configuration.
|
42
|
+
|
43
|
+
### Wrapper configuration:
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
class User < ApplicationRecord
|
47
|
+
act_as_frameio_user
|
48
|
+
end
|
49
|
+
```
|
50
|
+
|
51
|
+
By default, frame_io wrapper is expecting the model to respond_to? :access_token, :refresh_token and :expires_at
|
52
|
+
|
53
|
+
If you want to change the column names:
|
54
|
+
|
55
|
+
```ruby
|
56
|
+
class User < ApplicationRecord
|
57
|
+
act_as_frameio_user access_token: :some_column, refresh_token: :some_other_column, expires_at: :oh_so_other_column
|
58
|
+
end
|
59
|
+
```
|
60
|
+
|
61
|
+
That's all! You now have access to a frame.io client:
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
current_user.frame_io #=> FrameIo::Client
|
65
|
+
|
66
|
+
current_user.frame_io.accounts #=> All accounts for user frame.io account
|
67
|
+
```
|
68
|
+
|
69
|
+
Due to the nature of the 'tree' on Frame.io, objects needs to be retrieved in chain
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
current_user.accounts.first.teams.first.projects.first.assets.first.children
|
73
|
+
```
|
74
|
+
|
75
|
+
Each step is cached by default. If you need to refresh, you can pass:
|
76
|
+
```ruby
|
77
|
+
cache: false
|
78
|
+
```
|
79
|
+
at any moment, like that:
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
current_user.frame_io.accounts.first.teams.first.projects(cache: false).first.assets
|
83
|
+
```
|
84
|
+
|
85
|
+
It will refresh from projects and downward.
|
86
|
+
|
87
|
+
|
88
|
+
Lastly, all objects are findable by ID without the need of the 'chain', like that:
|
89
|
+
|
90
|
+
```ruby
|
91
|
+
current_user.frame_io.asset(id: 'some_id')
|
92
|
+
```
|
93
|
+
|
94
|
+
It obviously works if and only current_user has access to the file in Frame.io
|
95
|
+
|
96
|
+
|
97
|
+
## Contributing
|
98
|
+
Please raise issues at will, and suggest better ways to handle this!
|
99
|
+
|
100
|
+
## License
|
101
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module FrameIo
|
2
|
+
class Account < OpenStruct
|
3
|
+
def self.all(client:)
|
4
|
+
client.get_resource('accounts', object_class: self)
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.find(id:, client:)
|
8
|
+
client.get_resource("accounts/#{id}", object_class: self)
|
9
|
+
end
|
10
|
+
|
11
|
+
def teams(cache: true)
|
12
|
+
@teams = nil unless cache
|
13
|
+
|
14
|
+
@teams ||= Team.all(account: self, client:)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module FrameIo
|
2
|
+
class Asset < OpenStruct
|
3
|
+
def self.children(asset:, client:)
|
4
|
+
client.get_resource("assets/#{asset.id}/children", object_class: self)
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.find(id:, client:)
|
8
|
+
client.get_resource("assets/#{id}", object_class: self)
|
9
|
+
end
|
10
|
+
|
11
|
+
def account(cache: true)
|
12
|
+
@account = nil unless cache
|
13
|
+
|
14
|
+
@account ||= Account.find(id: account_id, client:)
|
15
|
+
end
|
16
|
+
|
17
|
+
def children(cache: true)
|
18
|
+
@children = nil unless cache
|
19
|
+
|
20
|
+
@children ||= Asset.children(asset: self, client:)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module FrameIo
|
2
|
+
class Client
|
3
|
+
attr_reader :user, :api_key
|
4
|
+
|
5
|
+
def initialize(user:)
|
6
|
+
@user = user
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_resource(resource_path, object_class:)
|
10
|
+
check_token
|
11
|
+
response = token.get(resource_path)
|
12
|
+
result = JSON.parse(
|
13
|
+
response.body,
|
14
|
+
symbolize_names: true,
|
15
|
+
object_class:
|
16
|
+
)
|
17
|
+
if result.is_a? OpenStruct
|
18
|
+
result.client = self
|
19
|
+
elsif result.is_a? Array
|
20
|
+
result.each { _1.client = self }
|
21
|
+
end
|
22
|
+
result
|
23
|
+
end
|
24
|
+
|
25
|
+
def token
|
26
|
+
OAuth2::AccessToken.from_hash(
|
27
|
+
oauth.client,
|
28
|
+
{
|
29
|
+
access_token: user.send(FrameIo.access_token),
|
30
|
+
refresh_token: user.send(FrameIo.refresh_token),
|
31
|
+
expires_at: user.send(FrameIo.expires_at)
|
32
|
+
}
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
def oauth
|
37
|
+
OmniAuth::Strategies::Frameio.new(
|
38
|
+
nil,
|
39
|
+
ENV['FRAME_CLIENT_ID'],
|
40
|
+
ENV['FRAME_CLIENT_SECRET']
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
def accounts(cache: true)
|
45
|
+
@accounts = nil unless cache
|
46
|
+
|
47
|
+
@accounts ||= Account.all(client: self)
|
48
|
+
end
|
49
|
+
|
50
|
+
def current_user
|
51
|
+
User.current(client: self)
|
52
|
+
end
|
53
|
+
|
54
|
+
def account(id:)
|
55
|
+
Account.find(id:, client: self)
|
56
|
+
end
|
57
|
+
|
58
|
+
def team(id:)
|
59
|
+
Team.find(id:, client: self)
|
60
|
+
end
|
61
|
+
|
62
|
+
def project(id:)
|
63
|
+
Project.find(id:, client: self)
|
64
|
+
end
|
65
|
+
|
66
|
+
def asset(id:)
|
67
|
+
Asset.find(id:, client: self)
|
68
|
+
end
|
69
|
+
|
70
|
+
def custom_action(id:)
|
71
|
+
CustomAction.find(id:, client: self)
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def check_token
|
77
|
+
return unless token.expired?
|
78
|
+
|
79
|
+
new_token = token.refresh!
|
80
|
+
|
81
|
+
raise TokenError, 'something went wrong with token refresh' unless new_token.present?
|
82
|
+
|
83
|
+
user.update(
|
84
|
+
frameio_token: new_token.token,
|
85
|
+
frameio_token_expires_at: Time.at(new_token.expires_at),
|
86
|
+
frameio_refresh_token: new_token.refresh_token
|
87
|
+
)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module FrameIo
|
2
|
+
class CustomAction < OpenStruct
|
3
|
+
def self.all(team:, client:)
|
4
|
+
client.get_resource("teams/#{team.id}/actions", object_class: self)
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.find(id:, client:)
|
8
|
+
client.get_resource("actions/#{id}", object_class: self)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module FrameIo
|
2
|
+
class Project < OpenStruct
|
3
|
+
def self.all(team:, client:)
|
4
|
+
client.get_resource("teams/#{team.id}/projects", object_class: self)
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.find(id:, client:)
|
8
|
+
client.get_resource("projects/#{id}", object_class: self)
|
9
|
+
end
|
10
|
+
|
11
|
+
def root
|
12
|
+
@root ||= Asset.find(id: root_asset.id, client:)
|
13
|
+
end
|
14
|
+
|
15
|
+
def account
|
16
|
+
root.account
|
17
|
+
end
|
18
|
+
|
19
|
+
def assets(cache: true)
|
20
|
+
@assets = nil unless cache
|
21
|
+
|
22
|
+
@assets ||= root.children(cache:)
|
23
|
+
end
|
24
|
+
|
25
|
+
def collaborators(cache: true)
|
26
|
+
@collaborators = nil unless cache
|
27
|
+
|
28
|
+
@collaborators ||= Collaborator.all(project: self, client:)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module FrameIo
|
2
|
+
class Team < OpenStruct
|
3
|
+
def self.all(account:, client:)
|
4
|
+
client.get_resource("accounts/#{account.id}/teams?include=user_role", object_class: self)
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.find(id:, client:)
|
8
|
+
client.get_resource("teams/#{id}", object_class: self)
|
9
|
+
end
|
10
|
+
|
11
|
+
def projects(cache: true)
|
12
|
+
@projects = nil unless cache
|
13
|
+
|
14
|
+
@projects ||= Project.all(team: self, client:)
|
15
|
+
end
|
16
|
+
|
17
|
+
def custom_actions(cache: true)
|
18
|
+
@custom_actions = nil unless cache
|
19
|
+
|
20
|
+
@custom_actions ||= CustomAction.all(team: self, client:)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/frame_io.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require "frame_io/version"
|
2
|
+
require "frame_io/railtie"
|
3
|
+
require 'frame_io/account'
|
4
|
+
require 'frame_io/active_record_extension'
|
5
|
+
require 'frame_io/asset'
|
6
|
+
require 'frame_io/client'
|
7
|
+
require 'frame_io/collaborator'
|
8
|
+
require 'frame_io/custom_action'
|
9
|
+
require 'frame_io/project'
|
10
|
+
require 'frame_io/team'
|
11
|
+
require 'frame_io/user'
|
12
|
+
require 'omniauth-frameio'
|
13
|
+
|
14
|
+
module FrameIo
|
15
|
+
TokenError = Class.new(StandardError)
|
16
|
+
|
17
|
+
class << self
|
18
|
+
attr_writer :access_token, :refresh_token, :expires_at
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.included(base)
|
22
|
+
return if [
|
23
|
+
access_token,
|
24
|
+
refresh_token,
|
25
|
+
expires_at
|
26
|
+
].all? { base.attribute_method? _1 }
|
27
|
+
|
28
|
+
raise TokenError, "#{base} must implement ##{access_token}, ##{refresh_token}, ##{expires_at} or define otherwise at include."
|
29
|
+
end
|
30
|
+
|
31
|
+
def frame_io
|
32
|
+
Client.new(user: self)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.access_token
|
36
|
+
@access_token || :access_token
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.refresh_token
|
40
|
+
@refresh_token || :refresh_token
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.expires_at
|
44
|
+
@expires_at || :expires_at
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: frameio-api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Victor Holl
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-01-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: omniauth-frameio
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rails
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 7.1.2
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 7.1.2
|
41
|
+
description: Basic and WIP API wrapper for Frame.io. Uses OAuth2 and omniauth-frameio
|
42
|
+
strategy gem.
|
43
|
+
email:
|
44
|
+
- v_h@me.com
|
45
|
+
executables: []
|
46
|
+
extensions: []
|
47
|
+
extra_rdoc_files: []
|
48
|
+
files:
|
49
|
+
- MIT-LICENSE
|
50
|
+
- README.md
|
51
|
+
- Rakefile
|
52
|
+
- lib/frame_io.rb
|
53
|
+
- lib/frame_io/account.rb
|
54
|
+
- lib/frame_io/active_record_extension.rb
|
55
|
+
- lib/frame_io/asset.rb
|
56
|
+
- lib/frame_io/client.rb
|
57
|
+
- lib/frame_io/collaborator.rb
|
58
|
+
- lib/frame_io/custom_action.rb
|
59
|
+
- lib/frame_io/project.rb
|
60
|
+
- lib/frame_io/railtie.rb
|
61
|
+
- lib/frame_io/team.rb
|
62
|
+
- lib/frame_io/user.rb
|
63
|
+
- lib/frame_io/version.rb
|
64
|
+
- lib/tasks/frame_io_tasks.rake
|
65
|
+
homepage: https://github.com/boxprod/frame_io
|
66
|
+
licenses:
|
67
|
+
- MIT
|
68
|
+
metadata:
|
69
|
+
homepage_uri: https://github.com/boxprod/frame_io
|
70
|
+
source_code_uri: https://github.com/boxprod/frame_io
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options: []
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
requirements: []
|
86
|
+
rubygems_version: 3.5.3
|
87
|
+
signing_key:
|
88
|
+
specification_version: 4
|
89
|
+
summary: Basic API Wrapper for Frame.io using OAuth2
|
90
|
+
test_files: []
|