txgh 6.0.6 → 6.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/txgh.rb +0 -20
- data/lib/txgh/github_status.rb +57 -13
- data/lib/txgh/puller.rb +19 -19
- data/lib/txgh/pusher.rb +20 -7
- data/lib/txgh/resource_committer.rb +11 -19
- data/lib/txgh/resource_updater.rb +4 -12
- data/lib/txgh/version.rb +1 -1
- data/spec/github_status_spec.rb +13 -4
- data/spec/resource_committer_spec.rb +1 -1
- data/spec/resource_updater_spec.rb +1 -1
- data/spec/txgh_spec.rb +0 -26
- data/txgh.gemspec +1 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8ae06a79685c5a616fd334f7c4148b54377b840
|
4
|
+
data.tar.gz: f10e42acd8b9300f96182ebe1dc8786def18a224
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f8cfe3fe65b5e0c637e115c4f45d52cb4fc184fe581fabd4259b60060578c430f476fe3b9f13d0f184d620f1fa9657057a35f24ab915349563b2af9ab7519ea
|
7
|
+
data.tar.gz: d09b4cd10c3ee78012536adafc821806e5e9d7f35f043635b4de3a5e26b77d5fe47f58f845dfd7f18fe9c1800e3dcc66df3b3d3dcf0708dae42bd7c02e2f7a13
|
data/lib/txgh.rb
CHANGED
@@ -45,18 +45,6 @@ module Txgh
|
|
45
45
|
@events ||= Events.new
|
46
46
|
end
|
47
47
|
|
48
|
-
def update_status_callback(options)
|
49
|
-
project = options.fetch(:project)
|
50
|
-
repo = options.fetch(:repo)
|
51
|
-
resource = options.fetch(:resource)
|
52
|
-
|
53
|
-
GithubStatus.new(project, repo, resource).update(options.fetch(:sha))
|
54
|
-
rescue Octokit::UnprocessableEntity
|
55
|
-
# raised because we've tried to create too many statuses for the commit
|
56
|
-
rescue Txgh::TransifexNotFoundError
|
57
|
-
# raised if transifex resource can't be found
|
58
|
-
end
|
59
|
-
|
60
48
|
def env
|
61
49
|
ENV.fetch('TXGH_ENV', DEFAULT_ENV)
|
62
50
|
end
|
@@ -70,12 +58,4 @@ module Txgh
|
|
70
58
|
# default set of base config providers
|
71
59
|
key_manager.register_provider(providers::FileProvider, YAML)
|
72
60
|
key_manager.register_provider(providers::RawProvider, YAML)
|
73
|
-
|
74
|
-
events.subscribe('transifex.resource.updated') do |options|
|
75
|
-
update_status_callback(options)
|
76
|
-
end
|
77
|
-
|
78
|
-
events.subscribe('github.resource.committed') do |options|
|
79
|
-
update_status_callback(options)
|
80
|
-
end
|
81
61
|
end
|
data/lib/txgh/github_status.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'celluloid/current'
|
2
|
+
|
1
3
|
module Txgh
|
2
4
|
class GithubStatus
|
3
5
|
class State
|
@@ -15,19 +17,29 @@ module Txgh
|
|
15
17
|
end
|
16
18
|
|
17
19
|
ALL_COMPLETE_DESCRIPTION = "Translations complete!"
|
18
|
-
TARGET_URL_TEMPLATE = "https://www.transifex.com/%{organization}/%{project_slug}
|
20
|
+
TARGET_URL_TEMPLATE = "https://www.transifex.com/%{organization}/%{project_slug}/content"
|
19
21
|
DESCRIPTION_TEMPLATE = "%{complete}/%{total} translations complete."
|
20
22
|
CONTEXT = 'continuous-localization/txgh'
|
21
23
|
|
22
|
-
|
24
|
+
class << self
|
25
|
+
def update(project, repo, branch)
|
26
|
+
new(project, repo, branch).update
|
27
|
+
end
|
28
|
+
end
|
23
29
|
|
24
|
-
|
30
|
+
attr_reader :project, :repo, :branch
|
31
|
+
|
32
|
+
def initialize(project, repo, branch)
|
25
33
|
@project = project
|
26
34
|
@repo = repo
|
27
|
-
@
|
35
|
+
@branch = branch
|
28
36
|
end
|
29
37
|
|
30
|
-
def update
|
38
|
+
def update
|
39
|
+
return if tx_resources.empty?
|
40
|
+
|
41
|
+
sha = repo.api.get_ref(branch)[:object][:sha]
|
42
|
+
|
31
43
|
repo.api.create_status(
|
32
44
|
sha, state, {
|
33
45
|
context: context, target_url: target_url, description: description
|
@@ -42,10 +54,10 @@ module Txgh
|
|
42
54
|
end
|
43
55
|
|
44
56
|
def target_url
|
57
|
+
# assume all resources are from the same project
|
45
58
|
TARGET_URL_TEMPLATE % {
|
46
59
|
organization: project.organization,
|
47
|
-
project_slug:
|
48
|
-
resource_slug: tx_resource.resource_slug
|
60
|
+
project_slug: tx_resources.first.project_slug
|
49
61
|
}
|
50
62
|
end
|
51
63
|
|
@@ -66,22 +78,54 @@ module Txgh
|
|
66
78
|
end
|
67
79
|
|
68
80
|
def all_complete?
|
69
|
-
stats.all? do |
|
70
|
-
|
81
|
+
stats.all? do |resource_stats|
|
82
|
+
resource_stats.all? do |locale, details|
|
83
|
+
details['completed'] == '100%'
|
84
|
+
end
|
71
85
|
end
|
72
86
|
end
|
73
87
|
|
74
88
|
def stat_totals
|
75
89
|
@stat_totals ||= { complete: 0, total: 0 }.tap do |counts|
|
76
|
-
stats.
|
77
|
-
|
78
|
-
|
90
|
+
stats.each do |resource_stats|
|
91
|
+
resource_stats.each_pair do |locale, details|
|
92
|
+
counts[:total] += details['translated_entities'] + details['untranslated_entities']
|
93
|
+
counts[:complete] += details['translated_entities']
|
94
|
+
end
|
79
95
|
end
|
80
96
|
end
|
81
97
|
end
|
82
98
|
|
83
99
|
def stats
|
84
|
-
@stats ||=
|
100
|
+
@stats ||= tx_resources.map do |tx_resource|
|
101
|
+
Celluloid::Future.new { project.api.get_stats(*tx_resource.slugs) }
|
102
|
+
end.map(&:value)
|
103
|
+
end
|
104
|
+
|
105
|
+
def tx_resources
|
106
|
+
@tx_resources ||=
|
107
|
+
tx_config.resources.each_with_object([]) do |tx_resource, ret|
|
108
|
+
if repo.process_all_branches?
|
109
|
+
tx_resource = Txgh::TxBranchResource.new(tx_resource, branch)
|
110
|
+
end
|
111
|
+
|
112
|
+
next unless existing_slugs.include?(tx_resource.resource_slug)
|
113
|
+
ret << tx_resource
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def existing_slugs
|
118
|
+
@existing_slugs ||= existing_resources.map do |resource|
|
119
|
+
resource['slug']
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def existing_resources
|
124
|
+
@existing_resources ||= project.api.get_resources(project.name)
|
125
|
+
end
|
126
|
+
|
127
|
+
def tx_config
|
128
|
+
@tx_config ||= Txgh::Config::TxManager.tx_config(project, repo, branch)
|
85
129
|
end
|
86
130
|
end
|
87
131
|
end
|
data/lib/txgh/puller.rb
CHANGED
@@ -9,23 +9,35 @@ module Txgh
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def pull
|
12
|
-
|
12
|
+
existing_resources = project.api.get_resources(project.name)
|
13
|
+
slugs = existing_resources.map { |resource| resource['slug'] }
|
14
|
+
|
15
|
+
resources = tx_config.resources.each_with_object([]) do |tx_resource, ret|
|
13
16
|
if repo.process_all_branches?
|
14
17
|
tx_resource = Txgh::TxBranchResource.new(tx_resource, branch)
|
15
18
|
end
|
16
19
|
|
17
|
-
|
20
|
+
next unless slugs.include?(tx_resource.resource_slug)
|
21
|
+
ret << tx_resource
|
22
|
+
end
|
23
|
+
|
24
|
+
pull_resources(resources, &block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def pull_resources(tx_resources, languages = nil)
|
28
|
+
tx_resources.each do |tx_resource|
|
29
|
+
pull_resource(tx_resource, languages)
|
18
30
|
end
|
19
31
|
end
|
20
32
|
|
21
|
-
def pull_resource(tx_resource)
|
22
|
-
|
23
|
-
committer.commit_resource(tx_resource, branch,
|
33
|
+
def pull_resource(tx_resource, languages = nil)
|
34
|
+
(languages || project.languages).each do |language|
|
35
|
+
committer.commit_resource(tx_resource, branch, language)
|
24
36
|
end
|
25
37
|
end
|
26
38
|
|
27
|
-
def pull_slug(resource_slug)
|
28
|
-
pull_resource(tx_config.resource(resource_slug, branch))
|
39
|
+
def pull_slug(resource_slug, languages = nil)
|
40
|
+
pull_resource(tx_config.resource(resource_slug, branch), languages)
|
29
41
|
end
|
30
42
|
|
31
43
|
private
|
@@ -34,18 +46,6 @@ module Txgh
|
|
34
46
|
@committer ||= Txgh::ResourceCommitter.new(project, repo)
|
35
47
|
end
|
36
48
|
|
37
|
-
def each_language
|
38
|
-
return to_enum(__method__) unless block_given?
|
39
|
-
|
40
|
-
languages.each do |language|
|
41
|
-
language_code = language['language_code']
|
42
|
-
|
43
|
-
if project.supported_language?(language_code)
|
44
|
-
yield language_code
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
49
|
def languages
|
50
50
|
@languages ||= project.api.get_languages(project.name)
|
51
51
|
end
|
data/lib/txgh/pusher.rb
CHANGED
@@ -8,22 +8,35 @@ module Txgh
|
|
8
8
|
@branch = branch
|
9
9
|
end
|
10
10
|
|
11
|
-
def push
|
12
|
-
|
11
|
+
def push(&block)
|
12
|
+
existing_resources = project.api.get_resources(project.name)
|
13
|
+
slugs = existing_resources.map { |resource| resource['slug'] }
|
14
|
+
|
15
|
+
resources = tx_config.resources.each_with_object([]) do |tx_resource, ret|
|
13
16
|
if repo.process_all_branches?
|
14
17
|
tx_resource = Txgh::TxBranchResource.new(tx_resource, branch)
|
15
18
|
end
|
16
19
|
|
17
|
-
|
20
|
+
next unless slugs.include?(tx_resource.resource_slug)
|
21
|
+
ret << tx_resource
|
22
|
+
end
|
23
|
+
|
24
|
+
push_resources(resources, &block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def push_resources(tx_resources, &block)
|
28
|
+
tx_resources.each do |tx_resource|
|
29
|
+
categories = block_given? ? yield(tx_resource) : {}
|
30
|
+
push_resource(tx_resource, categories)
|
18
31
|
end
|
19
32
|
end
|
20
33
|
|
21
|
-
def push_resource(tx_resource)
|
22
|
-
updater.update_resource(tx_resource)
|
34
|
+
def push_resource(tx_resource, categories = {})
|
35
|
+
updater.update_resource(tx_resource, categories)
|
23
36
|
end
|
24
37
|
|
25
|
-
def push_slug(resource_slug)
|
26
|
-
push_resource(tx_config.resource(resource_slug, branch))
|
38
|
+
def push_slug(resource_slug, categories = {})
|
39
|
+
push_resource(tx_config.resource(resource_slug, branch), categories)
|
27
40
|
end
|
28
41
|
|
29
42
|
private
|
@@ -12,35 +12,27 @@ module Txgh
|
|
12
12
|
|
13
13
|
def commit_resource(tx_resource, branch, language)
|
14
14
|
return if prevent_commit_on?(branch)
|
15
|
+
return if language == tx_resource.source_lang
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
message = commit_message_for(language, file_name)
|
17
|
+
file_name, translations = download(tx_resource, branch, language)
|
18
|
+
message = commit_message_for(language, file_name)
|
19
19
|
|
20
|
-
|
21
|
-
repo.api.update_contents(
|
22
|
-
branch, [{ path: file_name, contents: translations }], message
|
23
|
-
)
|
20
|
+
return unless translations
|
24
21
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
def fire_event_for(tx_resource, branch, language)
|
33
|
-
head = repo.api.get_ref(branch)
|
34
|
-
sha = head[:object][:sha]
|
22
|
+
repo.api.update_contents(
|
23
|
+
branch, [{ path: file_name, contents: translations }], message
|
24
|
+
)
|
35
25
|
|
36
26
|
Txgh.events.publish(
|
37
27
|
'github.resource.committed', {
|
38
|
-
project: project, repo: repo, resource: tx_resource,
|
39
|
-
language: language
|
28
|
+
project: project, repo: repo, resource: tx_resource,
|
29
|
+
language: language, branch: branch
|
40
30
|
}
|
41
31
|
)
|
42
32
|
end
|
43
33
|
|
34
|
+
private
|
35
|
+
|
44
36
|
def download(tx_resource, branch, language)
|
45
37
|
downloader = ResourceDownloader.new(
|
46
38
|
project, repo, branch, {
|
@@ -24,24 +24,16 @@ module Txgh
|
|
24
24
|
upload_whole(tx_resource, file, categories)
|
25
25
|
end
|
26
26
|
|
27
|
-
fire_event_for(tx_resource, branch)
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
def fire_event_for(tx_resource, branch)
|
33
|
-
ref = repo.api.get_ref(branch)
|
34
|
-
|
35
27
|
Txgh.events.publish(
|
36
28
|
'transifex.resource.updated', {
|
37
|
-
project: project,
|
38
|
-
|
39
|
-
resource: tx_resource,
|
40
|
-
sha: ref[:object][:sha]
|
29
|
+
project: project, repo: repo, resource: tx_resource,
|
30
|
+
branch: tx_resource.branch
|
41
31
|
}
|
42
32
|
)
|
43
33
|
end
|
44
34
|
|
35
|
+
private
|
36
|
+
|
45
37
|
def upload_whole(tx_resource, file, categories)
|
46
38
|
if repo.process_all_branches?
|
47
39
|
upload_by_branch(tx_resource, file[:content], categories)
|
data/lib/txgh/version.rb
CHANGED
data/spec/github_status_spec.rb
CHANGED
@@ -7,8 +7,9 @@ describe GithubStatus do
|
|
7
7
|
include StandardTxghSetup
|
8
8
|
|
9
9
|
describe '#update' do
|
10
|
-
let(:status) { GithubStatus.new(transifex_project, github_repo,
|
10
|
+
let(:status) { GithubStatus.new(transifex_project, github_repo, branch) }
|
11
11
|
let(:resource) { tx_config.resource(resource_slug) }
|
12
|
+
let(:branch) { 'heads/master' }
|
12
13
|
let(:sha) { 'abc123shashasha' }
|
13
14
|
|
14
15
|
let(:stats) do
|
@@ -22,6 +23,14 @@ describe GithubStatus do
|
|
22
23
|
|
23
24
|
before(:each) do
|
24
25
|
allow(transifex_api).to receive(:get_stats).and_return(stats)
|
26
|
+
|
27
|
+
allow(transifex_api).to receive(:get_resources).and_return(
|
28
|
+
[{ 'slug' => resource.resource_slug }]
|
29
|
+
)
|
30
|
+
|
31
|
+
allow(github_api).to receive(:get_ref).and_return(
|
32
|
+
object: { sha: sha }
|
33
|
+
)
|
25
34
|
end
|
26
35
|
|
27
36
|
context 'with all resources at 100%' do
|
@@ -32,11 +41,11 @@ describe GithubStatus do
|
|
32
41
|
expect(options[:description]).to eq('Translations complete!')
|
33
42
|
expect(options[:context]).to eq('continuous-localization/txgh')
|
34
43
|
expect(options[:target_url]).to eq(
|
35
|
-
"https://www.transifex.com/#{organization}/#{project_name}
|
44
|
+
"https://www.transifex.com/#{organization}/#{project_name}/content"
|
36
45
|
)
|
37
46
|
end
|
38
47
|
|
39
|
-
status.update
|
48
|
+
status.update
|
40
49
|
end
|
41
50
|
end
|
42
51
|
|
@@ -60,7 +69,7 @@ describe GithubStatus do
|
|
60
69
|
expect(options[:description]).to eq('15/20 translations complete.')
|
61
70
|
end
|
62
71
|
|
63
|
-
status.update
|
72
|
+
status.update
|
64
73
|
end
|
65
74
|
end
|
66
75
|
end
|
@@ -52,7 +52,7 @@ describe ResourceCommitter do
|
|
52
52
|
options = event[:options]
|
53
53
|
expect(options[:project].name).to eq(project_name)
|
54
54
|
expect(options[:repo].name).to eq(repo_name)
|
55
|
-
expect(options[:
|
55
|
+
expect(options[:branch]).to eq(branch)
|
56
56
|
expect(options[:resource].original_resource_slug).to eq(resource_slug)
|
57
57
|
expect(options[:language]).to eq(language)
|
58
58
|
end
|
@@ -67,7 +67,7 @@ describe ResourceUpdater do
|
|
67
67
|
options = event[:options]
|
68
68
|
expect(options[:project].name).to eq(project_name)
|
69
69
|
expect(options[:repo].name).to eq(repo_name)
|
70
|
-
expect(options[:
|
70
|
+
expect(options[:branch]).to eq(ref)
|
71
71
|
expect(options[:resource].original_resource_slug).to eq(resource_slug)
|
72
72
|
end
|
73
73
|
|
data/spec/txgh_spec.rb
CHANGED
@@ -30,30 +30,4 @@ describe Txgh do
|
|
30
30
|
expect(instance.provider.scheme).to eq('raw')
|
31
31
|
end
|
32
32
|
end
|
33
|
-
|
34
|
-
describe '#update_status_callback' do
|
35
|
-
it 'handles github errors' do
|
36
|
-
expect_any_instance_of(Txgh::GithubStatus).to(
|
37
|
-
receive(:update).and_raise(Octokit::UnprocessableEntity)
|
38
|
-
)
|
39
|
-
|
40
|
-
expect do
|
41
|
-
Txgh.update_status_callback(
|
42
|
-
project: nil, repo: nil, resource: nil, sha: nil
|
43
|
-
)
|
44
|
-
end.to_not raise_error
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'handles transifex errors' do
|
48
|
-
expect_any_instance_of(Txgh::GithubStatus).to(
|
49
|
-
receive(:update).and_raise(Txgh::TransifexNotFoundError)
|
50
|
-
)
|
51
|
-
|
52
|
-
expect do
|
53
|
-
Txgh.update_status_callback(
|
54
|
-
project: nil, repo: nil, resource: nil, sha: nil
|
55
|
-
)
|
56
|
-
end.to_not raise_error
|
57
|
-
end
|
58
|
-
end
|
59
33
|
end
|
data/txgh.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: txgh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0
|
4
|
+
version: 6.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew Jackowski
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-10-
|
12
|
+
date: 2016-10-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: abroad
|
@@ -25,6 +25,20 @@ dependencies:
|
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '4.1'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: celluloid
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
28
42
|
- !ruby/object:Gem::Dependency
|
29
43
|
name: faraday
|
30
44
|
requirement: !ruby/object:Gem::Requirement
|