rosette-client 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.txt +5 -1
- data/README.md +54 -0
- data/lib/rosette/client.rb +7 -4
- data/lib/rosette/client/api.rb +17 -2
- data/lib/rosette/client/cli.rb +4 -3
- data/lib/rosette/client/commands.rb +11 -2
- data/lib/rosette/client/commands/commit_command.rb +6 -7
- data/lib/rosette/client/commands/diff_command.rb +4 -7
- data/lib/rosette/client/commands/pull_command.rb +115 -0
- data/lib/rosette/client/commands/repo_snapshot_command.rb +6 -7
- data/lib/rosette/client/commands/show_command.rb +6 -9
- data/lib/rosette/client/commands/snapshot_command.rb +4 -7
- data/lib/rosette/client/commands/status_command.rb +4 -9
- data/lib/rosette/client/response.rb +29 -4
- data/lib/rosette/client/version.rb +1 -1
- data/lib/rosette/client/writer.rb +15 -0
- data/spec/api_spec.rb +12 -4
- data/spec/cli_spec.rb +3 -2
- data/spec/commands/commit_command_spec.rb +7 -4
- data/spec/commands/diff_command_spec.rb +11 -4
- data/spec/commands/pull_command_args_spec.rb +48 -0
- data/spec/commands/pull_command_spec.rb +121 -0
- data/spec/commands/repo_snapshot_command_spec.rb +9 -4
- data/spec/commands/show_command_spec.rb +7 -4
- data/spec/commands/snapshot_command_spec.rb +5 -4
- data/spec/commands/status_command_spec.rb +5 -4
- data/spec/helpers/fake_writer.rb +22 -0
- data/spec/response_spec.rb +28 -9
- data/spec/spec_helper.rb +1 -0
- metadata +28 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c5c191cd4c4fab60eb16d3fe33c9b2f0c3e26c65
|
4
|
+
data.tar.gz: 3a059a1b64f2bfd6e57d5dea12b26eaccc5825fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c1399a9fc2a39f05df85f840e2da3553114087c640372afc72a9cf10f695a5e5e2961292655b84814cd74c671f607f1cb026e0e3b0e31399149550bcc5d3279
|
7
|
+
data.tar.gz: d3a0980d7c2f063650a070385bb9e937e13d11696fc7a36973caab37396d556ad95b7a8cd04bc2a030196fb612bda205ed25daf64a01bb3ef670f1960c1cbcba
|
data/History.txt
CHANGED
data/README.md
CHANGED
@@ -2,3 +2,57 @@ rosette-core
|
|
2
2
|
========
|
3
3
|
|
4
4
|
[![Build Status](https://travis-ci.org/rosette-proj/rosette-client.svg?branch=master)](https://travis-ci.org/rosette-proj/rosette-client.svg?branch=master)
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
`gem install rosette-client`
|
9
|
+
|
10
|
+
## Usage
|
11
|
+
|
12
|
+
Configure it! Create the file `~/.rosette/config.yml` with configuration options for your Rosette setup:
|
13
|
+
|
14
|
+
```yaml
|
15
|
+
:host: rosette.mycompany.com
|
16
|
+
:port: 8080
|
17
|
+
:version: v1
|
18
|
+
```
|
19
|
+
|
20
|
+
You should now be able to change directory into a git repository and run rosette commands. If you installed Ruby with rbenv, don't forget to run `rbenv rehash` to make rosette-client's executable available.
|
21
|
+
|
22
|
+
## Commands
|
23
|
+
|
24
|
+
`git rosette commit [<ref>]`
|
25
|
+
|
26
|
+
Causes the given ref to be processed. If ref is omitted, the current `HEAD` is assumed. Phrases will be extracted and stored in the data store.
|
27
|
+
|
28
|
+
`git rosette diff <ref1> [<ref2> | <path>] [-- <path1> <path2> ...]`
|
29
|
+
|
30
|
+
Show the diff between two refs. If the second ref is omitted, the current `HEAD` is assumed. You can separate paths from ref arguments with `--` for consistency with the `git diff` command. This command will print phrases that were added, removed, or changed between the two refs.
|
31
|
+
|
32
|
+
`git rosette show [<ref>]`
|
33
|
+
|
34
|
+
Print the phrases that were added, removed, or changed in the given ref. If the ref is omitted, the current `HEAD` is assumed.
|
35
|
+
|
36
|
+
`git rosette status [<ref>]`
|
37
|
+
|
38
|
+
Print the translation status of the given ref. This includes how many phrases were found and the percentage translated in each supported locale. If ref is omitted, the current `HEAD` is assumed.
|
39
|
+
|
40
|
+
`git rosette snapshot [<ref>]`
|
41
|
+
|
42
|
+
Print a snapshot of the phrases for the given ref. If ref is omitted, the current `HEAD` is assumed.
|
43
|
+
|
44
|
+
`git rosette repo_snapshot [<ref>]`
|
45
|
+
|
46
|
+
Print the snapshot hash for the given ref. A snapshot is a hash of file paths to commit ids, where each commit id represents the commit the file last changed in. If ref is omitted, the current `HEAD` is assumed.
|
47
|
+
|
48
|
+
## Requirements
|
49
|
+
|
50
|
+
You've gotta be running a properly configured instance of [rosette-server](https://github.com/rosette-proj/rosette-server) to communicate with, but otherwise there are no external requirements.
|
51
|
+
|
52
|
+
## Running Tests
|
53
|
+
|
54
|
+
`bundle exec rake` should do the trick.
|
55
|
+
|
56
|
+
## Authors
|
57
|
+
|
58
|
+
* Cameron C. Dutro: http://github.com/camertron
|
data/lib/rosette/client.rb
CHANGED
@@ -5,9 +5,12 @@ require 'rosette/client/repo'
|
|
5
5
|
|
6
6
|
module Rosette
|
7
7
|
module Client
|
8
|
-
autoload :Api,
|
9
|
-
autoload :Terminal,
|
10
|
-
autoload :
|
11
|
-
autoload :
|
8
|
+
autoload :Api, 'rosette/client/api'
|
9
|
+
autoload :Terminal, 'rosette/client/terminal'
|
10
|
+
autoload :Writer, 'rosette/client/writer'
|
11
|
+
autoload :Commands, 'rosette/client/commands'
|
12
|
+
autoload :Response, 'rosette/client/response'
|
13
|
+
autoload :HashResponse, 'rosette/client/response'
|
14
|
+
autoload :ArrayResponse, 'rosette/client/response'
|
12
15
|
end
|
13
16
|
end
|
data/lib/rosette/client/api.rb
CHANGED
@@ -16,6 +16,13 @@ module Rosette
|
|
16
16
|
|
17
17
|
attr_reader :host, :port, :version
|
18
18
|
|
19
|
+
def self.url_join(*args)
|
20
|
+
args
|
21
|
+
.map { |arg| arg.gsub(/\A\/(.*)\/\z/, '\1') } # remove slashes
|
22
|
+
.reject { |arg| arg.empty? } # get rid of empties
|
23
|
+
.join('/')
|
24
|
+
end
|
25
|
+
|
19
26
|
def initialize(options = {})
|
20
27
|
@host = options.fetch(:host, DEFAULT_HOST)
|
21
28
|
@port = options.fetch(:port, DEFAULT_PORT)
|
@@ -54,6 +61,10 @@ module Rosette
|
|
54
61
|
wrap(make_request(:get, 'translations/export.json', params))
|
55
62
|
end
|
56
63
|
|
64
|
+
def locales(params)
|
65
|
+
wrap(make_request(:get, 'locales.json', params))
|
66
|
+
end
|
67
|
+
|
57
68
|
private
|
58
69
|
|
59
70
|
def wrap(api_response)
|
@@ -92,11 +103,15 @@ module Rosette
|
|
92
103
|
end
|
93
104
|
|
94
105
|
def make_get_url(path, params)
|
95
|
-
|
106
|
+
url_join(base_url, path, "?#{make_param_string(params)}")
|
96
107
|
end
|
97
108
|
|
98
109
|
def make_post_url(path, params)
|
99
|
-
|
110
|
+
url_join(base_url, path)
|
111
|
+
end
|
112
|
+
|
113
|
+
def url_join(*args)
|
114
|
+
self.class.url_join(*args)
|
100
115
|
end
|
101
116
|
|
102
117
|
def post(url, params)
|
data/lib/rosette/client/cli.rb
CHANGED
@@ -6,17 +6,18 @@ module Rosette
|
|
6
6
|
module Client
|
7
7
|
|
8
8
|
class Cli
|
9
|
-
attr_reader :api, :terminal, :repo
|
9
|
+
attr_reader :api, :terminal, :writer, :repo
|
10
10
|
|
11
|
-
def initialize(terminal, api, repo)
|
11
|
+
def initialize(terminal, writer, api, repo)
|
12
12
|
@api = api
|
13
13
|
@terminal = terminal
|
14
|
+
@writer = writer
|
14
15
|
@repo = repo
|
15
16
|
end
|
16
17
|
|
17
18
|
def start(argv)
|
18
19
|
if command_const = find_command_const(argv.first)
|
19
|
-
command_const.new(api, terminal, repo, argv[1..-1]).execute
|
20
|
+
command_const.new(api, terminal, writer, repo, argv[1..-1]).execute
|
20
21
|
else
|
21
22
|
terminal.say("Command '#{argv.first}' not recognized.")
|
22
23
|
end
|
@@ -16,18 +16,27 @@ module Rosette
|
|
16
16
|
autoload :SnapshotCommandArgs, 'rosette/client/commands/snapshot_command'
|
17
17
|
autoload :RepoSnapshotCommand, 'rosette/client/commands/repo_snapshot_command'
|
18
18
|
autoload :RepoSnapshotCommandArgs, 'rosette/client/commands/repo_snapshot_command'
|
19
|
+
autoload :PullCommand, 'rosette/client/commands/pull_command'
|
20
|
+
autoload :PullCommandArgs, 'rosette/client/commands/pull_command'
|
19
21
|
|
20
22
|
class Command
|
21
|
-
attr_reader :api, :terminal, :repo
|
23
|
+
attr_reader :api, :terminal, :writer, :repo, :args
|
22
24
|
|
23
|
-
def initialize(api, terminal, repo)
|
25
|
+
def initialize(api, terminal, writer, repo, argv)
|
24
26
|
@api = api
|
25
27
|
@terminal = terminal
|
28
|
+
@writer = writer
|
26
29
|
@repo = repo
|
30
|
+
@args = parse_args(argv)
|
27
31
|
end
|
28
32
|
|
29
33
|
protected
|
30
34
|
|
35
|
+
def parse_args(args)
|
36
|
+
raise NotImplementedError,
|
37
|
+
"#{__method__} must be defined in derived classes"
|
38
|
+
end
|
39
|
+
|
31
40
|
def print_hash(hash)
|
32
41
|
hash.each_pair do |key, value|
|
33
42
|
terminal.say("#{key}: #{value}")
|
@@ -13,13 +13,6 @@ module Rosette
|
|
13
13
|
end
|
14
14
|
|
15
15
|
class CommitCommand < Command
|
16
|
-
attr_reader :args
|
17
|
-
|
18
|
-
def initialize(api, terminal, repo, argv)
|
19
|
-
super(api, terminal, repo)
|
20
|
-
@args = CommitCommandArgs.from_argv(argv, repo)
|
21
|
-
end
|
22
|
-
|
23
16
|
def execute
|
24
17
|
terminal.say("Committing phrases for '#{args.ref}'...")
|
25
18
|
|
@@ -35,6 +28,12 @@ module Rosette
|
|
35
28
|
terminal.say('done.')
|
36
29
|
end
|
37
30
|
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def parse_args(args)
|
35
|
+
CommitCommandArgs.from_argv(args, repo)
|
36
|
+
end
|
38
37
|
end
|
39
38
|
|
40
39
|
end
|
@@ -41,13 +41,6 @@ module Rosette
|
|
41
41
|
end
|
42
42
|
|
43
43
|
class DiffCommand < Command
|
44
|
-
attr_reader :args
|
45
|
-
|
46
|
-
def initialize(api, terminal, repo, argv)
|
47
|
-
super(api, terminal, repo)
|
48
|
-
@args = DiffCommandArgs.from_argv(argv, repo)
|
49
|
-
end
|
50
|
-
|
51
44
|
def execute
|
52
45
|
response = api.diff(
|
53
46
|
repo_name: derive_repo_name,
|
@@ -63,6 +56,10 @@ module Rosette
|
|
63
56
|
|
64
57
|
private
|
65
58
|
|
59
|
+
def parse_args(args)
|
60
|
+
DiffCommandArgs.from_argv(args, repo)
|
61
|
+
end
|
62
|
+
|
66
63
|
def add_str_for(change)
|
67
64
|
str = "#{change['key']}"
|
68
65
|
meta_key = change['meta_key']
|
@@ -0,0 +1,115 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# git rs pull [ref] -f file_pattern -s serializer
|
4
|
+
|
5
|
+
require 'base64'
|
6
|
+
require 'optparse'
|
7
|
+
|
8
|
+
module Rosette
|
9
|
+
module Client
|
10
|
+
module Commands
|
11
|
+
|
12
|
+
PullCommandArgs = Struct.new(:ref, :file_pattern, :serializer) do
|
13
|
+
def self.from_argv(argv, repo, terminal)
|
14
|
+
options = {}
|
15
|
+
|
16
|
+
parser = OptionParser.new do |opts|
|
17
|
+
desc = "File pattern to use. Can contain these placeholders:\n" +
|
18
|
+
"* %{locale.code}: The full locale code, eg. pt-BR\n" +
|
19
|
+
"* %{locale.territory}: The locale's territory part, eg. 'BR'" +
|
20
|
+
"* %{locale.language}: The locale's language part, eg. 'pt'"
|
21
|
+
|
22
|
+
opts.on('-f pattern', '--file-pattern pattern', desc) do |pattern|
|
23
|
+
pattern.strip!
|
24
|
+
options[:file_pattern] = pattern.empty? ? nil : pattern
|
25
|
+
end
|
26
|
+
|
27
|
+
desc = 'The serializer to use. Translations will be requested in ' +
|
28
|
+
'this format.'
|
29
|
+
|
30
|
+
opts.on('-s serializer', '--serializer serializer', desc) do |serializer|
|
31
|
+
serializer.strip!
|
32
|
+
options[:serializer] = serializer.empty? ? nil : serializer
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
parser.parse(argv[1..-1])
|
37
|
+
options[:ref] = repo.rev_parse(argv[0] || repo.get_head)
|
38
|
+
validate_options!(options, terminal)
|
39
|
+
|
40
|
+
new(
|
41
|
+
options[:ref],
|
42
|
+
options[:file_pattern],
|
43
|
+
options[:serializer]
|
44
|
+
)
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.validate_options!(options, terminal)
|
48
|
+
unless options.include?(:file_pattern)
|
49
|
+
terminal.say('Please supply a file pattern via the -f option')
|
50
|
+
exit 1
|
51
|
+
end
|
52
|
+
|
53
|
+
unless options.include?(:serializer)
|
54
|
+
terminal.say('Please supply a serializer via the -s option')
|
55
|
+
exit 1
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# a show is really just a diff against your parent (so the inheritance makes sense)
|
61
|
+
class PullCommand < Command
|
62
|
+
def execute
|
63
|
+
locales = api.locales(
|
64
|
+
repo_name: derive_repo_name
|
65
|
+
)
|
66
|
+
|
67
|
+
handle_error(locales) do |locales|
|
68
|
+
export_locales(locales)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def parse_args(args)
|
75
|
+
PullCommandArgs.from_argv(args, repo, terminal)
|
76
|
+
end
|
77
|
+
|
78
|
+
def export_locales(locales)
|
79
|
+
locales.each do |locale|
|
80
|
+
export_locale(locale)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def export_locale(locale)
|
85
|
+
response = api.export({
|
86
|
+
repo_name: derive_repo_name,
|
87
|
+
ref: args.ref,
|
88
|
+
locale: locale['code'],
|
89
|
+
serializer: args.serializer,
|
90
|
+
base_64_encode: true
|
91
|
+
})
|
92
|
+
|
93
|
+
handle_error(response) do |response|
|
94
|
+
payload = Base64.decode64(response.payload)
|
95
|
+
path = path_for(locale)
|
96
|
+
terminal.say("Writing #{path}")
|
97
|
+
|
98
|
+
writer.open(path, 'w+') do |f|
|
99
|
+
f.write(payload)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def path_for(locale)
|
105
|
+
args.file_pattern % {
|
106
|
+
:'locale.code' => locale['code'],
|
107
|
+
:'locale.territory' => locale['territory'],
|
108
|
+
:'locale.language' => locale['language']
|
109
|
+
}
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -14,13 +14,6 @@ module Rosette
|
|
14
14
|
|
15
15
|
# a show is really just a diff against your parent (so the inheritance makes sense)
|
16
16
|
class RepoSnapshotCommand < Command
|
17
|
-
attr_reader :args
|
18
|
-
|
19
|
-
def initialize(api, terminal, repo, argv)
|
20
|
-
super(api, terminal, repo)
|
21
|
-
@args = RepoSnapshotCommandArgs.from_argv(argv, repo)
|
22
|
-
end
|
23
|
-
|
24
17
|
def execute
|
25
18
|
response = api.repo_snapshot(
|
26
19
|
repo_name: derive_repo_name,
|
@@ -31,6 +24,12 @@ module Rosette
|
|
31
24
|
print_hash(response.attributes)
|
32
25
|
end
|
33
26
|
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def parse_args(args)
|
31
|
+
RepoSnapshotCommandArgs.from_argv(args, repo)
|
32
|
+
end
|
34
33
|
end
|
35
34
|
|
36
35
|
end
|
@@ -14,15 +14,6 @@ module Rosette
|
|
14
14
|
|
15
15
|
# a show is really just a diff against your parent (so the inheritance makes sense)
|
16
16
|
class ShowCommand < DiffCommand
|
17
|
-
attr_reader :args
|
18
|
-
|
19
|
-
def initialize(api, terminal, repo, argv)
|
20
|
-
@api = api
|
21
|
-
@terminal = terminal
|
22
|
-
@repo = repo
|
23
|
-
@args = ShowCommandArgs.from_argv(argv, repo)
|
24
|
-
end
|
25
|
-
|
26
17
|
def execute
|
27
18
|
response = api.show(
|
28
19
|
repo_name: derive_repo_name,
|
@@ -33,6 +24,12 @@ module Rosette
|
|
33
24
|
print_diff(response.attributes)
|
34
25
|
end
|
35
26
|
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def parse_args(args)
|
31
|
+
ShowCommandArgs.from_argv(args, repo)
|
32
|
+
end
|
36
33
|
end
|
37
34
|
|
38
35
|
end
|
@@ -14,13 +14,6 @@ module Rosette
|
|
14
14
|
|
15
15
|
# a show is really just a diff against your parent (so the inheritance makes sense)
|
16
16
|
class SnapshotCommand < Command
|
17
|
-
attr_reader :args
|
18
|
-
|
19
|
-
def initialize(api, terminal, repo, argv)
|
20
|
-
super(api, terminal, repo)
|
21
|
-
@args = SnapshotCommandArgs.from_argv(argv, repo)
|
22
|
-
end
|
23
|
-
|
24
17
|
def execute
|
25
18
|
response = api.snapshot(
|
26
19
|
repo_name: derive_repo_name,
|
@@ -34,6 +27,10 @@ module Rosette
|
|
34
27
|
end
|
35
28
|
end
|
36
29
|
end
|
30
|
+
|
31
|
+
def parse_args(args)
|
32
|
+
SnapshotCommandArgs.from_argv(args, repo)
|
33
|
+
end
|
37
34
|
end
|
38
35
|
|
39
36
|
end
|
@@ -14,15 +14,6 @@ module Rosette
|
|
14
14
|
|
15
15
|
# a show is really just a diff against your parent (so the inheritance makes sense)
|
16
16
|
class StatusCommand < Command
|
17
|
-
attr_reader :args
|
18
|
-
|
19
|
-
def initialize(api, terminal, repo, argv)
|
20
|
-
@api = api
|
21
|
-
@terminal = terminal
|
22
|
-
@repo = repo
|
23
|
-
@args = StatusCommandArgs.from_argv(argv, repo)
|
24
|
-
end
|
25
|
-
|
26
17
|
def execute
|
27
18
|
response = api.status(
|
28
19
|
repo_name: derive_repo_name,
|
@@ -40,6 +31,10 @@ module Rosette
|
|
40
31
|
|
41
32
|
private
|
42
33
|
|
34
|
+
def parse_args(args)
|
35
|
+
StatusCommandArgs.from_argv(args, repo)
|
36
|
+
end
|
37
|
+
|
43
38
|
HEADER = ['Locale', 'Phrases', 'Translations', 'Percent']
|
44
39
|
|
45
40
|
def build_locale_table(locales, phrase_count)
|
@@ -4,11 +4,18 @@ module Rosette
|
|
4
4
|
module Client
|
5
5
|
|
6
6
|
class Response
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
def self.from_api_response(hash_or_array)
|
8
|
+
case hash_or_array
|
9
|
+
when Hash
|
10
|
+
HashResponse.new(hash_or_array)
|
11
|
+
else
|
12
|
+
ArrayResponse.new(hash_or_array)
|
13
|
+
end
|
11
14
|
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class HashResponse
|
18
|
+
attr_reader :attributes
|
12
19
|
|
13
20
|
def initialize(hash)
|
14
21
|
@attributes = hash
|
@@ -34,5 +41,23 @@ module Rosette
|
|
34
41
|
end
|
35
42
|
end
|
36
43
|
|
44
|
+
class ArrayResponse < Array
|
45
|
+
def initialize(array)
|
46
|
+
replace(array)
|
47
|
+
end
|
48
|
+
|
49
|
+
def error?
|
50
|
+
false
|
51
|
+
end
|
52
|
+
|
53
|
+
def success?
|
54
|
+
true
|
55
|
+
end
|
56
|
+
|
57
|
+
def attributes
|
58
|
+
self
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
37
62
|
end
|
38
63
|
end
|
data/spec/api_spec.rb
CHANGED
@@ -27,28 +27,36 @@ describe Api do
|
|
27
27
|
let(:api) { api_class.new }
|
28
28
|
let(:params) { { param: 'value' } }
|
29
29
|
let(:endpoint) { method }
|
30
|
+
let(:response_type) { HashResponse }
|
30
31
|
|
31
32
|
before(:each) do
|
32
|
-
url =
|
33
|
+
url = Api.url_join('http://localhost:8080/v1', path)
|
33
34
|
|
34
35
|
args = case verb
|
35
36
|
when :get
|
36
|
-
["#{
|
37
|
+
[Api.url_join(url, "#{endpoint_override rescue endpoint}.json", '?param=value')]
|
37
38
|
else
|
38
|
-
["#{
|
39
|
+
[Api.url_join(url, "#{endpoint_override rescue endpoint}.json"), params]
|
39
40
|
end
|
40
41
|
|
41
42
|
allow(api).to receive(verb).with(*args).and_return('{"foo":"bar"}')
|
42
43
|
end
|
43
44
|
|
44
45
|
it 'wraps the response in a Response object' do
|
45
|
-
expect(api.send(endpoint, params)).to be_a(
|
46
|
+
expect(api.send(endpoint, params)).to be_a(response_type)
|
46
47
|
end
|
47
48
|
end
|
48
49
|
|
49
50
|
context 'get requests' do
|
50
51
|
let(:verb) { :get }
|
51
52
|
|
53
|
+
describe '#locales' do
|
54
|
+
let(:path) { '' }
|
55
|
+
let(:method) { :locales }
|
56
|
+
let(:response_type) { ArrayResponse }
|
57
|
+
it_behaves_like 'an api endpoint'
|
58
|
+
end
|
59
|
+
|
52
60
|
describe '#diff' do
|
53
61
|
let(:path) { 'git' }
|
54
62
|
let(:method) { :diff }
|
data/spec/cli_spec.rb
CHANGED
@@ -9,7 +9,8 @@ describe Cli do
|
|
9
9
|
let(:base_repo) { TmpRepo.new }
|
10
10
|
let(:repo) { Repo.new(base_repo.working_dir) }
|
11
11
|
let(:terminal) { FakeTerminal.new }
|
12
|
-
let(:
|
12
|
+
let(:writer) { FakeWriter.new }
|
13
|
+
let(:cli) { Cli.new(terminal, writer, api, repo) }
|
13
14
|
|
14
15
|
before(:each) do
|
15
16
|
add_user_to(base_repo)
|
@@ -21,7 +22,7 @@ describe Cli do
|
|
21
22
|
base_repo.add_all
|
22
23
|
base_repo.commit('Initial commit')
|
23
24
|
|
24
|
-
expect(api).to receive(:commit).and_return(Response.
|
25
|
+
expect(api).to receive(:commit).and_return(Response.from_api_response({ 'foo' => 'bar' }))
|
25
26
|
cli.start(['commit', base_repo.git('rev-parse HEAD').strip])
|
26
27
|
end
|
27
28
|
|
@@ -10,9 +10,10 @@ describe CommitCommand do
|
|
10
10
|
let(:base_repo) { TmpRepo.new }
|
11
11
|
let(:repo) { Repo.new(base_repo.working_dir) }
|
12
12
|
let(:terminal) { FakeTerminal.new }
|
13
|
+
let(:writer) { FakeWriter.new }
|
13
14
|
let(:repo_name) { 'my_awesome_repo' }
|
14
15
|
let(:commit_id) { base_repo.git('rev-parse HEAD').strip }
|
15
|
-
let(:command) { CommitCommand.new(api, terminal, repo, [commit_id]) }
|
16
|
+
let(:command) { CommitCommand.new(api, terminal, writer, repo, [commit_id]) }
|
16
17
|
|
17
18
|
before(:each) do
|
18
19
|
add_user_to(base_repo)
|
@@ -32,7 +33,7 @@ describe CommitCommand do
|
|
32
33
|
it 'makes a commit api call' do
|
33
34
|
expect(api).to receive(:commit)
|
34
35
|
.with(repo_name: repo_name, ref: commit_id)
|
35
|
-
.and_return(Response.
|
36
|
+
.and_return(Response.from_api_response({}))
|
36
37
|
|
37
38
|
command.execute
|
38
39
|
end
|
@@ -41,7 +42,7 @@ describe CommitCommand do
|
|
41
42
|
expect(api).to receive(:commit)
|
42
43
|
.with(repo_name: repo_name, ref: commit_id)
|
43
44
|
.and_return(
|
44
|
-
Response.
|
45
|
+
Response.from_api_response(
|
45
46
|
{ 'added' => 1, 'removed' => 2, 'modified' => 3 }
|
46
47
|
)
|
47
48
|
)
|
@@ -57,7 +58,9 @@ describe CommitCommand do
|
|
57
58
|
expect(api).to receive(:commit)
|
58
59
|
.with(repo_name: repo_name, ref: commit_id)
|
59
60
|
.and_return(
|
60
|
-
Response.
|
61
|
+
Response.from_api_response(
|
62
|
+
'error' => 'Jelly beans', 'added' => 1
|
63
|
+
)
|
61
64
|
)
|
62
65
|
|
63
66
|
command.execute
|
@@ -84,8 +84,15 @@ describe 'diff' do
|
|
84
84
|
|
85
85
|
describe DiffCommand do
|
86
86
|
let(:api) { double }
|
87
|
-
let(:command)
|
87
|
+
let(:command) do
|
88
|
+
DiffCommand.new(
|
89
|
+
api, terminal, writer, repo,
|
90
|
+
[master_commit_id, new_branch_commit_id]
|
91
|
+
)
|
92
|
+
end
|
93
|
+
|
88
94
|
let(:terminal) { FakeTerminal.new }
|
95
|
+
let(:writer) { FakeWriter.new }
|
89
96
|
|
90
97
|
describe '#execute' do
|
91
98
|
it 'makes a diff api call' do
|
@@ -96,7 +103,7 @@ describe 'diff' do
|
|
96
103
|
diff_point_ref: master_commit_id,
|
97
104
|
paths: ''
|
98
105
|
)
|
99
|
-
.and_return(Response.
|
106
|
+
.and_return(Response.from_api_response({}))
|
100
107
|
|
101
108
|
command.execute
|
102
109
|
end
|
@@ -110,7 +117,7 @@ describe 'diff' do
|
|
110
117
|
paths: ''
|
111
118
|
)
|
112
119
|
.and_return(
|
113
|
-
Response.
|
120
|
+
Response.from_api_response(
|
114
121
|
sample_diff(new_branch_commit_id)
|
115
122
|
)
|
116
123
|
)
|
@@ -136,7 +143,7 @@ describe 'diff' do
|
|
136
143
|
paths: ''
|
137
144
|
)
|
138
145
|
.and_return(
|
139
|
-
Response.
|
146
|
+
Response.from_api_response({ 'error' => 'Jelly beans' }.merge(
|
140
147
|
sample_diff(new_branch_commit_id))
|
141
148
|
)
|
142
149
|
)
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
include Rosette::Client
|
6
|
+
include Rosette::Client::Commands
|
7
|
+
|
8
|
+
describe PullCommandArgs do
|
9
|
+
let(:base_repo) { TmpRepo.new }
|
10
|
+
let(:repo) { Repo.new(base_repo.working_dir) }
|
11
|
+
let(:terminal) { FakeTerminal.new }
|
12
|
+
let(:commit_id) { base_repo.git('rev-parse HEAD').strip }
|
13
|
+
let(:repo_name) { 'my_awesome_repo' }
|
14
|
+
|
15
|
+
before(:each) do
|
16
|
+
add_user_to(base_repo)
|
17
|
+
base_repo.git("remote add origin git@github.com/camertron/#{repo_name}")
|
18
|
+
base_repo.create_file('file.txt') { |f| f.write('hello, world') }
|
19
|
+
base_repo.add_all
|
20
|
+
base_repo.commit('Initial commit')
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'from_argv' do
|
24
|
+
it 'exits and prints message when not given a file pattern' do
|
25
|
+
expect do
|
26
|
+
PullCommandArgs.from_argv(
|
27
|
+
[commit_id, '--serializer', 'foo/bar'], repo, terminal
|
28
|
+
)
|
29
|
+
end.to raise_error(SystemExit)
|
30
|
+
|
31
|
+
expect(terminal).to have_said(
|
32
|
+
'Please supply a file pattern via the -f option'
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'exits and prints message when not given a serializer' do
|
37
|
+
expect do
|
38
|
+
PullCommandArgs.from_argv(
|
39
|
+
[commit_id, '--file-pattern', 'teapot'], repo, terminal
|
40
|
+
)
|
41
|
+
end.to raise_error(SystemExit)
|
42
|
+
|
43
|
+
expect(terminal).to have_said(
|
44
|
+
'Please supply a serializer via the -s option'
|
45
|
+
)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'base64'
|
5
|
+
|
6
|
+
include Rosette::Client
|
7
|
+
include Rosette::Client::Commands
|
8
|
+
|
9
|
+
describe PullCommand do
|
10
|
+
let(:api) { double }
|
11
|
+
let(:base_repo) { TmpRepo.new }
|
12
|
+
let(:repo) { Repo.new(base_repo.working_dir) }
|
13
|
+
let(:terminal) { FakeTerminal.new }
|
14
|
+
let(:writer) { FakeWriter.new }
|
15
|
+
let(:repo_name) { 'my_awesome_repo' }
|
16
|
+
let(:commit_id) { base_repo.git('rev-parse HEAD').strip }
|
17
|
+
let(:serializer) { 'yaml/rails' }
|
18
|
+
let(:file_pattern) { 'config/locales/%{locale.code}.yml' }
|
19
|
+
let(:command) do
|
20
|
+
PullCommand.new(
|
21
|
+
api, terminal, writer, repo, [
|
22
|
+
commit_id, "-f #{file_pattern}", "-s #{serializer}"
|
23
|
+
]
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
let(:locales) do
|
28
|
+
[
|
29
|
+
{
|
30
|
+
'code' => 'ja-JP',
|
31
|
+
'language' => 'ja',
|
32
|
+
'territory' => 'JP'
|
33
|
+
}, {
|
34
|
+
'code' => 'pt-BR',
|
35
|
+
'language' => 'pt',
|
36
|
+
'territory' => 'BR'
|
37
|
+
}
|
38
|
+
]
|
39
|
+
end
|
40
|
+
|
41
|
+
let(:params) do
|
42
|
+
{
|
43
|
+
repo_name: repo_name,
|
44
|
+
ref: commit_id,
|
45
|
+
serializer: serializer,
|
46
|
+
base_64_encode: true
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
before(:each) do
|
51
|
+
add_user_to(base_repo)
|
52
|
+
base_repo.git("remote add origin git@github.com/camertron/#{repo_name}")
|
53
|
+
base_repo.create_file('file.txt') { |f| f.write('hello, world') }
|
54
|
+
base_repo.add_all
|
55
|
+
base_repo.commit('Initial commit')
|
56
|
+
end
|
57
|
+
|
58
|
+
around(:each) do |example|
|
59
|
+
Dir.chdir(base_repo.working_dir) do
|
60
|
+
example.run
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'with a mocked list of locales' do
|
65
|
+
before(:each) do
|
66
|
+
expect(api).to receive(:locales)
|
67
|
+
.with(repo_name: repo_name)
|
68
|
+
.and_return(Response.from_api_response(locales))
|
69
|
+
|
70
|
+
locales.each do |locale|
|
71
|
+
expect(api).to receive(:export)
|
72
|
+
.with(params.merge(locale: locale['code']))
|
73
|
+
.and_return(
|
74
|
+
Response.from_api_response({
|
75
|
+
'payload' => Base64.encode64("payload for #{locale['code']}")
|
76
|
+
})
|
77
|
+
)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe '#execute' do
|
82
|
+
it 'exports translations for each locale' do
|
83
|
+
command.execute
|
84
|
+
|
85
|
+
locales.each do |locale|
|
86
|
+
file = file_pattern % { :'locale.code' => locale['code'] }
|
87
|
+
expect(writer).to have_written_content_for(file)
|
88
|
+
expect(writer.contents_of(file)).to eq("payload for #{locale['code']}")
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'with a territory-based file pattern' do
|
93
|
+
let(:file_pattern) { 'config/locales/%{locale.territory}.yml' }
|
94
|
+
|
95
|
+
it 'exports translations for each locale' do
|
96
|
+
command.execute
|
97
|
+
|
98
|
+
locales.each do |locale|
|
99
|
+
file = file_pattern % { :'locale.territory' => locale['territory'] }
|
100
|
+
expect(writer).to have_written_content_for(file)
|
101
|
+
expect(writer.contents_of(file)).to eq("payload for #{locale['code']}")
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context 'with a language-based file pattern' do
|
107
|
+
let(:file_pattern) { 'config/locales/%{locale.language}.yml' }
|
108
|
+
|
109
|
+
it 'exports translations for each locale' do
|
110
|
+
command.execute
|
111
|
+
|
112
|
+
locales.each do |locale|
|
113
|
+
file = file_pattern % { :'locale.language' => locale['language'] }
|
114
|
+
expect(writer).to have_written_content_for(file)
|
115
|
+
expect(writer.contents_of(file)).to eq("payload for #{locale['code']}")
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -10,9 +10,14 @@ describe RepoSnapshotCommand do
|
|
10
10
|
let(:base_repo) { TmpRepo.new }
|
11
11
|
let(:repo) { Repo.new(base_repo.working_dir) }
|
12
12
|
let(:terminal) { FakeTerminal.new }
|
13
|
+
let(:writer) { FakeWriter.new }
|
13
14
|
let(:repo_name) { 'my_awesome_repo' }
|
14
15
|
let(:commit_id) { base_repo.git('rev-parse HEAD').strip }
|
15
|
-
let(:command)
|
16
|
+
let(:command) do
|
17
|
+
RepoSnapshotCommand.new(
|
18
|
+
api, terminal, writer, repo, [commit_id]
|
19
|
+
)
|
20
|
+
end
|
16
21
|
|
17
22
|
before(:each) do
|
18
23
|
add_user_to(base_repo)
|
@@ -32,7 +37,7 @@ describe RepoSnapshotCommand do
|
|
32
37
|
it 'makes a repo_snapshot api call' do
|
33
38
|
expect(api).to receive(:repo_snapshot)
|
34
39
|
.with(repo_name: repo_name, ref: commit_id)
|
35
|
-
.and_return(Response.
|
40
|
+
.and_return(Response.from_api_response({}))
|
36
41
|
|
37
42
|
command.execute
|
38
43
|
end
|
@@ -41,7 +46,7 @@ describe RepoSnapshotCommand do
|
|
41
46
|
expect(api).to receive(:repo_snapshot)
|
42
47
|
.with(repo_name: repo_name, ref: commit_id)
|
43
48
|
.and_return(
|
44
|
-
Response.
|
49
|
+
Response.from_api_response({
|
45
50
|
'file1.txt' => 'abc123',
|
46
51
|
'path/file2.txt' => 'def456',
|
47
52
|
'my/awesome/file3.rb' => 'ghi789'
|
@@ -59,7 +64,7 @@ describe RepoSnapshotCommand do
|
|
59
64
|
expect(api).to receive(:repo_snapshot)
|
60
65
|
.with(repo_name: repo_name, ref: commit_id)
|
61
66
|
.and_return(
|
62
|
-
Response.
|
67
|
+
Response.from_api_response({ 'error' => 'Jelly beans', 'file1.txt' => 'abc123' })
|
63
68
|
)
|
64
69
|
|
65
70
|
command.execute
|
@@ -10,9 +10,10 @@ describe ShowCommand do
|
|
10
10
|
let(:base_repo) { TmpRepo.new }
|
11
11
|
let(:repo) { Repo.new(base_repo.working_dir) }
|
12
12
|
let(:terminal) { FakeTerminal.new }
|
13
|
+
let(:writer) { FakeWriter.new }
|
13
14
|
let(:repo_name) { 'my_awesome_repo' }
|
14
15
|
let(:commit_id) { base_repo.git('rev-parse HEAD').strip }
|
15
|
-
let(:command) { ShowCommand.new(api, terminal, repo, [commit_id]) }
|
16
|
+
let(:command) { ShowCommand.new(api, terminal, writer, repo, [commit_id]) }
|
16
17
|
|
17
18
|
before(:each) do
|
18
19
|
add_user_to(base_repo)
|
@@ -32,7 +33,7 @@ describe ShowCommand do
|
|
32
33
|
it 'makes a commit api call' do
|
33
34
|
expect(api).to receive(:show)
|
34
35
|
.with(repo_name: repo_name, ref: commit_id)
|
35
|
-
.and_return(Response.
|
36
|
+
.and_return(Response.from_api_response({}))
|
36
37
|
|
37
38
|
command.execute
|
38
39
|
end
|
@@ -41,7 +42,7 @@ describe ShowCommand do
|
|
41
42
|
expect(api).to receive(:show)
|
42
43
|
.with(repo_name: repo_name, ref: commit_id)
|
43
44
|
.and_return(
|
44
|
-
Response.
|
45
|
+
Response.from_api_response(sample_diff(commit_id))
|
45
46
|
)
|
46
47
|
|
47
48
|
command.execute
|
@@ -60,7 +61,9 @@ describe ShowCommand do
|
|
60
61
|
expect(api).to receive(:show)
|
61
62
|
.with(repo_name: repo_name, ref: commit_id)
|
62
63
|
.and_return(
|
63
|
-
Response.
|
64
|
+
Response.from_api_response(
|
65
|
+
{ 'error' => 'Jelly beans' }.merge(sample_diff(commit_id))
|
66
|
+
)
|
64
67
|
)
|
65
68
|
|
66
69
|
command.execute
|
@@ -10,9 +10,10 @@ describe SnapshotCommand do
|
|
10
10
|
let(:base_repo) { TmpRepo.new }
|
11
11
|
let(:repo) { Repo.new(base_repo.working_dir) }
|
12
12
|
let(:terminal) { FakeTerminal.new }
|
13
|
+
let(:writer) { FakeWriter.new }
|
13
14
|
let(:repo_name) { 'my_awesome_repo' }
|
14
15
|
let(:commit_id) { base_repo.git('rev-parse HEAD').strip }
|
15
|
-
let(:command) { SnapshotCommand.new(api, terminal, repo, [commit_id]) }
|
16
|
+
let(:command) { SnapshotCommand.new(api, terminal, writer, repo, [commit_id]) }
|
16
17
|
|
17
18
|
before(:each) do
|
18
19
|
add_user_to(base_repo)
|
@@ -32,7 +33,7 @@ describe SnapshotCommand do
|
|
32
33
|
it 'makes a snapshot api call' do
|
33
34
|
expect(api).to receive(:snapshot)
|
34
35
|
.with(repo_name: repo_name, ref: commit_id)
|
35
|
-
.and_return(Response.
|
36
|
+
.and_return(Response.from_api_response({}))
|
36
37
|
|
37
38
|
command.execute
|
38
39
|
end
|
@@ -41,7 +42,7 @@ describe SnapshotCommand do
|
|
41
42
|
expect(api).to receive(:snapshot)
|
42
43
|
.with(repo_name: repo_name, ref: commit_id)
|
43
44
|
.and_return(
|
44
|
-
Response.
|
45
|
+
Response.from_api_response([
|
45
46
|
{ 'key' => 'Foo', 'commit_id' => 'abc123' },
|
46
47
|
{ 'key' => 'Bar', 'commit_id' => 'def456' },
|
47
48
|
{ 'key' => 'Baz', 'commit_id' => 'ghi789' }
|
@@ -62,7 +63,7 @@ describe SnapshotCommand do
|
|
62
63
|
expect(api).to receive(:snapshot)
|
63
64
|
.with(repo_name: repo_name, ref: commit_id)
|
64
65
|
.and_return(
|
65
|
-
Response.
|
66
|
+
Response.from_api_response({ 'error' => 'Jelly beans' })
|
66
67
|
)
|
67
68
|
|
68
69
|
command.execute
|
@@ -10,9 +10,10 @@ describe StatusCommand do
|
|
10
10
|
let(:base_repo) { TmpRepo.new }
|
11
11
|
let(:repo) { Repo.new(base_repo.working_dir) }
|
12
12
|
let(:terminal) { FakeTerminal.new }
|
13
|
+
let(:writer) { FakeWriter.new }
|
13
14
|
let(:repo_name) { 'my_awesome_repo' }
|
14
15
|
let(:commit_id) { base_repo.git('rev-parse HEAD').strip }
|
15
|
-
let(:command) { StatusCommand.new(api, terminal, repo, [commit_id]) }
|
16
|
+
let(:command) { StatusCommand.new(api, terminal, writer, repo, [commit_id]) }
|
16
17
|
|
17
18
|
before(:each) do
|
18
19
|
add_user_to(base_repo)
|
@@ -32,7 +33,7 @@ describe StatusCommand do
|
|
32
33
|
it 'makes a commit api call' do
|
33
34
|
expect(api).to receive(:status)
|
34
35
|
.with(repo_name: repo_name, ref: commit_id)
|
35
|
-
.and_return(Response.
|
36
|
+
.and_return(Response.from_api_response({}))
|
36
37
|
|
37
38
|
command.execute
|
38
39
|
end
|
@@ -41,7 +42,7 @@ describe StatusCommand do
|
|
41
42
|
expect(api).to receive(:status)
|
42
43
|
.with(repo_name: repo_name, ref: commit_id)
|
43
44
|
.and_return(
|
44
|
-
Response.
|
45
|
+
Response.from_api_response({
|
45
46
|
'commit_id' => commit_id,
|
46
47
|
'status' => 'UNTRANSLATED',
|
47
48
|
'phrase_count' => 10,
|
@@ -67,7 +68,7 @@ describe StatusCommand do
|
|
67
68
|
expect(api).to receive(:status)
|
68
69
|
.with(repo_name: repo_name, ref: commit_id)
|
69
70
|
.and_return(
|
70
|
-
Response.
|
71
|
+
Response.from_api_response({ 'error' => 'Jelly beans' })
|
71
72
|
)
|
72
73
|
|
73
74
|
command.execute
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
class FakeWriter
|
4
|
+
attr_reader :streams
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@streams = {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def open(file, mode)
|
11
|
+
streams[file] ||= StringIO.new
|
12
|
+
yield streams[file]
|
13
|
+
end
|
14
|
+
|
15
|
+
def contents_of(file)
|
16
|
+
streams[file].string
|
17
|
+
end
|
18
|
+
|
19
|
+
def has_written_content_for?(file)
|
20
|
+
streams.include?(file)
|
21
|
+
end
|
22
|
+
end
|
data/spec/response_spec.rb
CHANGED
@@ -5,7 +5,34 @@ require 'spec_helper'
|
|
5
5
|
include Rosette::Client
|
6
6
|
|
7
7
|
describe Response do
|
8
|
-
|
8
|
+
describe 'from_api_response' do
|
9
|
+
it 'accepts a hash of attributes and returns an instance of HashResponse' do
|
10
|
+
response = Response.from_api_response({ 'foo' => 'bar' })
|
11
|
+
expect(response).to be_a(HashResponse)
|
12
|
+
expect(response.attributes).to eq({ 'foo' => 'bar' })
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'accepts an array and returns an instance of ArrayResponse' do
|
16
|
+
response = Response.from_api_response(['foo', 'bar'])
|
17
|
+
expect(response).to be_a(ArrayResponse)
|
18
|
+
expect(response.attributes).to eq(['foo', 'bar'])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe ArrayResponse do
|
24
|
+
let(:response_class) { ArrayResponse }
|
25
|
+
|
26
|
+
describe '#attributes' do
|
27
|
+
it 'returns itself' do
|
28
|
+
response = response_class.new(['foo', 'bar'])
|
29
|
+
expect(response.attributes).to eq(['foo', 'bar'])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe HashResponse do
|
35
|
+
let(:response_class) { HashResponse }
|
9
36
|
|
10
37
|
it 'responds to methods that are also keys in the attributes hash' do
|
11
38
|
response = response_class.new({ 'hello' => 'world' })
|
@@ -17,14 +44,6 @@ describe Response do
|
|
17
44
|
expect(response.nothing).to be_nil
|
18
45
|
end
|
19
46
|
|
20
|
-
describe 'from_api_response' do
|
21
|
-
it 'accepts a hash of attributes and returns an instance of Response' do
|
22
|
-
response = response_class.from_api_response({ 'foo' => 'bar' })
|
23
|
-
expect(response).to be_a(response_class)
|
24
|
-
expect(response.attributes).to eq({ 'foo' => 'bar' })
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
47
|
describe '#error?' do
|
29
48
|
it 'returns true if the attributes hash contains an "error" key' do
|
30
49
|
response = response_class.new({ 'error' => 'jelly beans' })
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,45 +1,44 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rosette-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cameron Dutro
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: colorize
|
15
14
|
requirement: !ruby/object:Gem::Requirement
|
16
15
|
requirements:
|
17
16
|
- - ~>
|
18
17
|
- !ruby/object:Gem::Version
|
19
18
|
version: 0.7.0
|
20
|
-
|
19
|
+
name: colorize
|
21
20
|
prerelease: false
|
21
|
+
type: :runtime
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.7.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: json
|
29
28
|
requirement: !ruby/object:Gem::Requirement
|
30
29
|
requirements:
|
31
30
|
- - ~>
|
32
31
|
- !ruby/object:Gem::Version
|
33
32
|
version: 1.8.0
|
34
|
-
|
33
|
+
name: json
|
35
34
|
prerelease: false
|
35
|
+
type: :runtime
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 1.8.0
|
41
|
-
description: Git command integration for the Rosette internationalization platform
|
42
|
-
that manages the translatable content in the source files of a git repository.
|
41
|
+
description: Git command integration for the Rosette internationalization platform that manages the translatable content in the source files of a git repository.
|
43
42
|
email:
|
44
43
|
- camertron@gmail.com
|
45
44
|
executables:
|
@@ -47,33 +46,38 @@ executables:
|
|
47
46
|
extensions: []
|
48
47
|
extra_rdoc_files: []
|
49
48
|
files:
|
49
|
+
- lib/rosette/client.rb
|
50
50
|
- lib/rosette/client/api.rb
|
51
51
|
- lib/rosette/client/cli.rb
|
52
|
+
- lib/rosette/client/commands.rb
|
53
|
+
- lib/rosette/client/repo.rb
|
54
|
+
- lib/rosette/client/response.rb
|
55
|
+
- lib/rosette/client/terminal.rb
|
56
|
+
- lib/rosette/client/version.rb
|
57
|
+
- lib/rosette/client/writer.rb
|
52
58
|
- lib/rosette/client/commands/commit_command.rb
|
53
59
|
- lib/rosette/client/commands/diff_command.rb
|
60
|
+
- lib/rosette/client/commands/pull_command.rb
|
54
61
|
- lib/rosette/client/commands/repo_snapshot_command.rb
|
55
62
|
- lib/rosette/client/commands/show_command.rb
|
56
63
|
- lib/rosette/client/commands/snapshot_command.rb
|
57
64
|
- lib/rosette/client/commands/status_command.rb
|
58
|
-
- lib/rosette/client/commands.rb
|
59
|
-
- lib/rosette/client/repo.rb
|
60
|
-
- lib/rosette/client/response.rb
|
61
|
-
- lib/rosette/client/terminal.rb
|
62
|
-
- lib/rosette/client/version.rb
|
63
|
-
- lib/rosette/client.rb
|
64
65
|
- spec/api_spec.rb
|
65
66
|
- spec/cli_spec.rb
|
67
|
+
- spec/repo_spec.rb
|
68
|
+
- spec/response_spec.rb
|
69
|
+
- spec/spec_helper.rb
|
70
|
+
- spec/terminal_spec.rb
|
66
71
|
- spec/commands/commit_command_spec.rb
|
67
72
|
- spec/commands/diff_command_spec.rb
|
73
|
+
- spec/commands/pull_command_args_spec.rb
|
74
|
+
- spec/commands/pull_command_spec.rb
|
68
75
|
- spec/commands/repo_snapshot_command_spec.rb
|
69
76
|
- spec/commands/show_command_spec.rb
|
70
77
|
- spec/commands/snapshot_command_spec.rb
|
71
78
|
- spec/commands/status_command_spec.rb
|
72
79
|
- spec/helpers/fake_terminal.rb
|
73
|
-
- spec/
|
74
|
-
- spec/response_spec.rb
|
75
|
-
- spec/spec_helper.rb
|
76
|
-
- spec/terminal_spec.rb
|
80
|
+
- spec/helpers/fake_writer.rb
|
77
81
|
- Gemfile
|
78
82
|
- History.txt
|
79
83
|
- README.md
|
@@ -83,7 +87,7 @@ files:
|
|
83
87
|
homepage: http://github.com/camertron
|
84
88
|
licenses: []
|
85
89
|
metadata: {}
|
86
|
-
post_install_message:
|
90
|
+
post_install_message:
|
87
91
|
rdoc_options: []
|
88
92
|
require_paths:
|
89
93
|
- lib
|
@@ -98,11 +102,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
102
|
- !ruby/object:Gem::Version
|
99
103
|
version: '0'
|
100
104
|
requirements: []
|
101
|
-
rubyforge_project:
|
102
|
-
rubygems_version: 2.
|
103
|
-
signing_key:
|
105
|
+
rubyforge_project:
|
106
|
+
rubygems_version: 2.1.9
|
107
|
+
signing_key:
|
104
108
|
specification_version: 4
|
105
|
-
summary: Git command integration for the Rosette internationalization platform that
|
106
|
-
manages the translatable content in the source files of a git repository.
|
109
|
+
summary: Git command integration for the Rosette internationalization platform that manages the translatable content in the source files of a git repository.
|
107
110
|
test_files: []
|
108
111
|
has_rdoc: true
|