enginn 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +44 -0
- data/CHANGELOG.md +16 -0
- data/Gemfile +24 -0
- data/Gemfile.lock +94 -0
- data/LICENSE.txt +21 -0
- data/README.md +72 -0
- data/Rakefile +12 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/lib/enginn/character.rb +15 -0
- data/lib/enginn/characters_index.rb +9 -0
- data/lib/enginn/client.rb +41 -0
- data/lib/enginn/dictionary_entries_index.rb +9 -0
- data/lib/enginn/dictionary_entry.rb +9 -0
- data/lib/enginn/error.rb +60 -0
- data/lib/enginn/line.rb +15 -0
- data/lib/enginn/line_tag.rb +15 -0
- data/lib/enginn/line_tags_index.rb +9 -0
- data/lib/enginn/lines_index.rb +9 -0
- data/lib/enginn/project.rb +72 -0
- data/lib/enginn/projects_index.rb +33 -0
- data/lib/enginn/resource.rb +143 -0
- data/lib/enginn/resource_index.rb +140 -0
- data/lib/enginn/scene.rb +15 -0
- data/lib/enginn/scenes_index.rb +9 -0
- data/lib/enginn/string_utils.rb +14 -0
- data/lib/enginn/synthesis_export.rb +9 -0
- data/lib/enginn/synthesis_exports_index.rb +9 -0
- data/lib/enginn/take.rb +9 -0
- data/lib/enginn/take_batch.rb +15 -0
- data/lib/enginn/take_batches_index.rb +9 -0
- data/lib/enginn/takes_index.rb +9 -0
- data/lib/enginn/test_synthesis.rb +9 -0
- data/lib/enginn/version.rb +5 -0
- data/lib/enginn.rb +31 -0
- metadata +96 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 69df7684cee8d69dc1323a4619fa36da07ca99c4971c2efd5e028b01d896587e
|
4
|
+
data.tar.gz: 27e16a94a761a330c3e0c0b036804de6518d190606a5a7889df5f2845c9f9832
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2a18523033fd9b7d102dde8cc5206b0d1e7709e7ca690db333282d940351b6a10c23f3ff95b8b064a88447a738539d579246036296e9af323256dc4c34bd0f26
|
7
|
+
data.tar.gz: f1a040d449fd07ce2dd70dab88b6458a7404fff498fcf77daf74b5afdbcfe50b05fa5f07d8f8a014a0179697902474af26f008b751a209ba25692e56e65aac43
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# See list of defaults here: https://docs.rubocop.org/rubocop/index.html
|
2
|
+
|
3
|
+
require:
|
4
|
+
- rubocop-performance
|
5
|
+
- rubocop-rspec
|
6
|
+
- rubocop-rake
|
7
|
+
|
8
|
+
AllCops:
|
9
|
+
TargetRubyVersion: 2.6
|
10
|
+
NewCops: enable
|
11
|
+
Exclude:
|
12
|
+
- bin/**/*
|
13
|
+
- vendor/**/* # Fix missing gem in CI when using `bundler-cache: true`
|
14
|
+
|
15
|
+
Gemspec/RequireMFA:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
# ------------------------------------------------------------------------------
|
19
|
+
# DEPARTMENT LAYOUT
|
20
|
+
# ------------------------------------------------------------------------------
|
21
|
+
|
22
|
+
Layout/FirstArrayElementIndentation:
|
23
|
+
EnforcedStyle: consistent # default: special_inside_parentheses
|
24
|
+
|
25
|
+
Layout/FirstHashElementIndentation:
|
26
|
+
EnforcedStyle: consistent # default: special_inside_parentheses
|
27
|
+
|
28
|
+
Layout/LineLength:
|
29
|
+
Max: 100 # default: 120
|
30
|
+
|
31
|
+
# ------------------------------------------------------------------------------
|
32
|
+
# DEPARTMENT METRICS
|
33
|
+
# ------------------------------------------------------------------------------
|
34
|
+
|
35
|
+
Metrics/BlockLength:
|
36
|
+
Exclude:
|
37
|
+
- spec/**/*
|
38
|
+
|
39
|
+
# ------------------------------------------------------------------------------
|
40
|
+
# DEPARTMENT STYLE
|
41
|
+
# ------------------------------------------------------------------------------
|
42
|
+
|
43
|
+
Style/Documentation:
|
44
|
+
Enabled: false # default: true
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
|
+
|
8
|
+
# Unreleased
|
9
|
+
(nothing yet!)
|
10
|
+
|
11
|
+
## [0.1.1] - 2022-09-13
|
12
|
+
### Added
|
13
|
+
- Initial working set of functionalities.
|
14
|
+
|
15
|
+
[Unreleased]: https://github.com/EnginnTechnologies/enginn-rb/compare/v0.1.1...HEAD
|
16
|
+
[0.1.1]: https://github.com/EnginnTechnologies/enginn-rb/releases/tag/v0.1.1
|
data/Gemfile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
source 'https://rubygems.org'
|
4
|
+
|
5
|
+
# Specify your gem's dependencies in enginn.gemspec
|
6
|
+
gemspec
|
7
|
+
|
8
|
+
group :development do
|
9
|
+
gem 'rake', '~> 13.0'
|
10
|
+
gem 'rubocop', '~> 1.21', require: false
|
11
|
+
gem 'rubocop-performance', '~> 1.13', require: false
|
12
|
+
gem 'rubocop-rake', '~> 0.6.0', require: false
|
13
|
+
gem 'rubocop-rspec', '~> 2.7', require: false
|
14
|
+
gem 'yard', '~> 0.9.27', require: false
|
15
|
+
end
|
16
|
+
|
17
|
+
group :test do
|
18
|
+
gem 'rspec', '~> 3.0'
|
19
|
+
gem 'simplecov', require: false
|
20
|
+
end
|
21
|
+
|
22
|
+
group :development, :test do
|
23
|
+
gem 'debug', '~> 1.4'
|
24
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
enginn (0.1.1)
|
5
|
+
faraday (~> 2.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
ast (2.4.2)
|
11
|
+
debug (1.6.2)
|
12
|
+
irb (>= 1.3.6)
|
13
|
+
reline (>= 0.3.1)
|
14
|
+
diff-lcs (1.5.0)
|
15
|
+
docile (1.4.0)
|
16
|
+
faraday (2.5.2)
|
17
|
+
faraday-net_http (>= 2.0, < 3.1)
|
18
|
+
ruby2_keywords (>= 0.0.4)
|
19
|
+
faraday-net_http (3.0.0)
|
20
|
+
io-console (0.5.11)
|
21
|
+
irb (1.4.1)
|
22
|
+
reline (>= 0.3.0)
|
23
|
+
json (2.6.2)
|
24
|
+
parallel (1.22.1)
|
25
|
+
parser (3.1.2.1)
|
26
|
+
ast (~> 2.4.1)
|
27
|
+
rainbow (3.1.1)
|
28
|
+
rake (13.0.6)
|
29
|
+
regexp_parser (2.5.0)
|
30
|
+
reline (0.3.1)
|
31
|
+
io-console (~> 0.5)
|
32
|
+
rexml (3.2.5)
|
33
|
+
rspec (3.11.0)
|
34
|
+
rspec-core (~> 3.11.0)
|
35
|
+
rspec-expectations (~> 3.11.0)
|
36
|
+
rspec-mocks (~> 3.11.0)
|
37
|
+
rspec-core (3.11.0)
|
38
|
+
rspec-support (~> 3.11.0)
|
39
|
+
rspec-expectations (3.11.1)
|
40
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
41
|
+
rspec-support (~> 3.11.0)
|
42
|
+
rspec-mocks (3.11.1)
|
43
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
44
|
+
rspec-support (~> 3.11.0)
|
45
|
+
rspec-support (3.11.1)
|
46
|
+
rubocop (1.36.0)
|
47
|
+
json (~> 2.3)
|
48
|
+
parallel (~> 1.10)
|
49
|
+
parser (>= 3.1.2.1)
|
50
|
+
rainbow (>= 2.2.2, < 4.0)
|
51
|
+
regexp_parser (>= 1.8, < 3.0)
|
52
|
+
rexml (>= 3.2.5, < 4.0)
|
53
|
+
rubocop-ast (>= 1.20.1, < 2.0)
|
54
|
+
ruby-progressbar (~> 1.7)
|
55
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
56
|
+
rubocop-ast (1.21.0)
|
57
|
+
parser (>= 3.1.1.0)
|
58
|
+
rubocop-performance (1.15.0)
|
59
|
+
rubocop (>= 1.7.0, < 2.0)
|
60
|
+
rubocop-ast (>= 0.4.0)
|
61
|
+
rubocop-rake (0.6.0)
|
62
|
+
rubocop (~> 1.0)
|
63
|
+
rubocop-rspec (2.13.1)
|
64
|
+
rubocop (~> 1.33)
|
65
|
+
ruby-progressbar (1.11.0)
|
66
|
+
ruby2_keywords (0.0.5)
|
67
|
+
simplecov (0.21.2)
|
68
|
+
docile (~> 1.1)
|
69
|
+
simplecov-html (~> 0.11)
|
70
|
+
simplecov_json_formatter (~> 0.1)
|
71
|
+
simplecov-html (0.12.3)
|
72
|
+
simplecov_json_formatter (0.1.4)
|
73
|
+
unicode-display_width (2.2.0)
|
74
|
+
webrick (1.7.0)
|
75
|
+
yard (0.9.28)
|
76
|
+
webrick (~> 1.7.0)
|
77
|
+
|
78
|
+
PLATFORMS
|
79
|
+
x86_64-linux
|
80
|
+
|
81
|
+
DEPENDENCIES
|
82
|
+
debug (~> 1.4)
|
83
|
+
enginn!
|
84
|
+
rake (~> 13.0)
|
85
|
+
rspec (~> 3.0)
|
86
|
+
rubocop (~> 1.21)
|
87
|
+
rubocop-performance (~> 1.13)
|
88
|
+
rubocop-rake (~> 0.6.0)
|
89
|
+
rubocop-rspec (~> 2.7)
|
90
|
+
simplecov
|
91
|
+
yard (~> 0.9.27)
|
92
|
+
|
93
|
+
BUNDLED WITH
|
94
|
+
2.3.18
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2022 Enginn Technologies
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
[![CI](https://github.com/EnginnTechnologies/enginn-rb/actions/workflows/ci.yml/badge.svg)](https://github.com/EnginnTechnologies/enginn-rb/actions/workflows/ci.yml)
|
2
|
+
[![Release](https://github.com/EnginnTechnologies/enginn-rb/actions/workflows/release.yml/badge.svg)](https://github.com/EnginnTechnologies/enginn-rb/actions/workflows/release.yml)
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/enginn.svg)](https://badge.fury.io/rb/enginn)
|
4
|
+
|
5
|
+
# Enginn
|
6
|
+
|
7
|
+
The official gem to interact with the [Enginn API](https://app.enginn.tech/api/docs/index.html).
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'enginn'
|
15
|
+
```
|
16
|
+
|
17
|
+
And then execute:
|
18
|
+
|
19
|
+
$ bundle install
|
20
|
+
|
21
|
+
Or install it yourself as:
|
22
|
+
|
23
|
+
$ gem install enginn
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
Visit the [API documentation](https://www.rubydoc.info/github/EnginnTechnologies/enginn-rb/)
|
28
|
+
for more details.
|
29
|
+
|
30
|
+
```rb
|
31
|
+
# Create a client
|
32
|
+
client = Enginn::Client.new(api_token: 'xxxxx')
|
33
|
+
|
34
|
+
# Retrieve a project
|
35
|
+
project = client.projects.where(id: 'xxxxx').first
|
36
|
+
|
37
|
+
# Manipulate collections
|
38
|
+
characters = project.characters.where(gender_eq: 'male')
|
39
|
+
characters.each do |character|
|
40
|
+
# ...
|
41
|
+
end
|
42
|
+
|
43
|
+
# Update a character
|
44
|
+
character = project.characters.first
|
45
|
+
character.name = 'Pilou'
|
46
|
+
character.save!
|
47
|
+
|
48
|
+
# Create a new character
|
49
|
+
character = Enginn::Character.new(project, name: 'Raph', gender: 'male', ...)
|
50
|
+
character.save!
|
51
|
+
|
52
|
+
# Destroy a character
|
53
|
+
character.destroy!
|
54
|
+
```
|
55
|
+
|
56
|
+
## Development
|
57
|
+
|
58
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
59
|
+
|
60
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
61
|
+
|
62
|
+
## Contributing
|
63
|
+
|
64
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/EnginnTechnologies/enginn-rb.
|
65
|
+
|
66
|
+
## Changelog
|
67
|
+
|
68
|
+
See [CHANGELOG.md](https://github.com/EnginnTechnologies/enginn-rb/blob/main/CHANGELOG.md).
|
69
|
+
|
70
|
+
## License
|
71
|
+
|
72
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'bundler/setup'
|
5
|
+
Bundler.require(:development)
|
6
|
+
require 'enginn'
|
7
|
+
require 'irb'
|
8
|
+
|
9
|
+
@client = Enginn::Client.new(api_token: ENV['ENGINN_API_TOKEN'])
|
10
|
+
@client.connection do |conn|
|
11
|
+
conn.url_prefix = ENV['ENGINN_BASE_URL'] || Enginn::Client::BASE_URL
|
12
|
+
conn.response :logger
|
13
|
+
end
|
14
|
+
|
15
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Enginn
|
4
|
+
class Character < Resource
|
5
|
+
def self.path
|
6
|
+
'characters'
|
7
|
+
end
|
8
|
+
|
9
|
+
# Retrieve the takes of this character.
|
10
|
+
# @return [Enginn::TakesIndex]
|
11
|
+
def takes
|
12
|
+
TakesIndex.new(@project).where(character_id_eq: @attributes[:id])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'faraday'
|
4
|
+
|
5
|
+
module Enginn
|
6
|
+
class Client
|
7
|
+
BASE_URL = 'https://app.enginn.tech/api/v1'
|
8
|
+
|
9
|
+
attr_reader :api_token, :adapter
|
10
|
+
|
11
|
+
# @param api_token [String] The API token to use
|
12
|
+
# @param adapter [Symbol] The Faraday adapter to use
|
13
|
+
def initialize(api_token:, adapter: Faraday.default_adapter)
|
14
|
+
@api_token = api_token
|
15
|
+
@adapter = adapter
|
16
|
+
end
|
17
|
+
|
18
|
+
# Get a connection to the API.
|
19
|
+
#
|
20
|
+
# @yieldparam connection [Faraday::Connection] if a block is given
|
21
|
+
# @return [Faraday::Connection]
|
22
|
+
def connection
|
23
|
+
@connection ||= Faraday.new(BASE_URL) do |conn|
|
24
|
+
conn.adapter @adapter
|
25
|
+
conn.request :authorization, 'Bearer', -> { @api_token }
|
26
|
+
conn.request :json
|
27
|
+
conn.response :json
|
28
|
+
conn.response :enginn_raise_error
|
29
|
+
end
|
30
|
+
yield(@connection) if block_given?
|
31
|
+
@connection
|
32
|
+
end
|
33
|
+
|
34
|
+
# Retrieve the projects the account have access to.
|
35
|
+
#
|
36
|
+
# @return [Enginn::ProjectsIndex]
|
37
|
+
def projects
|
38
|
+
ProjectsIndex.new(self)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/enginn/error.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Enginn
|
4
|
+
class Error < StandardError; end
|
5
|
+
|
6
|
+
# Map Enginn errors to Faraday's while keeping Enginn::Error inheriting from
|
7
|
+
# StandardError.
|
8
|
+
class HTTPError < Faraday::Error; end
|
9
|
+
class ClientError < HTTPError; end
|
10
|
+
class ServerError < HTTPError; end
|
11
|
+
class BadRequestError < ClientError; end
|
12
|
+
class UnauthorizedError < ClientError; end
|
13
|
+
class ForbiddenError < ClientError; end
|
14
|
+
class ResourceNotFound < ClientError; end
|
15
|
+
class ProxyAuthError < ClientError; end
|
16
|
+
class ConflictError < ClientError; end
|
17
|
+
class UnprocessableEntityError < ClientError; end
|
18
|
+
class NilStatusError < ServerError; end
|
19
|
+
|
20
|
+
# Override the Faraday::Response::RaiseError middleware to raise Enginn
|
21
|
+
# errors instead of Faraday's
|
22
|
+
# (see https://github.com/lostisland/faraday -> lib/faraday/error.rb)
|
23
|
+
#
|
24
|
+
# rubocop:disable Metrics/AbcSize
|
25
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
26
|
+
# rubocop:disable Metrics/MethodLength
|
27
|
+
class RaiseError < Faraday::Response::RaiseError
|
28
|
+
def on_complete(env)
|
29
|
+
case env[:status]
|
30
|
+
when 400
|
31
|
+
raise Enginn::BadRequestError, response_values(env)
|
32
|
+
when 401
|
33
|
+
raise Enginn::UnauthorizedError, response_values(env)
|
34
|
+
when 403
|
35
|
+
raise Enginn::ForbiddenError, response_values(env)
|
36
|
+
when 404
|
37
|
+
raise Enginn::ResourceNotFound, response_values(env)
|
38
|
+
when 407
|
39
|
+
# mimic the behavior that we get with proxy requests with HTTPS
|
40
|
+
msg = %(407 "Proxy Authentication Required")
|
41
|
+
raise Enginn::ProxyAuthError.new(msg, response_values(env))
|
42
|
+
when 409
|
43
|
+
raise Enginn::ConflictError, response_values(env)
|
44
|
+
when 422
|
45
|
+
raise Enginn::UnprocessableEntityError, response_values(env)
|
46
|
+
when ClientErrorStatuses
|
47
|
+
raise Enginn::ClientError, response_values(env)
|
48
|
+
when ServerErrorStatuses
|
49
|
+
raise Enginn::ServerError, response_values(env)
|
50
|
+
when nil
|
51
|
+
raise Enginn::NilStatusError, response_values(env)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
# rubocop:enable Metrics/AbcSize
|
56
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
57
|
+
# rubocop:enable Metrics/MethodLength
|
58
|
+
|
59
|
+
Faraday::Response.register_middleware(enginn_raise_error: Enginn::RaiseError)
|
60
|
+
end
|
data/lib/enginn/line.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Enginn
|
4
|
+
class Line < Resource
|
5
|
+
def self.path
|
6
|
+
'lines'
|
7
|
+
end
|
8
|
+
|
9
|
+
# Retrieve the takes of this line.
|
10
|
+
# @return [Enginn::TakesIndex]
|
11
|
+
def takes
|
12
|
+
TakesIndex.new(@project).where(line_id_eq: @attributes[:id])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Enginn
|
4
|
+
class LineTag < Resource
|
5
|
+
def self.path
|
6
|
+
'line_tags'
|
7
|
+
end
|
8
|
+
|
9
|
+
# Retrieve the lines of this line tag.
|
10
|
+
# @return [Enginn::LinesIndex]
|
11
|
+
def lines
|
12
|
+
LinesIndex.new(@project).where(line_tag_id_eq: @attributes[:id])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Enginn
|
4
|
+
class Project < Resource
|
5
|
+
def self.path
|
6
|
+
'projects'
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader :client
|
10
|
+
|
11
|
+
# @param client [Enginn::Client] The client to use with this project and its sub-resources
|
12
|
+
def initialize(client, attributes = {})
|
13
|
+
@client = client
|
14
|
+
super(self, attributes)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Retrieve the characters present in this project.
|
18
|
+
# @return [Enginn::CharactersIndex]
|
19
|
+
def characters
|
20
|
+
CharactersIndex.new(self)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Retrieve the dictionary entries present in this project.
|
24
|
+
# @return [Enginn::DictionaryEntriesIndex]
|
25
|
+
def dictionary_entries
|
26
|
+
DictionaryEntriesIndex.new(self)
|
27
|
+
end
|
28
|
+
|
29
|
+
alias dictionary dictionary_entries
|
30
|
+
|
31
|
+
# Retrieve the synthesis exports present in this project.
|
32
|
+
# @return [Enginn::SynthesisExportsIndex]
|
33
|
+
def synthesis_exports
|
34
|
+
SynthesisExportsIndex.new(self)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Retrieve the scenes present in this project.
|
38
|
+
# @return [Enginn::ScenesIndex]
|
39
|
+
def scenes
|
40
|
+
ScenesIndex.new(self)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Retrieve the lines present in this project.
|
44
|
+
# @return [Enginn::LinesIndex]
|
45
|
+
def lines
|
46
|
+
LinesIndex.new(self)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Retrieve the line_tags present in this project.
|
50
|
+
# @return [Enginn::LineTagsIndex]
|
51
|
+
def line_tags
|
52
|
+
LineTagsIndex.new(self)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Retrieve the takes present in this project.
|
56
|
+
# @return [Enginn::TakesIndex]
|
57
|
+
def takes
|
58
|
+
TakesIndex.new(self)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Retrieve the take_batches present in this project.
|
62
|
+
# @return [Enginn::TakeBatchesIndex]
|
63
|
+
def take_batches
|
64
|
+
TakeBatchesIndex.new(self)
|
65
|
+
end
|
66
|
+
|
67
|
+
# @api private
|
68
|
+
def route
|
69
|
+
"#{self.class.path}/#{@attributes[:id]}"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Enginn
|
4
|
+
class ProjectsIndex < ResourceIndex
|
5
|
+
# @see ResourceIndex.resource
|
6
|
+
def self.resource
|
7
|
+
Project
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_reader :client
|
11
|
+
|
12
|
+
# @param client [Enginn::Client] The client to use with this project and resources
|
13
|
+
def initialize(client)
|
14
|
+
@client = client
|
15
|
+
super(self)
|
16
|
+
end
|
17
|
+
|
18
|
+
# @see ResourceIndex#fetch!
|
19
|
+
def fetch!
|
20
|
+
response = request
|
21
|
+
@pagination = response[:pagination]
|
22
|
+
@collection = response[:result].map do |attributes|
|
23
|
+
self.class.resource.new(@client, attributes)
|
24
|
+
end
|
25
|
+
self
|
26
|
+
end
|
27
|
+
|
28
|
+
# @api private
|
29
|
+
def route
|
30
|
+
'projects'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'string_utils'
|
4
|
+
|
5
|
+
module Enginn
|
6
|
+
# A Resource can be a Character, a Take, or anything described in the
|
7
|
+
# Enginn API doc (https://app.enginn.tech/api/docs).
|
8
|
+
#
|
9
|
+
# A Resource depends on a Client that will be used for actual HTTP operations
|
10
|
+
# and is relative to a parent Project (see {#initialize} parameters). When a
|
11
|
+
# Resource is fetched through {#fetch} or {#save}, any received attributes
|
12
|
+
# from the API is synced with the object such as it is available as an
|
13
|
+
# instance method.
|
14
|
+
#
|
15
|
+
# @example
|
16
|
+
# character = Enginn::Character(project, { id: "00000000-0000-0000-0000-000000000000" })
|
17
|
+
# character.name # NoMethodError
|
18
|
+
# character.fetch!
|
19
|
+
# character.name # => 'Rocky'
|
20
|
+
#
|
21
|
+
# A Resource whose attributes include an ID will be considered as already
|
22
|
+
# existing and as such, subsequent calls to {#save} will issue a PATCH
|
23
|
+
# request. Otherwise, a POST request will be issued instead, allowing the
|
24
|
+
# creation of a new Resource.
|
25
|
+
#
|
26
|
+
# @example
|
27
|
+
# scene = Enginn::Scene.new(project, { name: 'Grand Finale' })
|
28
|
+
# scene.save # POST request (i.e. a new scene created)
|
29
|
+
# scene.id # => "00000000-0000-0000-0000-000000000000"
|
30
|
+
# scene.name = 'The End'
|
31
|
+
# scene.save # PATCH request (i.e. the scene is updated)
|
32
|
+
#
|
33
|
+
# @abstract Override the {.path} method to implement.
|
34
|
+
class Resource
|
35
|
+
# Get the path to use for this kind of {Enginn::Resource}
|
36
|
+
#
|
37
|
+
# @api private
|
38
|
+
# @return [String]
|
39
|
+
def self.path
|
40
|
+
raise "path is not overriden for #{self}"
|
41
|
+
end
|
42
|
+
|
43
|
+
attr_reader :project, :errors
|
44
|
+
attr_accessor :attributes
|
45
|
+
|
46
|
+
# @param project [Enginn::Project] The parent project of this resource
|
47
|
+
# @param attributes [Hash] The attributes to initialize the resource with
|
48
|
+
def initialize(project, attributes = {})
|
49
|
+
@project = project
|
50
|
+
@attributes = {}
|
51
|
+
@errors = []
|
52
|
+
sync_attributes_with(attributes || {})
|
53
|
+
end
|
54
|
+
|
55
|
+
# @raise [Faraday::Error] if something goes wrong during the request
|
56
|
+
# @return [true] if the requested has succeeded
|
57
|
+
def fetch!
|
58
|
+
result = request(:get)[:result]
|
59
|
+
sync_attributes_with(result)
|
60
|
+
true
|
61
|
+
end
|
62
|
+
|
63
|
+
# Same as {#fetch!} but return false instead of raising an exception.
|
64
|
+
# Also fill in {#errors} with the server response.
|
65
|
+
# @see fetch!
|
66
|
+
# @return [Boolean]
|
67
|
+
def fetch
|
68
|
+
fetch!
|
69
|
+
true
|
70
|
+
rescue Faraday::Error => e
|
71
|
+
@errors << e.response
|
72
|
+
false
|
73
|
+
end
|
74
|
+
|
75
|
+
# @raise [Faraday::Error] if something goes wrong during the request
|
76
|
+
# @return [true] if the requested has succeeded
|
77
|
+
def save!
|
78
|
+
response = request(@attributes[:id].nil? ? :post : :patch)
|
79
|
+
sync_attributes_with(response[:result])
|
80
|
+
true
|
81
|
+
end
|
82
|
+
|
83
|
+
# Same as {#save!} but return false instead of raising an exception.
|
84
|
+
# Also fill in {#errors} with the server response.
|
85
|
+
# @see save!
|
86
|
+
# @return [Boolean]
|
87
|
+
def save
|
88
|
+
save!
|
89
|
+
true
|
90
|
+
rescue Faraday::Error => e
|
91
|
+
@errors << e.response
|
92
|
+
false
|
93
|
+
end
|
94
|
+
|
95
|
+
# @raise [Faraday::Error] if something goes wrong during the request
|
96
|
+
# @return [true] if the requested has succeeded
|
97
|
+
def destroy!
|
98
|
+
request(:delete)
|
99
|
+
true
|
100
|
+
end
|
101
|
+
|
102
|
+
# Same as {#destroy!} but return false instead of raising an exception.
|
103
|
+
# Also fill in {#errors} with the server response.
|
104
|
+
# @see destroy!
|
105
|
+
# @return [Boolean]
|
106
|
+
def destroy
|
107
|
+
destroy!
|
108
|
+
true
|
109
|
+
rescue Faraday::Error => e
|
110
|
+
@errors << e.response
|
111
|
+
false
|
112
|
+
end
|
113
|
+
|
114
|
+
# @return [String]
|
115
|
+
def inspect
|
116
|
+
"#<#{self.class} #{@attributes.map { |name, value| "@#{name}=#{value.inspect}" }.join(', ')}>"
|
117
|
+
end
|
118
|
+
|
119
|
+
# @api private
|
120
|
+
# @return [String]
|
121
|
+
def route
|
122
|
+
"#{@project.route}/#{self.class.path}/#{@attributes[:id]}"
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
def sync_attributes_with(hash)
|
128
|
+
@attributes.merge!(hash)
|
129
|
+
@attributes.each do |attribute, value|
|
130
|
+
instance_variable_set("@#{attribute}", value)
|
131
|
+
self.class.define_method(attribute) { @attributes[attribute] }
|
132
|
+
self.class.define_method("#{attribute}=") { |arg| @attributes[attribute] = arg }
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def request(method)
|
137
|
+
resource_name = StringUtils.underscore(self.class.name.split('::').last)
|
138
|
+
params = %i[post patch].include?(method) ? { resource_name => @attributes } : {}
|
139
|
+
response = @project.client.connection.public_send(method, route, params)
|
140
|
+
JSON.parse(JSON[response.body], symbolize_names: true)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Enginn
|
4
|
+
# A {ResourceIndex} is a collection of fetchable {Resource}.
|
5
|
+
#
|
6
|
+
# It can be filtered and paginated through the chainable methods {#per},
|
7
|
+
# {#page}, and {#where}. It also includes the Enumerable module so methods
|
8
|
+
# such as {#each}, #map or #to_a are available.
|
9
|
+
#
|
10
|
+
# Actual API requests are only issued when the {#each} method (or any method
|
11
|
+
# from Enumerable) is called. While {#each}-ing, new API request will be
|
12
|
+
# issued when the end of a page is reached. Note that when using {#page}, only
|
13
|
+
# the given page is reached for.
|
14
|
+
# One can also force fetching manually using {#fetch}.
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
# takes = project.takes.where(synthesis_text_cont: 'hello')
|
18
|
+
# takes.map(&:character_name)
|
19
|
+
#
|
20
|
+
# @abstract Override the {.resource} method to implement.
|
21
|
+
class ResourceIndex
|
22
|
+
# Define the type of {Enginn::Resource} to use with this kind of {Enginn::ResourceIndex}.
|
23
|
+
#
|
24
|
+
# @api private
|
25
|
+
# @return [Enginn::Resource]
|
26
|
+
def self.resource
|
27
|
+
raise "resource is not overriden for #{self}"
|
28
|
+
end
|
29
|
+
|
30
|
+
# @api private
|
31
|
+
# @return [String]
|
32
|
+
def self.path
|
33
|
+
resource.path
|
34
|
+
end
|
35
|
+
|
36
|
+
include Enumerable
|
37
|
+
|
38
|
+
attr_reader :project, :errors
|
39
|
+
attr_accessor :filters, :pagination
|
40
|
+
|
41
|
+
# @param project [Enginn::Project] The parent project of the indexed resource
|
42
|
+
def initialize(project)
|
43
|
+
@project = project
|
44
|
+
@filters = {}
|
45
|
+
@pagination = { current: 1 }
|
46
|
+
@errors = []
|
47
|
+
end
|
48
|
+
|
49
|
+
# @yieldparam item [Enginn::Resource]
|
50
|
+
# @return [self]
|
51
|
+
def each(&block)
|
52
|
+
fetch!
|
53
|
+
@collection.each(&block)
|
54
|
+
return self if @pagination[:locked]
|
55
|
+
|
56
|
+
while @pagination[:current] < @pagination[:last]
|
57
|
+
pagination[:current] += 1
|
58
|
+
fetch!
|
59
|
+
@collection.each(&block)
|
60
|
+
end
|
61
|
+
|
62
|
+
@pagination = { current: 1 }
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
# @param page [Integer] The page number
|
67
|
+
# @return [Enginn::ResourceIndex] A new index with updated pagination
|
68
|
+
def page(page)
|
69
|
+
new_index = clone
|
70
|
+
new_index.pagination = @pagination.merge(current: page, locked: true)
|
71
|
+
new_index
|
72
|
+
end
|
73
|
+
|
74
|
+
# @param per [Integer] The number of items per page
|
75
|
+
# @return [Enginn::ResourceIndex] A new index with updated pagination
|
76
|
+
def per(per)
|
77
|
+
new_index = clone
|
78
|
+
new_index.pagination = @pagination.merge(per: per)
|
79
|
+
new_index
|
80
|
+
end
|
81
|
+
|
82
|
+
# @param filters [Hash] Filters as you would use them in the `q` object with the API.
|
83
|
+
# @return [Enginn::ResourceIndex] A new filtered index
|
84
|
+
def where(filters)
|
85
|
+
new_index = clone
|
86
|
+
new_index.filters = @filters.merge(filters || {})
|
87
|
+
new_index
|
88
|
+
end
|
89
|
+
|
90
|
+
# Fetch the current page from the API. Resulting items of the collection are
|
91
|
+
# wrapped in the corresponding {Enginn::Resource} subclass.
|
92
|
+
#
|
93
|
+
# @return [true] if the request has been successfull
|
94
|
+
def fetch!
|
95
|
+
response = request
|
96
|
+
@pagination = response[:pagination]
|
97
|
+
@collection = response[:result].map do |attributes|
|
98
|
+
self.class.resource.new(@project, attributes)
|
99
|
+
end
|
100
|
+
true
|
101
|
+
end
|
102
|
+
|
103
|
+
# Same as {#fetch!} but return false instead of raising an exception.
|
104
|
+
# Also fill in {#errors} with the server response.
|
105
|
+
# @see fetch!
|
106
|
+
# @return [Boolean]
|
107
|
+
def fetch
|
108
|
+
fetch!
|
109
|
+
true
|
110
|
+
rescue Faraday::Error => e
|
111
|
+
@errors << e.response
|
112
|
+
false
|
113
|
+
end
|
114
|
+
|
115
|
+
# @return [String]
|
116
|
+
def inspect
|
117
|
+
attributes = instance_variables.map do |var|
|
118
|
+
"#{var}=#{instance_variable_get(var)}"
|
119
|
+
end
|
120
|
+
"#<#{self.class} #{attributes.join(', ')}>"
|
121
|
+
end
|
122
|
+
|
123
|
+
# @api private
|
124
|
+
# @return [String]
|
125
|
+
def route
|
126
|
+
"#{@project.route}/#{self.class.path}"
|
127
|
+
end
|
128
|
+
|
129
|
+
private
|
130
|
+
|
131
|
+
def request
|
132
|
+
response = @project.client.connection.get(route, {
|
133
|
+
per: @pagination[:per],
|
134
|
+
page: @pagination[:current],
|
135
|
+
q: @filters
|
136
|
+
}.reject { |_, value| value.nil? || (value.respond_to?(:empty?) && value.empty?) })
|
137
|
+
JSON.parse(JSON[response.body], symbolize_names: true)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
data/lib/enginn/scene.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Enginn
|
4
|
+
class Scene < Resource
|
5
|
+
def self.path
|
6
|
+
'scenes'
|
7
|
+
end
|
8
|
+
|
9
|
+
# Retrieve the lines of this scene.
|
10
|
+
# @return [Enginn::TakesIndex]
|
11
|
+
def lines
|
12
|
+
LinesIndex.new(@project).where(scene_id_eq: @attributes[:id])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/enginn/take.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Enginn
|
4
|
+
class TakeBatch < Resource
|
5
|
+
def self.path
|
6
|
+
'take_batches'
|
7
|
+
end
|
8
|
+
|
9
|
+
# Retrieve the takes of this take_batch.
|
10
|
+
# @return [Enginn::TakesIndex]
|
11
|
+
def takes
|
12
|
+
TakesIndex.new(@project).where(take_batch_id_eq: @attributes[:id])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/enginn.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'enginn/version'
|
4
|
+
require_relative 'enginn/client'
|
5
|
+
require_relative 'enginn/error'
|
6
|
+
|
7
|
+
require_relative 'enginn/resource'
|
8
|
+
require_relative 'enginn/character'
|
9
|
+
require_relative 'enginn/dictionary_entry'
|
10
|
+
require_relative 'enginn/test_synthesis'
|
11
|
+
require_relative 'enginn/take'
|
12
|
+
require_relative 'enginn/take_batch'
|
13
|
+
require_relative 'enginn/line'
|
14
|
+
require_relative 'enginn/line_tag'
|
15
|
+
require_relative 'enginn/synthesis_export'
|
16
|
+
require_relative 'enginn/scene'
|
17
|
+
require_relative 'enginn/project'
|
18
|
+
|
19
|
+
require_relative 'enginn/resource_index'
|
20
|
+
require_relative 'enginn/characters_index'
|
21
|
+
require_relative 'enginn/dictionary_entries_index'
|
22
|
+
require_relative 'enginn/takes_index'
|
23
|
+
require_relative 'enginn/take_batches_index'
|
24
|
+
require_relative 'enginn/lines_index'
|
25
|
+
require_relative 'enginn/line_tags_index'
|
26
|
+
require_relative 'enginn/synthesis_exports_index'
|
27
|
+
require_relative 'enginn/scenes_index'
|
28
|
+
require_relative 'enginn/projects_index'
|
29
|
+
|
30
|
+
module Enginn
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: enginn
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Enginn Technologies
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-09-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faraday
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
description:
|
28
|
+
email:
|
29
|
+
- mail@enginn.tech
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".rspec"
|
35
|
+
- ".rubocop.yml"
|
36
|
+
- CHANGELOG.md
|
37
|
+
- Gemfile
|
38
|
+
- Gemfile.lock
|
39
|
+
- LICENSE.txt
|
40
|
+
- README.md
|
41
|
+
- Rakefile
|
42
|
+
- bin/console
|
43
|
+
- bin/setup
|
44
|
+
- lib/enginn.rb
|
45
|
+
- lib/enginn/character.rb
|
46
|
+
- lib/enginn/characters_index.rb
|
47
|
+
- lib/enginn/client.rb
|
48
|
+
- lib/enginn/dictionary_entries_index.rb
|
49
|
+
- lib/enginn/dictionary_entry.rb
|
50
|
+
- lib/enginn/error.rb
|
51
|
+
- lib/enginn/line.rb
|
52
|
+
- lib/enginn/line_tag.rb
|
53
|
+
- lib/enginn/line_tags_index.rb
|
54
|
+
- lib/enginn/lines_index.rb
|
55
|
+
- lib/enginn/project.rb
|
56
|
+
- lib/enginn/projects_index.rb
|
57
|
+
- lib/enginn/resource.rb
|
58
|
+
- lib/enginn/resource_index.rb
|
59
|
+
- lib/enginn/scene.rb
|
60
|
+
- lib/enginn/scenes_index.rb
|
61
|
+
- lib/enginn/string_utils.rb
|
62
|
+
- lib/enginn/synthesis_export.rb
|
63
|
+
- lib/enginn/synthesis_exports_index.rb
|
64
|
+
- lib/enginn/take.rb
|
65
|
+
- lib/enginn/take_batch.rb
|
66
|
+
- lib/enginn/take_batches_index.rb
|
67
|
+
- lib/enginn/takes_index.rb
|
68
|
+
- lib/enginn/test_synthesis.rb
|
69
|
+
- lib/enginn/version.rb
|
70
|
+
homepage: https://github.com/EnginnTechnologies/enginn-rb
|
71
|
+
licenses:
|
72
|
+
- MIT
|
73
|
+
metadata:
|
74
|
+
homepage_uri: https://github.com/EnginnTechnologies/enginn-rb
|
75
|
+
source_code_uri: https://github.com/EnginnTechnologies/enginn-rb
|
76
|
+
changelog_uri: https://github.com/EnginnTechnologies/enginn-rb/blob/v0.1.1/CHANGELOG.md
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 2.6.0
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
requirements: []
|
92
|
+
rubygems_version: 3.0.3.1
|
93
|
+
signing_key:
|
94
|
+
specification_version: 4
|
95
|
+
summary: Official Enginn API wrapper for Ruby.
|
96
|
+
test_files: []
|