txgh 6.0.3 → 6.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fea46b3b937fb4d5204da813883825b88962d76c
4
- data.tar.gz: 4328a0e1e98e36b47d043ab626de14bf2844cb94
3
+ metadata.gz: abf79e14e41fd8e48b6e4243491b6f7d167ea173
4
+ data.tar.gz: a53bb4779937d8b42fc4d24c4476d2b40e152d0b
5
5
  SHA512:
6
- metadata.gz: 8636abb2938a9e2443c01ec34693a9bb7cc2804d3f4eb787940b88fcd785c3e1e98fecae75384a30d165c0dbd2ffd13551de4187a1dd78bd8d57f4d55c1a6276
7
- data.tar.gz: f5b82b93eee9af4116fafaccd66fe2c3837c358677e620a5b99637192ca1f016496c3b3efca463631ee175ce70124f8d0a69f1d34e102331f26d7ec325692de3
6
+ metadata.gz: 544945c0b37aa982633d86d2925cbe458d4788a54db2b7a0d614a020befb8dfabda7e1b4dbb367c73a63d214e5ec1de2a1c21a80364384e0b5042ee16f2608c9
7
+ data.tar.gz: 795f05ae83fd6fd2fcf52a0a11f8613a29e05c42c50ee2a8b29ca8124c5355fe6f216588cc4cafc176b53c68b3cd2574c883d79fefd760b30cf9afb553b2f139
data/lib/txgh.rb CHANGED
@@ -19,7 +19,6 @@ module Txgh
19
19
  autoload :ResourceDeleter, 'txgh/resource_deleter'
20
20
  autoload :ResourceDownloader, 'txgh/resource_downloader'
21
21
  autoload :ResourceUpdater, 'txgh/resource_updater'
22
- autoload :ResponseHelpers, 'txgh/response_helpers'
23
22
  autoload :TransifexApi, 'txgh/transifex_api'
24
23
  autoload :TransifexProject, 'txgh/transifex_project'
25
24
  autoload :TxBranchResource, 'txgh/tx_branch_resource'
data/lib/txgh/errors.rb CHANGED
@@ -2,9 +2,26 @@ module Txgh
2
2
  class TxghError < StandardError; end
3
3
  class TxghInternalError < TxghError; end
4
4
 
5
- class TransifexApiError < StandardError; end
6
- class TransifexNotFoundError < TransifexApiError; end
7
- class TransifexUnauthorizedError < TransifexApiError; end
5
+ class TransifexApiError < StandardError
6
+ attr_reader :status_code
7
+
8
+ def initialize(message, status_code)
9
+ super(message)
10
+ @status_code = status_code
11
+ end
12
+ end
13
+
14
+ class TransifexNotFoundError < TransifexApiError
15
+ def initialize(message = 'Not found')
16
+ super(message, 404)
17
+ end
18
+ end
19
+
20
+ class TransifexUnauthorizedError < TransifexApiError
21
+ def initialize(message = 'Unauthorized')
22
+ super(message, 401)
23
+ end
24
+ end
8
25
 
9
26
  class InvalidProviderError < StandardError; end
10
27
 
data/lib/txgh/events.rb CHANGED
@@ -17,17 +17,22 @@ module Txgh
17
17
  callback.call(options)
18
18
  end
19
19
  rescue => e
20
- publish_error(e)
20
+ publish_error!(e)
21
21
  end
22
22
 
23
23
  def channels
24
24
  channel_hash.keys
25
25
  end
26
26
 
27
- def publish_error(e)
27
+ def publish_error(e, params = {})
28
+ callbacks = channel_hash.fetch(ERROR_CHANNEL) { [] }
29
+ callbacks.map { |callback| callback.call(e, params) }
30
+ end
31
+
32
+ def publish_error!(e, params = {})
28
33
  # if nobody has subscribed to error events, raise original error
29
34
  callbacks = channel_hash.fetch(ERROR_CHANNEL) { raise e }
30
- callbacks.each { |callback| callback.call(e) }
35
+ callbacks.map { |callback| callback.call(e, params) }
31
36
  end
32
37
  end
33
38
  end
@@ -34,17 +34,24 @@ module Txgh
34
34
  client.create_ref(repo_name, branch, sha) rescue false
35
35
  end
36
36
 
