worochi 0.0.7 → 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/worochi/agent/{sample.rb → #example.rb} +2 -14
- data/lib/worochi/agent/dropbox.rb +3 -13
- data/lib/worochi/agent/github.rb +8 -23
- data/lib/worochi/agent.rb +46 -18
- data/lib/worochi/config/#example.yml +35 -0
- data/lib/worochi/config/dropbox.yml +14 -0
- data/lib/worochi/config/github.yml +17 -0
- data/lib/worochi/config.rb +9 -84
- data/lib/worochi/configurator.rb +120 -0
- data/lib/worochi/helper/github_helper.rb +111 -0
- data/lib/worochi/helper.rb +28 -7
- data/lib/worochi/item.rb +5 -3
- data/lib/worochi/log.rb +8 -14
- data/lib/worochi/oauth.rb +69 -0
- data/lib/worochi/version.rb +1 -1
- data/lib/worochi.rb +20 -3
- data/spec/cassettes/Worochi/_push/pushes_with_agents.yml +512 -0
- data/spec/cassettes/Worochi_Agent_Dropbox/_push_item/pushes_it_chunked_if_size_exceeds_limit.yml +1049 -0
- data/spec/cassettes/Worochi_Agent_Dropbox/_push_item_chunked/raises_an_error.yml +44 -0
- data/spec/cassettes/Worochi_Agent_Dropbox/_push_items/pushes_multiple_items.yml +165 -0
- data/spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files/raises_error_on_invalid_path.yml +38 -0
- data/spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files_and_folders/shows_detailed_listing.yml +79 -0
- data/spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files_and_folders/shows_detailed_listing_including_the_required_fields.yml +79 -0
- data/spec/cassettes/Worochi_Agent_Github/_list/works_with_absolute_paths.yml +12 -12
- data/spec/cassettes/Worochi_Agent_Github/_repos/lists_the_repos.yml +207 -0
- data/spec/cassettes/Worochi_Agent_Github/_source_branch/retrieves_the_master_branch_correctly.yml +6 -6
- data/spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files/accepts_a_different_relative_path.yml +12 -12
- data/spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files/contains_file1.yml +12 -12
- data/spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files/does_not_contain_folder1.yml +12 -12
- data/spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files/raises_error_on_invalid_path.yml +133 -0
- data/spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files_and_folders/contains_folder1_and_file1.yml +24 -24
- data/spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files_and_folders/shows_detailed_listing_including_the_required_fields.yml +133 -0
- data/spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_folders/accepts_a_different_relative_path.yml +12 -12
- data/spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_folders/contains_folder1.yml +12 -12
- data/spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_folders/does_not_contain_file1.yml +12 -12
- data/spec/cassettes/Worochi_Agent_Github/{_push_all → modifies_the_repo/_push_all}/pushes_a_list_of_items_to_create_a_new_commit.yml +80 -80
- data/spec/cassettes/Worochi_Agent_Github/{_push_all → modifies_the_repo/_push_all}/pushes_the_file_to_the_right_place.yml +60 -60
- data/spec/cassettes/Worochi_Agent_Github/modifies_the_repo/_push_blob/pushes_the_blob_even_when_it_is_larger_than_block_size.yml +181 -0
- data/spec/cassettes/Worochi_Agent_Github/modifies_the_repo/_push_item/pushes_a_single_item_and_makes_a_commit.yml +687 -0
- data/spec/cassettes/Worochi_Agent_Github/modifies_the_repo/_stream_blob/streams_the_file_as_an_Base64_JSON_field.yml +181 -0
- data/spec/cassettes/Worochi_OAuth/_flow_end/rejects_bad_code.yml +56 -0
- data/spec/{helper.rb → spec_helper.rb} +14 -1
- data/spec/support/aws_uri_matcher.rb +1 -1
- data/spec/support/shared_exampes_for_agents.rb +13 -2
- data/spec/support/test_files.rb +4 -4
- data/spec/worochi/agent/dropbox_spec.rb +29 -3
- data/spec/worochi/agent/github_spec.rb +54 -26
- data/spec/worochi/agent_spec.rb +34 -1
- data/spec/worochi/config_spec.rb +46 -30
- data/spec/worochi/helper/github_helper_spec.rb +94 -0
- data/spec/worochi/helper_spec.rb +15 -3
- data/spec/worochi/item_spec.rb +9 -6
- data/spec/worochi/log_spec.rb +30 -0
- data/spec/worochi/oauth_spec.rb +33 -0
- data/spec/worochi_spec.rb +25 -1
- data/worochi.gemspec +5 -1
- metadata +104 -11
- data/lib/worochi/helper/github.rb +0 -100
- data/spec/worochi/helper/github_spec.rb +0 -57
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Worochi::Agent::Github
|
4
|
+
describe Helper do
|
5
|
+
describe Helper::StreamIO do
|
6
|
+
|
7
|
+
let(:size) { 114 }
|
8
|
+
let(:checksum) { '0bda09766257c6e8d33557cf4d1e1718e82540d46b53d288fc13198e7126f2bc' }
|
9
|
+
let(:stream) do
|
10
|
+
item = Worochi::Item.open_single(local.source)
|
11
|
+
Helper::StreamIO.new(item)
|
12
|
+
end
|
13
|
+
|
14
|
+
after do
|
15
|
+
stream.rewind
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '.new' do
|
19
|
+
it 'initializes' do
|
20
|
+
item = Worochi::Item.open_single(local.source)
|
21
|
+
s = Helper::StreamIO.new(item)
|
22
|
+
expect(s.class).to be(Helper::StreamIO)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#size' do
|
27
|
+
it 'returns the encoded size' do
|
28
|
+
expect(stream.size).to eq(size)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#read' do
|
33
|
+
def verify(content)
|
34
|
+
expect(Digest::SHA2.hexdigest(content)).to eq(checksum)
|
35
|
+
expect(content.size).to eq(size)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'encodes a file correctly' do
|
39
|
+
content = stream.read
|
40
|
+
verify(content)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'reads partial lengths' do
|
44
|
+
part = stream.read(6)
|
45
|
+
expect(part).to eq('{"cont')
|
46
|
+
expect(part.size).to eq(6)
|
47
|
+
|
48
|
+
part = stream.read(15)
|
49
|
+
expect(part).to eq('ent":"VGhpcyBpc')
|
50
|
+
expect(part.size).to eq(15)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'tracks file positions correctly' do
|
54
|
+
content = stream.read(stream.size)
|
55
|
+
verify(content)
|
56
|
+
stream.rewind
|
57
|
+
content = stream.read(stream.size + 100)
|
58
|
+
verify(content)
|
59
|
+
stream.rewind
|
60
|
+
content = stream.read(stream.size - 10)
|
61
|
+
content += stream.read(10)
|
62
|
+
verify(content)
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'accepts an output buffer' do
|
66
|
+
outbuf = ''
|
67
|
+
stream.read(5, outbuf)
|
68
|
+
expect(outbuf.size).to eq(5)
|
69
|
+
expect(outbuf).to eq('{"con')
|
70
|
+
stream.read
|
71
|
+
expect(stream.read(5, outbuf)).to be(nil)
|
72
|
+
expect(outbuf).to eq('')
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'terminates correctly' do
|
76
|
+
stream.read(stream.size)
|
77
|
+
expect(stream.read(10)).to be(nil)
|
78
|
+
expect(stream.read).to eq('')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe '#rewind' do
|
83
|
+
it 'rewinds the stream' do
|
84
|
+
expect(stream.read(20)).to eq('{"content":"VGhpcyBp')
|
85
|
+
stream.rewind
|
86
|
+
expect(stream.read(20)).to eq('{"content":"VGhpcyBp')
|
87
|
+
stream.read
|
88
|
+
stream.rewind
|
89
|
+
expect(stream.read(20)).to eq('{"content":"VGhpcyBp')
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
data/spec/worochi/helper_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Worochi::Helper do
|
4
4
|
|
@@ -16,8 +16,20 @@ describe Worochi::Helper do
|
|
16
16
|
|
17
17
|
describe '.s3_url', :aws do
|
18
18
|
it 'returns the right S3 URL' do
|
19
|
-
|
20
|
-
|
19
|
+
Worochi::Config.s3_bucket = 'rspec-test'
|
20
|
+
uri = Worochi::Helper.s3_url('s3:test/path')
|
21
|
+
expect(uri.path).to eq('/test/path')
|
22
|
+
expect(uri.host).to include('rspec-test')
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'parses bucket names' do
|
26
|
+
uri = Worochi::Helper.s3_url('s3:bucket-name:test/path')
|
27
|
+
expect(uri.path).to eq('/test/path')
|
28
|
+
expect(uri.host).to include('bucket-name')
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'rejects invalid URLs' do
|
32
|
+
expect{Worochi::Helper.s3_url('a/b')}.to raise_error(Worochi::Error)
|
21
33
|
end
|
22
34
|
end
|
23
35
|
end
|
data/spec/worochi/item_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Worochi::Item do
|
4
4
|
describe '.open', :vcr do
|
@@ -58,21 +58,24 @@ describe Worochi::Item do
|
|
58
58
|
it 'accepts a String' do
|
59
59
|
item = Worochi::Item.open_single(remote.source)
|
60
60
|
expect(item.class).to be(Worochi::Item)
|
61
|
-
expect(item.size).to eq(remote.
|
61
|
+
expect(item.size).to eq(remote.file_size)
|
62
62
|
end
|
63
63
|
|
64
64
|
it 'accepts a Hash' do
|
65
65
|
hash = { path: local.path, source: local.source }
|
66
66
|
item = Worochi::Item.open_single(hash)
|
67
67
|
expect(item.class).to be(Worochi::Item)
|
68
|
-
expect(item.size).to eq(local.
|
68
|
+
expect(item.size).to eq(local.file_size)
|
69
69
|
end
|
70
70
|
|
71
71
|
it 'works with AWS S3 paths', :aws do
|
72
|
+
Worochi::Config.s3_bucket = 'data-pixelapse'
|
72
73
|
item = Worochi::Item.open_single(s3.source)
|
73
74
|
expect(item.class).to be(Worochi::Item)
|
74
|
-
|
75
|
+
content = item.content.read
|
76
|
+
checksum = Digest::SHA2.hexdigest(content)
|
75
77
|
expect(checksum).to eq(s3.checksum)
|
78
|
+
expect(content.size).to eq(s3.file_size)
|
76
79
|
end
|
77
80
|
end
|
78
81
|
|
@@ -82,7 +85,7 @@ describe Worochi::Item do
|
|
82
85
|
first_word = item.read(4)
|
83
86
|
expect(first_word).to eq('This')
|
84
87
|
rest = item.read
|
85
|
-
expect(rest.size).to eq(local.
|
88
|
+
expect(rest.size).to eq(local.file_size - 4)
|
86
89
|
end
|
87
90
|
end
|
88
91
|
|
@@ -92,7 +95,7 @@ describe Worochi::Item do
|
|
92
95
|
item.read
|
93
96
|
expect(item.read.size).to eq(0)
|
94
97
|
expect(item.rewind).to eq(0)
|
95
|
-
expect(item.read.size).to eq(local.
|
98
|
+
expect(item.read.size).to eq(local.file_size)
|
96
99
|
end
|
97
100
|
end
|
98
101
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Worochi
|
4
|
+
describe Log do
|
5
|
+
before do
|
6
|
+
Config.silent = false
|
7
|
+
@output = StringIO.new
|
8
|
+
Log.init(@output)
|
9
|
+
end
|
10
|
+
|
11
|
+
after do
|
12
|
+
Config.silent = true
|
13
|
+
Log.init
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '.warn' do
|
17
|
+
it 'logs warning' do
|
18
|
+
Log.warn 'test warn'
|
19
|
+
expect(@output.string).to include('test warn')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '.error' do
|
24
|
+
it 'logs error' do
|
25
|
+
Log.error 'test error'
|
26
|
+
expect(@output.string).to include('test error')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Worochi::OAuth do
|
4
|
+
let(:redirect_uri) { 'http://127.0.0.1:3000' }
|
5
|
+
let(:auth) { Worochi::OAuth.new(:github, redirect_uri) }
|
6
|
+
describe '.new' do
|
7
|
+
it 'initializes the options correctly' do
|
8
|
+
expect(auth.options.site).to eq('https://github.com')
|
9
|
+
expect(auth.client.class).to be(OAuth2::Client)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#flow_start' do
|
14
|
+
it 'returns the URL to begin authorization' do
|
15
|
+
url = auth.flow_start
|
16
|
+
expect(url).to include("scope=#{auth.send(:scope)}")
|
17
|
+
expect(url).to include(auth.options.site)
|
18
|
+
expect(url).to include(auth.options.authorize_url)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'supports state' do
|
22
|
+
state = SecureRandom.hex
|
23
|
+
url = auth.flow_start(state)
|
24
|
+
expect(url).to include("state=#{state}")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#flow_end', :vcr do
|
29
|
+
it 'rejects bad code' do
|
30
|
+
expect{auth.flow_end('abc')}.to raise_error(OAuth2::Error)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/spec/worochi_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Worochi do
|
4
4
|
let(:token) { 'service token' }
|
@@ -69,6 +69,15 @@ describe Worochi do
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
|
+
describe '.remove' do
|
73
|
+
it 'removes a single agent' do
|
74
|
+
a = create_dropbox_agent
|
75
|
+
expect(Worochi.agents).to include(a)
|
76
|
+
Worochi.remove(a)
|
77
|
+
expect(Worochi.agents).not_to include(a)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
72
81
|
describe '.remove_service' do
|
73
82
|
it 'removes multiple agents by service' do
|
74
83
|
create_dropbox_agent
|
@@ -112,4 +121,19 @@ describe Worochi do
|
|
112
121
|
expect(Worochi.agents).to include(a)
|
113
122
|
end
|
114
123
|
end
|
124
|
+
|
125
|
+
describe '.push', :vcr do
|
126
|
+
it 'pushes with agents' do
|
127
|
+
a = Worochi.create(:github, ENV['GITHUB_TEST_TOKEN'], {
|
128
|
+
repo: 'darkmirage/test',
|
129
|
+
source: 'master',
|
130
|
+
target: 'rspec',
|
131
|
+
commit_msg: "RSpec Test"
|
132
|
+
})
|
133
|
+
expect(Worochi.push(path: local.path, source: local.source)).to be(true)
|
134
|
+
end
|
135
|
+
it 'requires at least one active agent' do
|
136
|
+
expect(Worochi.push(local.source)).to be(false)
|
137
|
+
end
|
138
|
+
end
|
115
139
|
end
|
data/worochi.gemspec
CHANGED
@@ -16,11 +16,13 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.license = 'MIT'
|
17
17
|
|
18
18
|
s.files = %w(README.md LICENSE worochi.gemspec)
|
19
|
-
s.files += Dir.glob('lib/**/*.rb')
|
19
|
+
s.files += Dir.glob('lib/**/*.{rb,yml}')
|
20
20
|
s.test_files = Dir.glob('spec/**/*')
|
21
21
|
|
22
22
|
s.require_paths = ['lib']
|
23
23
|
|
24
|
+
s.add_runtime_dependency('hashie')
|
25
|
+
s.add_runtime_dependency('oauth2')
|
24
26
|
s.add_runtime_dependency('aws-sdk')
|
25
27
|
s.add_runtime_dependency('dropbox-sdk') # Dropbox
|
26
28
|
s.add_runtime_dependency('octokit') # GitHub
|
@@ -30,6 +32,8 @@ Gem::Specification.new do |s|
|
|
30
32
|
s.add_development_dependency('webmock', ['~> 1.9.3'])
|
31
33
|
s.add_development_dependency('awesome_print')
|
32
34
|
s.add_development_dependency('yard')
|
35
|
+
s.add_development_dependency('simplecov')
|
36
|
+
s.add_development_dependency('coveralls')
|
33
37
|
|
34
38
|
s.post_install_message = <<-MESSAGE
|
35
39
|
Worochi says, "RAWRRRRR!!!"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: worochi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Raven Jiang
|
@@ -10,6 +10,34 @@ bindir: bin
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2013-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: hashie
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: oauth2
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: aws-sdk
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +150,34 @@ dependencies:
|
|
122
150
|
- - '>='
|
123
151
|
- !ruby/object:Gem::Version
|
124
152
|
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: simplecov
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - '>='
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - '>='
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: coveralls
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - '>='
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
125
181
|
description: Provides a standard way to interface with Ruby API wrappers provided
|
126
182
|
by various cloud storage services such as Dropbox and Google Drive.
|
127
183
|
email:
|
@@ -136,41 +192,60 @@ files:
|
|
136
192
|
- lib/worochi/error.rb
|
137
193
|
- lib/worochi/log.rb
|
138
194
|
- lib/worochi/agent.rb
|
139
|
-
- lib/worochi/helper/
|
195
|
+
- lib/worochi/helper/github_helper.rb
|
140
196
|
- lib/worochi/config.rb
|
141
|
-
- lib/worochi/agent/sample.rb
|
142
197
|
- lib/worochi/agent/github.rb
|
198
|
+
- lib/worochi/agent/#example.rb
|
143
199
|
- lib/worochi/agent/dropbox.rb
|
144
200
|
- lib/worochi/helper.rb
|
145
201
|
- lib/worochi/item.rb
|
202
|
+
- lib/worochi/oauth.rb
|
146
203
|
- lib/worochi/version.rb
|
204
|
+
- lib/worochi/configurator.rb
|
147
205
|
- lib/worochi.rb
|
206
|
+
- lib/worochi/config/github.yml
|
207
|
+
- lib/worochi/config/dropbox.yml
|
208
|
+
- lib/worochi/config/#example.yml
|
209
|
+
- spec/spec_helper.rb
|
148
210
|
- spec/worochi/helper_spec.rb
|
211
|
+
- spec/worochi/log_spec.rb
|
149
212
|
- spec/worochi/item_spec.rb
|
150
|
-
- spec/worochi/helper/
|
213
|
+
- spec/worochi/helper/github_helper_spec.rb
|
151
214
|
- spec/worochi/agent/dropbox_spec.rb
|
152
215
|
- spec/worochi/agent/github_spec.rb
|
153
216
|
- spec/worochi/config_spec.rb
|
154
217
|
- spec/worochi/agent_spec.rb
|
218
|
+
- spec/worochi/oauth_spec.rb
|
155
219
|
- spec/worochi_spec.rb
|
156
220
|
- spec/support/aws_uri_matcher.rb
|
157
221
|
- spec/support/shared_exampes_for_agents.rb
|
158
222
|
- spec/support/test_files.rb
|
159
223
|
- spec/support/test_file
|
224
|
+
- spec/cassettes/Worochi_Agent_Dropbox/_push_item_chunked/raises_an_error.yml
|
160
225
|
- spec/cassettes/Worochi_Agent_Dropbox/_push_item_chunked/pushes_a_single_item_in_chunks.yml
|
161
226
|
- spec/cassettes/Worochi_Agent_Dropbox/_list/works_with_absolute_paths.yml
|
227
|
+
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files_and_folders/shows_detailed_listing.yml
|
228
|
+
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files_and_folders/shows_detailed_listing_including_the_required_fields.yml
|
162
229
|
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files_and_folders/contains_folder1_and_file1.yml
|
230
|
+
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files/raises_error_on_invalid_path.yml
|
163
231
|
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files/does_not_contain_folder1.yml
|
164
232
|
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files/contains_file1.yml
|
165
233
|
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files/accepts_a_different_relative_path.yml
|
166
234
|
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_folders/contains_folder1.yml
|
167
235
|
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_folders/does_not_contain_file1.yml
|
168
236
|
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_folders/accepts_a_different_relative_path.yml
|
237
|
+
- spec/cassettes/Worochi_Agent_Dropbox/_push_items/pushes_multiple_items.yml
|
169
238
|
- spec/cassettes/Worochi_Agent_Dropbox/_push_item/pushes_a_single_item.yml
|
170
|
-
- spec/cassettes/
|
171
|
-
- spec/cassettes/Worochi_Agent_Github/_push_all/
|
239
|
+
- spec/cassettes/Worochi_Agent_Dropbox/_push_item/pushes_it_chunked_if_size_exceeds_limit.yml
|
240
|
+
- spec/cassettes/Worochi_Agent_Github/modifies_the_repo/_push_all/pushes_the_file_to_the_right_place.yml
|
241
|
+
- spec/cassettes/Worochi_Agent_Github/modifies_the_repo/_push_all/pushes_a_list_of_items_to_create_a_new_commit.yml
|
242
|
+
- spec/cassettes/Worochi_Agent_Github/modifies_the_repo/_stream_blob/streams_the_file_as_an_Base64_JSON_field.yml
|
243
|
+
- spec/cassettes/Worochi_Agent_Github/modifies_the_repo/_push_blob/pushes_the_blob_even_when_it_is_larger_than_block_size.yml
|
244
|
+
- spec/cassettes/Worochi_Agent_Github/modifies_the_repo/_push_item/pushes_a_single_item_and_makes_a_commit.yml
|
172
245
|
- spec/cassettes/Worochi_Agent_Github/_list/works_with_absolute_paths.yml
|
246
|
+
- spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files_and_folders/shows_detailed_listing_including_the_required_fields.yml
|
173
247
|
- spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files_and_folders/contains_folder1_and_file1.yml
|
248
|
+
- spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files/raises_error_on_invalid_path.yml
|
174
249
|
- spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files/does_not_contain_folder1.yml
|
175
250
|
- spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files/contains_file1.yml
|
176
251
|
- spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files/accepts_a_different_relative_path.yml
|
@@ -178,6 +253,8 @@ files:
|
|
178
253
|
- spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_folders/does_not_contain_file1.yml
|
179
254
|
- spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_folders/accepts_a_different_relative_path.yml
|
180
255
|
- spec/cassettes/Worochi_Agent_Github/_source_branch/retrieves_the_master_branch_correctly.yml
|
256
|
+
- spec/cassettes/Worochi_Agent_Github/_repos/lists_the_repos.yml
|
257
|
+
- spec/cassettes/Worochi/_push/pushes_with_agents.yml
|
181
258
|
- spec/cassettes/Worochi_Item/_open_single/accepts_a_String.yml
|
182
259
|
- spec/cassettes/Worochi_Item/_open_single/works_with_AWS_S3_paths.yml
|
183
260
|
- spec/cassettes/Worochi_Item/_open/opens_multiple_files/with_String_parameters.yml
|
@@ -188,7 +265,7 @@ files:
|
|
188
265
|
- spec/cassettes/Worochi_Item/_open/with_multiple_files/accepts_Hash_parameters.yml
|
189
266
|
- spec/cassettes/Worochi_Item/_open/opens_a_single_file/with_String_parameter.yml
|
190
267
|
- spec/cassettes/Worochi_Item/_open/opens_a_single_file/with_Hash_parameter.yml
|
191
|
-
- spec/
|
268
|
+
- spec/cassettes/Worochi_OAuth/_flow_end/rejects_bad_code.yml
|
192
269
|
homepage: http://rubygems.org/gems/worochi
|
193
270
|
licenses:
|
194
271
|
- MIT
|
@@ -215,32 +292,46 @@ signing_key:
|
|
215
292
|
specification_version: 4
|
216
293
|
summary: Worochi
|
217
294
|
test_files:
|
295
|
+
- spec/spec_helper.rb
|
218
296
|
- spec/worochi/helper_spec.rb
|
297
|
+
- spec/worochi/log_spec.rb
|
219
298
|
- spec/worochi/item_spec.rb
|
220
|
-
- spec/worochi/helper/
|
299
|
+
- spec/worochi/helper/github_helper_spec.rb
|
221
300
|
- spec/worochi/agent/dropbox_spec.rb
|
222
301
|
- spec/worochi/agent/github_spec.rb
|
223
302
|
- spec/worochi/config_spec.rb
|
224
303
|
- spec/worochi/agent_spec.rb
|
304
|
+
- spec/worochi/oauth_spec.rb
|
225
305
|
- spec/worochi_spec.rb
|
226
306
|
- spec/support/aws_uri_matcher.rb
|
227
307
|
- spec/support/shared_exampes_for_agents.rb
|
228
308
|
- spec/support/test_files.rb
|
229
309
|
- spec/support/test_file
|
310
|
+
- spec/cassettes/Worochi_Agent_Dropbox/_push_item_chunked/raises_an_error.yml
|
230
311
|
- spec/cassettes/Worochi_Agent_Dropbox/_push_item_chunked/pushes_a_single_item_in_chunks.yml
|
231
312
|
- spec/cassettes/Worochi_Agent_Dropbox/_list/works_with_absolute_paths.yml
|
313
|
+
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files_and_folders/shows_detailed_listing.yml
|
314
|
+
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files_and_folders/shows_detailed_listing_including_the_required_fields.yml
|
232
315
|
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files_and_folders/contains_folder1_and_file1.yml
|
316
|
+
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files/raises_error_on_invalid_path.yml
|
233
317
|
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files/does_not_contain_folder1.yml
|
234
318
|
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files/contains_file1.yml
|
235
319
|
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files/accepts_a_different_relative_path.yml
|
236
320
|
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_folders/contains_folder1.yml
|
237
321
|
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_folders/does_not_contain_file1.yml
|
238
322
|
- spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_folders/accepts_a_different_relative_path.yml
|
323
|
+
- spec/cassettes/Worochi_Agent_Dropbox/_push_items/pushes_multiple_items.yml
|
239
324
|
- spec/cassettes/Worochi_Agent_Dropbox/_push_item/pushes_a_single_item.yml
|
240
|
-
- spec/cassettes/
|
241
|
-
- spec/cassettes/Worochi_Agent_Github/_push_all/
|
325
|
+
- spec/cassettes/Worochi_Agent_Dropbox/_push_item/pushes_it_chunked_if_size_exceeds_limit.yml
|
326
|
+
- spec/cassettes/Worochi_Agent_Github/modifies_the_repo/_push_all/pushes_the_file_to_the_right_place.yml
|
327
|
+
- spec/cassettes/Worochi_Agent_Github/modifies_the_repo/_push_all/pushes_a_list_of_items_to_create_a_new_commit.yml
|
328
|
+
- spec/cassettes/Worochi_Agent_Github/modifies_the_repo/_stream_blob/streams_the_file_as_an_Base64_JSON_field.yml
|
329
|
+
- spec/cassettes/Worochi_Agent_Github/modifies_the_repo/_push_blob/pushes_the_blob_even_when_it_is_larger_than_block_size.yml
|
330
|
+
- spec/cassettes/Worochi_Agent_Github/modifies_the_repo/_push_item/pushes_a_single_item_and_makes_a_commit.yml
|
242
331
|
- spec/cassettes/Worochi_Agent_Github/_list/works_with_absolute_paths.yml
|
332
|
+
- spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files_and_folders/shows_detailed_listing_including_the_required_fields.yml
|
243
333
|
- spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files_and_folders/contains_folder1_and_file1.yml
|
334
|
+
- spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files/raises_error_on_invalid_path.yml
|
244
335
|
- spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files/does_not_contain_folder1.yml
|
245
336
|
- spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files/contains_file1.yml
|
246
337
|
- spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files/accepts_a_different_relative_path.yml
|
@@ -248,6 +339,8 @@ test_files:
|
|
248
339
|
- spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_folders/does_not_contain_file1.yml
|
249
340
|
- spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_folders/accepts_a_different_relative_path.yml
|
250
341
|
- spec/cassettes/Worochi_Agent_Github/_source_branch/retrieves_the_master_branch_correctly.yml
|
342
|
+
- spec/cassettes/Worochi_Agent_Github/_repos/lists_the_repos.yml
|
343
|
+
- spec/cassettes/Worochi/_push/pushes_with_agents.yml
|
251
344
|
- spec/cassettes/Worochi_Item/_open_single/accepts_a_String.yml
|
252
345
|
- spec/cassettes/Worochi_Item/_open_single/works_with_AWS_S3_paths.yml
|
253
346
|
- spec/cassettes/Worochi_Item/_open/opens_multiple_files/with_String_parameters.yml
|
@@ -258,5 +351,5 @@ test_files:
|
|
258
351
|
- spec/cassettes/Worochi_Item/_open/with_multiple_files/accepts_Hash_parameters.yml
|
259
352
|
- spec/cassettes/Worochi_Item/_open/opens_a_single_file/with_String_parameter.yml
|
260
353
|
- spec/cassettes/Worochi_Item/_open/opens_a_single_file/with_Hash_parameter.yml
|
261
|
-
- spec/
|
354
|
+
- spec/cassettes/Worochi_OAuth/_flow_end/rejects_bad_code.yml
|
262
355
|
has_rdoc:
|
@@ -1,100 +0,0 @@
|
|
1
|
-
require 'base64'
|
2
|
-
|
3
|
-
class Worochi
|
4
|
-
# Helper classes for GitHub JSON streaming.
|
5
|
-
module Helper::Github
|
6
|
-
|
7
|
-
# Size to read in. Must be a multiple of 3 for Base64 streaming.
|
8
|
-
BLOCK_SIZE = 12288
|
9
|
-
|
10
|
-
# This is a wrapper that produces a JSON stream that works with
|
11
|
-
# {Net::HTTP::Post#body_stream}.
|
12
|
-
class StreamIO
|
13
|
-
|
14
|
-
def initialize(item)
|
15
|
-
item.content.rewind
|
16
|
-
@parts = [
|
17
|
-
StringIO.new('{"content":"'),
|
18
|
-
Base64IO.new(item.content),
|
19
|
-
StringIO.new('","encoding":"base64"}')
|
20
|
-
]
|
21
|
-
@part_no = 0
|
22
|
-
@size = @parts.inject(0) {|sum, p| sum + p.size}
|
23
|
-
end
|
24
|
-
|
25
|
-
# @return [Integer] size of the JSON
|
26
|
-
def size
|
27
|
-
@size
|
28
|
-
end
|
29
|
-
|
30
|
-
# Rewind each component of the stream.
|
31
|
-
#
|
32
|
-
# @return [nil]
|
33
|
-
def rewind
|
34
|
-
@parts.each { |part| part.rewind }
|
35
|
-
@part_no = 0
|
36
|
-
nil
|
37
|
-
end
|
38
|
-
|
39
|
-
# @param length [Integer]
|
40
|
-
# @param outbuf [IO]
|
41
|
-
# @return [String]
|
42
|
-
def read(length=nil, outbuf=nil)
|
43
|
-
return length.nil? ? '' : nil if @part_no >= @parts.size
|
44
|
-
|
45
|
-
length = length || size
|
46
|
-
output = @parts[@part_no].read(length).to_s
|
47
|
-
|
48
|
-
if output.nil?
|
49
|
-
return nil if @part_no >= @parts.size
|
50
|
-
output = ''
|
51
|
-
end
|
52
|
-
|
53
|
-
while output.length < length
|
54
|
-
@part_no += 1
|
55
|
-
break if @part_no == @parts.size
|
56
|
-
output += @parts[@part_no].read(length - output.length).to_s
|
57
|
-
end
|
58
|
-
if not outbuf.nil?
|
59
|
-
outbuf.clear
|
60
|
-
outbuf.insert(0, output)
|
61
|
-
end
|
62
|
-
|
63
|
-
output
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# This is a wrapper around the file content that streams the file as a
|
68
|
-
# Base64 encoded string.
|
69
|
-
class Base64IO
|
70
|
-
def initialize(file)
|
71
|
-
file.rewind
|
72
|
-
@file = file
|
73
|
-
@encoded_size = (@file.size / 3.0).ceil * 4
|
74
|
-
@buffer = ''
|
75
|
-
end
|
76
|
-
|
77
|
-
# @return [Integer] size of the JSON
|
78
|
-
def size
|
79
|
-
@encoded_size
|
80
|
-
end
|
81
|
-
|
82
|
-
# Rewind the stream.
|
83
|
-
def rewind
|
84
|
-
@file.rewind
|
85
|
-
@buffer = ''
|
86
|
-
nil
|
87
|
-
end
|
88
|
-
|
89
|
-
# @param length [Integer]
|
90
|
-
# @param outbuf [IO]
|
91
|
-
# @return [String]
|
92
|
-
def read(length=size, outbuf=nil)
|
93
|
-
while @buffer.length < length and not @file.eof?
|
94
|
-
@buffer += Base64.strict_encode64 @file.read(BLOCK_SIZE)
|
95
|
-
end
|
96
|
-
@buffer.empty? ? nil : @buffer.slice!(0, length)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|