37
- def update_contents(branch, content_map, message)
38
- content_map.each do |path, new_contents|
37
+ def update_contents(branch, content_list, message)
38
+ content_list.each do |file_params|
39
+ path = file_params.fetch(:path)
40
+ new_contents = file_params.fetch(:contents)
39
41
  branch = Utils.relative_branch(branch)
40
42
 
41
- file = begin
42
- client.contents(repo_name, { path: path, ref: branch })
43
- rescue Octokit::NotFound
44
- nil
43
+ file_sha = file_params.fetch(:sha) do
44
+ begin
45
+ client.contents(repo_name, { path: path, ref: branch })[:sha]
46
+ rescue Octokit::NotFound
47
+ nil
48
+ end
45
49
  end
46
50
 
47
- current_sha = file ? file[:sha] : '0' * 40
51
+ # If the file doesnt exist, then it isn't tracked by git and file_sha
52
+ # will be nil. In git land, a SHA of all zeroes means create a new file
53
+ # instead of updating an existing one.
54
+ current_sha = file_sha || '0' * 40
48
55
  new_sha = Utils.git_hash_blob(new_contents)
49
56
  options = { branch: branch }
50
57
 
@@ -81,6 +88,5 @@ module Txgh
81
88
  def create_status(sha, state, options = {})
82
89
  client.create_status(repo_name, sha, state, options)
83
90
  end
84
-
85
91
  end
86
92
  end
@@ -19,7 +19,7 @@ module Txgh
19
19
 
20
20
  if translations
21
21
  repo.api.update_contents(
22
- branch, { file_name => translations }, message
22
+ branch, { path: file_name, contents: translations }, message
23
23
  )
24
24
 
25
25
  fire_event_for(tx_resource, branch, language)
@@ -24,15 +24,20 @@ module Txgh
24
24
  upload_whole(tx_resource, file, categories)
25
25
  end
26
26
 
27
- fire_event_for(tx_resource, file)
27
+ fire_event_for(tx_resource, branch)
28
28
  end
29
29
 
30
30
  private
31
31
 
32
- def fire_event_for(tx_resource, file)
32
+ def fire_event_for(tx_resource, branch)
33
+ ref = repo.api.get_ref(branch)
34
+
33
35
  Txgh.events.publish(
34
36
  'transifex.resource.updated', {
35
- project: project, repo: repo, resource: tx_resource, sha: file[:sha]
37
+ project: project,
38
+ repo: repo,
39
+ resource: tx_resource,
40
+ sha: ref[:object][:sha]
36
41
  }
37
42
  )
38
43
  end
@@ -180,8 +180,10 @@ module Txgh
180
180
  raise TransifexNotFoundError, "404 Not Found: #{response.env.url}"
181
181
  else
182
182
  if (response.status / 100) != 2
183
- raise TransifexApiError,
184
- "HTTP #{response.status}: #{response.env.url}, body: #{response.body}"
183
+ raise TransifexApiError.new(
184
+ "HTTP #{response.status}: #{response.env.url}, body: #{response.body}",
185
+ response.status
186
+ )
185
187
  end
186
188
  end
187
189
  end
data/lib/txgh/utils.rb CHANGED
@@ -64,6 +64,23 @@ module Txgh
64
64
  obj
65
65
  end
66
66
  end
67
+
68
+ def deep_symbolize_keys(obj)
69
+ case obj
70
+ when Hash
71
+ obj.each_with_object({}) do |(k, v), ret|
72
+ ret[k.to_sym] = deep_symbolize_keys(v)
73
+ end
74
+
75
+ when Array
76
+ obj.map do |elem|
77
+ deep_symbolize_keys(elem)
78
+ end
79
+
80
+ else
81
+ obj
82
+ end
83
+ end
67
84
  end
68
85
 
69
86
  Utils.extend(Utils)
data/lib/txgh/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Txgh
2
- VERSION = '6.0.3'
2
+ VERSION = '6.0.4'
3
3
  end
data/spec/events_spec.rb CHANGED
@@ -43,13 +43,51 @@ describe Events do
43
43
  end
44
44
  end
45
45
 
46
- describe '#publish_error' do
46
+ shared_examples 'an error publisher' do |options = {}|
47
+ let(:error) do
48
+ begin; raise 'foo'; rescue => e; e; end
49
+ end
50
+
47
51
  it 'publishes the given error over the error channel' do
48
52
  errors = []
49
53
  events.subscribe('errors') { |e| errors << e }
50
- events.publish_error(begin; raise 'foo'; rescue => e; e; end)
54
+ events.send(options.fetch(:method_sym), error)
51
55
  expect(errors.size).to eq(1)
52
56
  expect(errors.first.message).to eq('foo')
53
57
  end
58
+
59
+ it 'includes additional params' do
60
+ errors = []
61
+ events.subscribe('errors') { |e, params| errors << { error: e, params: params } }
62
+ events.send(options.fetch(:method_sym), error, { foo: 'bar' })
63
+ expect(errors.size).to eq(1)
64
+
65
+ error = errors.first
66
+ expect(error[:error].message).to eq('foo')
67
+ expect(error[:params]).to eq(foo: 'bar')
68
+ end
69
+
70
+ it 'returns an array of the callback return values' do
71
+ events.subscribe('errors') { |e| 'abc' }
72
+ events.subscribe('errors') { |e| 'def' }
73
+ callback_return_values = events.send(options.fetch(:method_sym), error)
74
+ expect(callback_return_values).to eq(%w(abc def))
75
+ end
76
+ end
77
+
78
+ describe '#publish_error' do
79
+ it_behaves_like 'an error publisher', method_sym: :publish_error
80
+
81
+ it 'does not raise errors if no error subscribers are configured' do
82
+ expect { events.publish_error(StandardError.new) }.to_not raise_error
83
+ end
84
+ end
85
+
86
+ describe '#publish_error!' do
87
+ it_behaves_like 'an error publisher', method_sym: :publish_error!
88
+
89
+ it 'raises errors if no error subscribers are configured' do
90
+ expect { events.publish_error!(StandardError.new) }.to raise_error(StandardError)
91
+ end
54
92
  end
55
93
  end
@@ -55,7 +55,7 @@ describe GithubApi do
55
55
  .with(repo, path, 'message', old_sha, new_contents, { branch: branch })
56
56
  )
57
57
 
58
- api.update_contents(branch, { path => new_contents }, 'message')
58
+ api.update_contents(branch, [{ path: path, contents: new_contents }], 'message')
59
59
  end
60
60
 
61
61
  it "doesn't update the file contents if the file hasn't changed" do
@@ -67,7 +67,7 @@ describe GithubApi do
67
67
 
68
68
  expect(client).to_not receive(:update_contents)
69
69
 
70
- api.update_contents(branch, { path => old_contents }, 'message')
70
+ api.update_contents(branch, [{ path: path, contents: old_contents }], 'message')
71
71
  end
72
72
 
73
73
  it "creates the file if it doesn't already exist" do
@@ -81,7 +81,7 @@ describe GithubApi do
81
81
  .with(repo, path, 'message', '0' * 40, new_contents, { branch: branch })
82
82
  )
83
83
 
84
- api.update_contents(branch, { path => new_contents }, 'message')
84
+ api.update_contents(branch, [{ path: path, contents: new_contents }], 'message')
85
85
  end
86
86
  end
87
87
 
@@ -32,7 +32,7 @@ describe ResourceCommitter do
32
32
 
33
33
  expect(github_api).to(
34
34
  receive(:update_contents).with(
35
- branch, { file_name => :translations }, commit_message
35
+ branch, { path: file_name, contents: :translations }, commit_message
36
36
  )
37
37
  )
38
38
  end
@@ -14,6 +14,7 @@ describe ResourceUpdater do
14
14
  let(:ref) { 'heads/master' }
15
15
  let(:resource) { tx_config.resource(resource_slug, ref) }
16
16
  let(:commit_sha) { '8765309' }
17
+ let(:file_sha) { 'abc123' }
17
18
 
18
19
  let(:translations) do
19
20
  YAML.load("|
@@ -25,7 +26,7 @@ describe ResourceUpdater do
25
26
  end
26
27
 
27
28
  let(:modified_files) do
28
- [{ path: resource.source_file, content: translations, sha: commit_sha }]
29
+ [{ path: resource.source_file, content: translations, sha: file_sha }]
29
30
  end
30
31
 
31
32
  before(:each) do
@@ -34,6 +35,10 @@ describe ResourceUpdater do
34
35
  receive(:download).with(file[:path], ref).and_return(file)
35
36
  )
36
37
  end
38
+
39
+ allow(github_api).to receive(:get_ref).with(ref).and_return(
40
+ { object: { sha: commit_sha } }
41
+ )
37
42
  end
38
43
 
39
44
  it 'correctly uploads modified files to transifex' do
@@ -132,7 +132,9 @@ describe TransifexApi do
132
132
  end
133
133
 
134
134
  expect { api.create(resource, 'new_content') }.to(
135
- raise_error(TransifexApiError)
135
+ raise_error(TransifexNotFoundError) do |e|
136
+ expect(e.status_code).to eq(404)
137
+ end
136
138
  )
137
139
  end
138
140
 
@@ -286,7 +288,9 @@ describe TransifexApi do
286
288
  end
287
289
 
288
290
  expect { api.download(resource, language) }.to(
289
- raise_error(TransifexApiError)
291
+ raise_error(TransifexUnauthorizedError) do |e|
292
+ expect(e.status_code).to eq(401)
293
+ end
290
294
  )
291
295
  end
292
296
 
data/spec/utils_spec.rb CHANGED
@@ -98,4 +98,48 @@ describe Utils do
98
98
  expect(Utils.booleanize(false)).to eq(false)
99
99
  end
100
100
  end
101
+
102
+ describe '.deep_symbolize_keys' do
103
+ it 'symbolizes keys in a hash with depth 1' do
104
+ hash = { 'abc' => 'def', ghi: 'jkl' }
105
+ expect(Utils.deep_symbolize_keys(hash)).to eq(
106
+ { abc: 'def', ghi: 'jkl' }
107
+ )
108
+ end
109
+
110
+ it 'symbolizes keys in a hash with depth 2' do
111
+ hash = { 'abc' => { 'def' => 'ghi' } }
112
+ expect(Utils.deep_symbolize_keys(hash)).to eq(
113
+ { abc: { def: 'ghi' } }
114
+ )
115
+ end
116
+
117
+ it 'symbolizes keys in a hash with depth 3' do
118
+ hash = { 'abc' => { 'def' => { 'ghi' => 'jkl' }, 'mno' => 'pqr' } }
119
+ expect(Utils.deep_symbolize_keys(hash)).to eq(
120
+ { abc: { def: { ghi: 'jkl' }, mno: 'pqr' } }
121
+ )
122
+ end
123
+
124
+ it 'symbolizes hash keys in an array' do
125
+ array = [{ 'def' => 'ghi' }]
126
+ expect(Utils.deep_symbolize_keys(array)).to eq(
127
+ [{ def: 'ghi' }]
128
+ )
129
+ end
130
+
131
+ it 'symbolizes keys nested inside arrays' do
132
+ hash = { 'abc' => [{ 'def' => 'ghi' }] }
133
+ expect(Utils.deep_symbolize_keys(hash)).to eq(
134
+ { abc: [{ def: 'ghi' }] }
135
+ )
136
+ end
137
+
138
+ it "doesn't modify objects that aren't hashes" do
139
+ hash = { 'abc' => Set.new(%w(a b c)) }
140
+ expect(Utils.deep_symbolize_keys(hash)).to eq(
141
+ { abc: hash['abc'] }
142
+ )
143
+ end
144
+ end
101
145
  end
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.3
4
+ version: 6.0.4
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-09-28 00:00:00.000000000 Z
12
+ date: 2016-09-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: abroad
@@ -133,7 +133,6 @@ files:
133
133
  - lib/txgh/resource_deleter.rb
134
134
  - lib/txgh/resource_downloader.rb
135
135
  - lib/txgh/resource_updater.rb
136
- - lib/txgh/response_helpers.rb
137
136
  - lib/txgh/transifex_api.rb
138
137
  - lib/txgh/transifex_project.rb
139
138
  - lib/txgh/tx_branch_resource.rb
@@ -1,26 +0,0 @@
1
- module Txgh
2
- module ResponseHelpers
3
- private
4
-
5
- def respond_with(status, body, e = nil)
6
- Txgh::Handlers::Response.new(status, body, e)
7
- end
8
-
9
- def respond_with_error(status, message, e = nil)
10
- respond_with(status, error(message), e)
11
- end
12
-
13
- def error(message)
14
- [{ error: message }]
15
- end
16
-
17
- def data(body)
18
- { data: body }
19
- end
20
-
21
- # includes these methods in the singleton class as well
22
- def self.included(base)
23
- base.extend(self)
24
- end
25
- end
26
- end