worochi 0.0.0 → 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +20 -0
- data/lib/worochi/agent/dropbox.rb +26 -4
- data/lib/worochi/agent/github.rb +14 -9
- data/lib/worochi/agent/sample.rb +8 -3
- data/lib/worochi/agent.rb +64 -23
- data/lib/worochi/config.rb +34 -2
- data/lib/worochi/error.rb +1 -0
- data/lib/worochi/helper/github.rb +1 -0
- data/lib/worochi/helper.rb +10 -8
- data/lib/worochi/item.rb +18 -9
- data/lib/worochi/log.rb +11 -0
- data/lib/worochi/version.rb +4 -0
- data/lib/worochi.rb +23 -16
- data/spec/cassettes/Worochi_Agent_Dropbox/_list/works_with_absolute_paths.yml +60 -0
- data/spec/cassettes/Worochi_Agent_Dropbox/_push_item/pushes_a_single_item.yml +303 -0
- data/spec/cassettes/Worochi_Agent_Dropbox/_push_item_chunked/pushes_a_single_item_in_chunks.yml +349 -0
- data/spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files/accepts_a_different_path.yml +60 -0
- data/spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files/accepts_a_different_relative_path.yml +60 -0
- data/spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_files/contains_file1.yml +79 -0
- data/spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_folders/accepts_a_different_path.yml +60 -0
- data/spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_folders/accepts_a_different_relative_path.yml +60 -0
- data/spec/cassettes/Worochi_Agent_Dropbox/it_should_behave_like_a_service_agent/_folders/contains_folder1.yml +79 -0
- data/spec/cassettes/Worochi_Agent_Github/_list/works_with_absolute_paths.yml +133 -0
- data/spec/cassettes/Worochi_Agent_Github/_push_all/pushes_a_list_of_items_to_create_a_new_commit.yml +989 -0
- data/spec/cassettes/Worochi_Agent_Github/_push_all/pushes_the_file_to_the_right_place.yml +687 -0
- data/spec/cassettes/Worochi_Agent_Github/_source_branch/retrieves_the_master_branch_correctly.yml +68 -0
- data/spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files/accepts_a_different_path.yml +133 -0
- data/spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files/accepts_a_different_relative_path.yml +133 -0
- data/spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_files/contains_file1.yml +133 -0
- data/spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_folders/accepts_a_different_path.yml +133 -0
- data/spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_folders/accepts_a_different_relative_path.yml +133 -0
- data/spec/cassettes/Worochi_Agent_Github/it_should_behave_like_a_service_agent/_folders/contains_folder1.yml +133 -0
- data/spec/cassettes/Worochi_Item/_open/opens_a_single_file/with_Hash_parameter.yml +107 -0
- data/spec/cassettes/Worochi_Item/_open/opens_a_single_file/with_String_parameter.yml +107 -0
- data/spec/cassettes/Worochi_Item/_open/opens_multiple_files/with_Hash_parameters.yml +211 -0
- data/spec/cassettes/Worochi_Item/_open/opens_multiple_files/with_String_parameters.yml +107 -0
- data/spec/cassettes/Worochi_Item/_open_single/accepts_a_String.yml +107 -0
- data/spec/cassettes/Worochi_Item/_open_single/works_with_AWS_S3_paths.yml +46 -0
- data/spec/helper.rb +46 -0
- data/spec/support/aws_uri_matcher.rb +12 -0
- data/spec/support/shared_exampes_for_agents.rb +36 -0
- data/spec/support/test_file +1 -0
- data/spec/support/test_files.rb +34 -0
- data/spec/worochi/agent/dropbox_spec.rb +48 -0
- data/spec/worochi/agent/github_spec.rb +77 -0
- data/spec/worochi/agent_spec.rb +2 -0
- data/spec/worochi/helper/github_spec.rb +57 -0
- data/spec/worochi/helper_spec.rb +23 -0
- data/spec/worochi/item_spec.rb +85 -0
- data/spec/worochi_spec.rb +109 -0
- data/worochi.gemspec +27 -4
- metadata +193 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69806f4b59d55c009448f571be6a511b5aa374d3
|
4
|
+
data.tar.gz: 107d2fd5ce53ca7fca92803a493c136f37b2e51e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7eeacb62b1a23e3e720b9ae6a274f9d6eab6737155c2ffb952ab12a99852a7192251152e360add6158cf8d3ef221ea7e2607aaf4a02aa7ba376f9c4070b897d1
|
7
|
+
data.tar.gz: fac7680732d95214bc6176faf2760cce1a04e76c85e51d0f1b9fab55c35a4eef09d7fe51881564a27899b5af856aba8fd16ce67855ac81bf4df25cca30c3f0e9
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2013 Pixelapse
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
7
|
+
the Software without restriction, including without limitation the rights to
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -7,6 +7,7 @@ class Worochi
|
|
7
7
|
# @return [Hash] default options for Dropbox
|
8
8
|
def default_options
|
9
9
|
{
|
10
|
+
service: :dropbox,
|
10
11
|
chunk_size: 2*1024*1024,
|
11
12
|
overwrite: true,
|
12
13
|
dir: '/'
|
@@ -20,11 +21,12 @@ class Worochi
|
|
20
21
|
# @return [DropboxClient]
|
21
22
|
def init_client
|
22
23
|
@client = DropboxClient.new(options[:token])
|
24
|
+
@client
|
23
25
|
end
|
24
26
|
|
25
27
|
# Push a single {Item} to Dropbox.
|
26
28
|
#
|
27
|
-
# @param [Item]
|
29
|
+
# @param item [Item]
|
28
30
|
# @return [nil]
|
29
31
|
def push_item(item)
|
30
32
|
Worochi::Log.debug "Uploading #{item.path} (#{item.size} bytes) to Dropbox..."
|
@@ -40,9 +42,15 @@ class Worochi
|
|
40
42
|
# Returns a list of files and subdirectories at the remote path specified
|
41
43
|
# by `options[:dir]`.
|
42
44
|
#
|
45
|
+
# @param path [String] path to list instead of the current directory
|
43
46
|
# @return [Array<Hash>] list of files and subdirectories
|
44
|
-
def list
|
45
|
-
|
47
|
+
def list(path=nil)
|
48
|
+
if path
|
49
|
+
remote_path = path[0] == '/' ? path : File.join(options[:dir], path)
|
50
|
+
else
|
51
|
+
remote_path = options[:dir]
|
52
|
+
end
|
53
|
+
|
46
54
|
begin
|
47
55
|
response = @client.metadata(remote_path)
|
48
56
|
rescue DropboxError
|
@@ -62,8 +70,9 @@ class Worochi
|
|
62
70
|
# Refer to {https://www.dropbox.com/developers/core/docs#chunked-upload
|
63
71
|
# API documentation}.
|
64
72
|
#
|
65
|
-
# @param [Item]
|
73
|
+
# @param item [Item]
|
66
74
|
# @return [nil]
|
75
|
+
# @see https://www.dropbox.com/developers/core/docs#chunked-upload
|
67
76
|
def push_item_chunked(item)
|
68
77
|
Worochi::Log.debug "Using chunk uploader..."
|
69
78
|
uploader = @client.get_chunked_uploader(item.content, item.size)
|
@@ -78,5 +87,18 @@ class Worochi
|
|
78
87
|
uploader.finish(full_path(item), options[:overwrite])
|
79
88
|
nil
|
80
89
|
end
|
90
|
+
|
91
|
+
# Deletes the file at `path` from Dropbox.
|
92
|
+
#
|
93
|
+
# @param path [String] path relative to current directory
|
94
|
+
# @return [Boolean] `true` if a file was actually deleted
|
95
|
+
def delete(path)
|
96
|
+
begin
|
97
|
+
@client.file_delete(File.join(options[:dir], path))
|
98
|
+
rescue DropboxError
|
99
|
+
false
|
100
|
+
end
|
101
|
+
true
|
102
|
+
end
|
81
103
|
end
|
82
104
|
end
|
data/lib/worochi/agent/github.rb
CHANGED
@@ -10,7 +10,8 @@ class Worochi
|
|
10
10
|
# @return [Hash] default options for GitHub
|
11
11
|
def default_options
|
12
12
|
{
|
13
|
-
|
13
|
+
service: :github,
|
14
|
+
source: 'worochi',
|
14
15
|
target: 'worochi',
|
15
16
|
repo: 'darkmirage/test',
|
16
17
|
block_size: Worochi::Helper::Github::BLOCK_SIZE,
|
@@ -26,12 +27,13 @@ class Worochi
|
|
26
27
|
# @return [Octokit::Client]
|
27
28
|
def init_client
|
28
29
|
@client = Octokit::Client.new(login: 'me', oauth_token: options[:token])
|
30
|
+
@client
|
29
31
|
end
|
30
32
|
|
31
33
|
# Pushes a list of {Item} to GitHub.
|
32
34
|
#
|
33
|
-
# @param [Array<Item>]
|
34
|
-
# @return [
|
35
|
+
# @param items [Array<Item>]
|
36
|
+
# @return [String] Commit SHA1 hash
|
35
37
|
# @see Agent#push_items
|
36
38
|
def push_all(items)
|
37
39
|
source_sha = source_branch
|
@@ -39,13 +41,13 @@ class Worochi
|
|
39
41
|
commit = @client.create_commit(repo, options[:commit_msg], source_sha,
|
40
42
|
target_branch)
|
41
43
|
@client.update_ref(repo, "heads/#{options[:target]}", commit.sha)
|
42
|
-
|
44
|
+
commit.sha
|
43
45
|
end
|
44
46
|
|
45
47
|
# Pushes a single {Item} to GitHub. This means making a new commit for each
|
46
48
|
# file. Not recommended and should just use {#push_all} instead.
|
47
49
|
#
|
48
|
-
# @param [Item]
|
50
|
+
# @param item [Item]
|
49
51
|
# @return [nil]
|
50
52
|
def push_item(item)
|
51
53
|
Worochi::Log.warn 'push_item should not be used for GitHub'
|
@@ -55,11 +57,13 @@ class Worochi
|
|
55
57
|
# Returns a list of files and subdirectories at the remote path specified
|
56
58
|
# by `options[:dir]`.
|
57
59
|
#
|
60
|
+
# @param path [String] path to list instead of the current directory
|
61
|
+
# @param sha [String] list a different branch than the `:source`
|
58
62
|
# @return [Array<Hash>] list of files and subdirectories
|
59
|
-
def list
|
60
|
-
remote_path = options[:dir].sub(/^\//, '').sub(/\/$/, '')
|
63
|
+
def list(path=nil, sha=nil)
|
64
|
+
remote_path = (path || options[:dir]).sub(/^\//, '').sub(/\/$/, '')
|
61
65
|
|
62
|
-
result = @client.tree(repo, source_branch, recursive: true).tree
|
66
|
+
result = @client.tree(repo, sha || source_branch, recursive: true).tree
|
63
67
|
result.sort! do |x, y|
|
64
68
|
x.path.split('/').size <=> y.path.split('/').size
|
65
69
|
end
|
@@ -124,7 +128,8 @@ class Worochi
|
|
124
128
|
if item.size > options[:block_size]
|
125
129
|
sha = stream_blob(item)
|
126
130
|
else
|
127
|
-
sha = @client.create_blob(repo, Base64.strict_encode64(item.read),
|
131
|
+
sha = @client.create_blob(repo, Base64.strict_encode64(item.read),
|
132
|
+
'base64')
|
128
133
|
end
|
129
134
|
Worochi::Log.debug "Uploaded [#{sha}]"
|
130
135
|
sha
|
data/lib/worochi/agent/sample.rb
CHANGED
@@ -3,11 +3,14 @@ class Worochi
|
|
3
3
|
# This is a sample of methods that should be implemented by a service agent.
|
4
4
|
class Agent::Sample < Agent
|
5
5
|
|
6
|
+
# This is the minimum set of default options that should be specified.
|
7
|
+
#
|
6
8
|
# @return [Hash] default options for sample API
|
7
9
|
# @see Agent#set_options
|
8
10
|
def default_options
|
9
11
|
{
|
10
|
-
|
12
|
+
service: :sample, # service name
|
13
|
+
dir: '/' # remote directory to act on
|
11
14
|
}
|
12
15
|
end
|
13
16
|
|
@@ -45,11 +48,13 @@ class Worochi
|
|
45
48
|
# least the keys `:name`, `:path`, and `:type`, but can also contain other
|
46
49
|
# service-specific meta information.
|
47
50
|
#
|
51
|
+
# @param path [String] path to list instead of the current directory
|
48
52
|
# @return [Array<Hash>] list of files and subdirectories
|
49
53
|
# @see Agent#folders
|
50
54
|
# @see Agent#files
|
51
|
-
def list
|
52
|
-
|
55
|
+
def list(path=nil)
|
56
|
+
remote_path = path || options[:dir]
|
57
|
+
result = @client.get_file_list(remote_path)
|
53
58
|
result.map do |elem|
|
54
59
|
{
|
55
60
|
name: elem.name,
|
data/lib/worochi/agent.rb
CHANGED
@@ -19,14 +19,13 @@ class Worochi
|
|
19
19
|
# format the file list. An optional `opts` hash can be used to update the
|
20
20
|
# agent options before pushing.
|
21
21
|
#
|
22
|
-
# @example
|
23
|
-
# agent = Worochi.create(:github, 'sfsFj41na89cx')
|
24
|
-
# agent.push({ source: 'http://a.com/file.jpg', path: 'folder/file.jpg' })
|
25
|
-
#
|
26
22
|
# @param origin [Array<Hash>, Array<String>, Hash, String]
|
27
23
|
# @param opts [Hash] update agent options before pushing
|
28
24
|
# @return [nil]
|
29
25
|
# @see Item.open
|
26
|
+
# @example
|
27
|
+
# agent = Worochi.create(:github, 'sfsFj41na89cx')
|
28
|
+
# agent.push({ source: 'http://a.com/file.jpg', path: 'folder/file.jpg' })
|
30
29
|
def push(origin, opts=nil)
|
31
30
|
set_options(opts) unless opts.nil?
|
32
31
|
items = Item.open(origin)
|
@@ -59,23 +58,38 @@ class Worochi
|
|
59
58
|
nil
|
60
59
|
end
|
61
60
|
|
62
|
-
# Returns a list of subdirectories at the remote path specified by
|
63
|
-
# `options[:dir]`. Relies on the service-specific implementation of
|
64
|
-
# `#list`.
|
65
|
-
#
|
66
|
-
# @return [Array<Hash>] list of subdirectories
|
67
|
-
def folders(details=false)
|
68
|
-
result = list.reject { |elem| elem[:type] != 'folder' }
|
69
|
-
result.map { |elem| elem[:name] } unless details
|
70
|
-
end
|
71
|
-
|
72
61
|
# Returns a list of files at the remote path specified by `options[:dir]`.
|
73
62
|
# Relies on the service-specific implementation of `#list`.
|
63
|
+
#
|
64
|
+
# @overload files(details)
|
65
|
+
# @param details [Boolean] display more information
|
66
|
+
# @overload files(path, details=false)
|
67
|
+
# @param path [String] remote path to list instead of current directory
|
68
|
+
# @param details [Boolean] display more information
|
69
|
+
# @return [Array<String>, Array<Hash>] list of files
|
70
|
+
# @example
|
71
|
+
# agent = Worochi.create(:dropbox, 'sfsFj41na89cx', dir: '/abc')
|
72
|
+
# agent.files # => ["k.jpg", "t.txt"]
|
73
|
+
# agent.files(true)
|
74
|
+
# # => [
|
75
|
+
# # { name: "k.jpg", type: "file", path: "/abc/k.jpg"},
|
76
|
+
# # { name: "t.txt", type: "file", path: "/abc/t.txt"}
|
77
|
+
# # ]
|
78
|
+
def files(*args)
|
79
|
+
list_helper(true, args)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Returns a list of subdirectories at the remote path specified by
|
83
|
+
# `options[:dir]`. Relies on the service-specific implementation of
|
84
|
+
# `#list`. Refer to {#files} for overloaded prototypes.
|
74
85
|
#
|
75
|
-
# @return [Array<Hash>] list of
|
76
|
-
|
77
|
-
|
78
|
-
|
86
|
+
# @return [Array<String>, Array<Hash>] list of subdirectories
|
87
|
+
# @see #files
|
88
|
+
# @example
|
89
|
+
# agent = Worochi.create(:dropbox, 'sfsFj41na89cx', dir: '/abc')
|
90
|
+
# agent.folders # => ["folder1", "folder2"]
|
91
|
+
def folders(*args)
|
92
|
+
list_helper(false, args)
|
79
93
|
end
|
80
94
|
|
81
95
|
# Updates {.options} using `opts`.
|
@@ -97,26 +111,51 @@ class Worochi
|
|
97
111
|
options
|
98
112
|
end
|
99
113
|
|
114
|
+
# Returns the display name for the agent's service.
|
115
|
+
#
|
116
|
+
# @return [String] display name
|
117
|
+
def name
|
118
|
+
Worochi::Config.humanize_service(type)
|
119
|
+
end
|
120
|
+
|
100
121
|
private
|
122
|
+
# Parses the arguments for {#files} and {#folders}.
|
123
|
+
#
|
124
|
+
# @param file_only [Boolean] filters files or folders
|
125
|
+
# @param args [Array] argument list
|
126
|
+
# @return [Array<String>, Array<Hash>] list of files or folders
|
127
|
+
def list_helper(file_only, args)
|
128
|
+
details = true if args.first == true
|
129
|
+
if args.first.kind_of?(String)
|
130
|
+
path = args.first
|
131
|
+
details = true if args[1] == true
|
132
|
+
end
|
133
|
+
excluded = file_only ? 'folder' : 'file'
|
134
|
+
result = list(path).reject { |elem| elem[:type] == excluded }
|
135
|
+
result.map! { |elem| elem[:name] } unless details
|
136
|
+
result
|
137
|
+
end
|
138
|
+
|
101
139
|
# @return [String] full path combining remote directory and item path
|
102
140
|
def full_path(item)
|
103
141
|
File.join(options[:dir], item.path)
|
104
142
|
end
|
105
143
|
|
106
|
-
#
|
144
|
+
# Agents should override this.
|
145
|
+
#
|
146
|
+
# @return [nil]
|
107
147
|
def default_options
|
108
|
-
|
148
|
+
raise Error, 'Default options not specified.'
|
109
149
|
end
|
110
150
|
|
111
151
|
class << self
|
112
152
|
public
|
113
153
|
# Creates a new service-specific {Agent} based on `:service`.
|
114
154
|
#
|
115
|
-
# @example
|
116
|
-
# Worochi::Agent.new({ service: :github, token:'6st46setsybhd64' })
|
117
|
-
#
|
118
155
|
# @param opts [Hash] service options; must contain `:service` key.
|
119
156
|
# @return [Agent]
|
157
|
+
# @example
|
158
|
+
# Worochi::Agent.new({ service: :github, token:'6st46setsybhd64' })
|
120
159
|
def new(opts={})
|
121
160
|
service = opts[:service]
|
122
161
|
if self.name == 'Worochi::Agent'
|
@@ -131,6 +170,8 @@ class Worochi
|
|
131
170
|
# Returns the class name for the {Agent} given a service name
|
132
171
|
#
|
133
172
|
# @return [String]
|
173
|
+
# @example
|
174
|
+
# class_name(:google_drive) # => "GoogleDrive"
|
134
175
|
def class_name(service)
|
135
176
|
service.to_s.split('_').map{|e| e.capitalize}.join
|
136
177
|
end
|
data/lib/worochi/config.rb
CHANGED
@@ -1,22 +1,54 @@
|
|
1
1
|
class Worochi
|
2
2
|
# Configurations for Worochi.
|
3
3
|
module Config
|
4
|
-
@services =
|
4
|
+
@services = {
|
5
|
+
github: [1, 'GitHub'],
|
6
|
+
dropbox: [2, 'Dropbox']
|
7
|
+
}
|
5
8
|
@s3_bucket = 'data-pixelapse'
|
6
9
|
@s3_prefix = 's3'
|
7
10
|
|
8
11
|
class << self
|
9
12
|
# Array of service names.
|
13
|
+
#
|
10
14
|
# @return [Array<Symbol>]
|
11
|
-
|
15
|
+
def services
|
16
|
+
@services.keys
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns display name for the service.
|
20
|
+
#
|
21
|
+
# @param service [Symbol]
|
22
|
+
# @return [String] display name
|
23
|
+
def humanize_service(service)
|
24
|
+
@services[service][1]
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns the service ID for the service, which can be used as a
|
28
|
+
# primary key for databases.
|
29
|
+
#
|
30
|
+
# @param service [Symbol]
|
31
|
+
# @return [Integer] service ID
|
32
|
+
def service_id(service)
|
33
|
+
@services[service][0]
|
34
|
+
end
|
12
35
|
|
13
36
|
# Name of S3 bucket.
|
37
|
+
#
|
14
38
|
# @return [String]
|
15
39
|
attr_reader :s3_bucket
|
16
40
|
|
17
41
|
# Prefix for S3 resource paths.
|
42
|
+
#
|
18
43
|
# @return [String]
|
19
44
|
attr_reader :s3_prefix
|
45
|
+
|
46
|
+
# Disable debug and error messages if `true`.
|
47
|
+
#
|
48
|
+
# @return [Boolean]
|
49
|
+
attr_accessor :silent
|
50
|
+
|
51
|
+
alias_method :silent?, :silent
|
20
52
|
end
|
21
53
|
end
|
22
54
|
end
|
data/lib/worochi/error.rb
CHANGED
data/lib/worochi/helper.rb
CHANGED
@@ -1,16 +1,9 @@
|
|
1
1
|
require 'aws-sdk' unless Worochi::Config.s3_bucket.nil?
|
2
2
|
|
3
3
|
class Worochi
|
4
|
+
# Contains any global helper methods not specific to any individual service.
|
4
5
|
module Helper
|
5
6
|
class << self
|
6
|
-
# A regex generated from {Config.s3_prefix} for determining if a given
|
7
|
-
# String is an S3 path.
|
8
|
-
#
|
9
|
-
# @return [Regexp]
|
10
|
-
def s3_prefix_re
|
11
|
-
/^#{Config.s3_prefix}\:/
|
12
|
-
end
|
13
|
-
|
14
7
|
# Given an S3 path, return the full URL for the corresponding object
|
15
8
|
# determined using the AWS SDK.
|
16
9
|
#
|
@@ -29,6 +22,15 @@ class Worochi
|
|
29
22
|
def is_s3_path?(path)
|
30
23
|
!s3_prefix_re.match(path).nil?
|
31
24
|
end
|
25
|
+
|
26
|
+
private
|
27
|
+
# A regex generated from {Config.s3_prefix} for determining if a given
|
28
|
+
# String is an S3 path.
|
29
|
+
#
|
30
|
+
# @return [Regexp]
|
31
|
+
def s3_prefix_re
|
32
|
+
/^#{Config.s3_prefix}\:/
|
33
|
+
end
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
data/lib/worochi/item.rb
CHANGED
@@ -15,10 +15,12 @@ class Worochi
|
|
15
15
|
# An IO object containing the content of the file being pushed.
|
16
16
|
# @return [IO]
|
17
17
|
attr_accessor :content
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
|
19
|
+
# @param path [String] relative destination path including file name
|
20
|
+
# @param content [IO] file content
|
21
|
+
def initialize(path, content)
|
22
|
+
@path = path
|
23
|
+
@content = content
|
22
24
|
@content.rewind
|
23
25
|
end
|
24
26
|
|
@@ -34,7 +36,15 @@ class Worochi
|
|
34
36
|
#
|
35
37
|
# @return [String]
|
36
38
|
def read(*args)
|
37
|
-
content.read(args)
|
39
|
+
content.read(*args)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Rewinds the content. This is just a wrapper for the `#rewind` method on
|
43
|
+
# {#content}.
|
44
|
+
#
|
45
|
+
# @return [0]
|
46
|
+
def rewind
|
47
|
+
content.rewind
|
38
48
|
end
|
39
49
|
|
40
50
|
class << self
|
@@ -79,12 +89,11 @@ class Worochi
|
|
79
89
|
source = entry
|
80
90
|
end
|
81
91
|
|
82
|
-
Item.new(
|
83
|
-
path: path || File.basename(source),
|
84
|
-
content: retrieve(source)
|
85
|
-
})
|
92
|
+
Item.new(path || File.basename(source), retrieve(source))
|
86
93
|
end
|
87
94
|
|
95
|
+
private
|
96
|
+
|
88
97
|
# Retrieves the file content from `source`.
|
89
98
|
#
|
90
99
|
# @param source [String] local or remote location of the file content
|
data/lib/worochi/log.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
require 'logger'
|
2
2
|
|
3
3
|
class Worochi
|
4
|
+
# Implements colored log messages.
|
4
5
|
class Log
|
6
|
+
# Maps severity level to color code for logging.
|
5
7
|
SEVERITY_COLOR = {
|
6
8
|
'DEBUG' => 37,
|
7
9
|
'INFO' => 32,
|
@@ -10,6 +12,7 @@ class Worochi
|
|
10
12
|
'FATAL' => 31
|
11
13
|
}
|
12
14
|
class << self
|
15
|
+
# Initializes the logging system.
|
13
16
|
def init_log
|
14
17
|
@logger = Logger.new(STDOUT)
|
15
18
|
@logger.formatter = proc do |severity, datetime, progname, msg|
|
@@ -17,22 +20,30 @@ class Worochi
|
|
17
20
|
end
|
18
21
|
end
|
19
22
|
|
23
|
+
# Prints DEBUG messages
|
20
24
|
def debug(message)
|
25
|
+
return if Worochi::Config.silent?
|
21
26
|
init_log if @logger.nil?
|
22
27
|
@logger.debug message
|
23
28
|
end
|
24
29
|
|
30
|
+
# Prints WARN messages
|
25
31
|
def warn(message)
|
32
|
+
return if Worochi::Config.silent?
|
26
33
|
init_log if @logger.nil?
|
27
34
|
@logger.warn message
|
28
35
|
end
|
29
36
|
|
37
|
+
# Prints INFO messages
|
30
38
|
def info(message)
|
39
|
+
return if Worochi::Config.silent?
|
31
40
|
init_log if @logger.nil?
|
32
41
|
@logger.info message
|
33
42
|
end
|
34
43
|
|
44
|
+
# Prints ERROR messages
|
35
45
|
def error(message)
|
46
|
+
return if Worochi::Config.silent?
|
36
47
|
init_log if @logger.nil?
|
37
48
|
@logger.error message
|
38
49
|
end
|
data/lib/worochi.rb
CHANGED
@@ -5,6 +5,8 @@ require 'worochi/helper'
|
|
5
5
|
require 'worochi/item'
|
6
6
|
require 'worochi/agent'
|
7
7
|
|
8
|
+
# The main class for the gem. This and the {Agent} class are the main
|
9
|
+
# endpoints for interacting with the remote services.
|
8
10
|
class Worochi
|
9
11
|
@agents = []
|
10
12
|
|
@@ -17,6 +19,11 @@ class Worochi
|
|
17
19
|
# Creates a new {Worochi::Agent} and adds it to the list of agents
|
18
20
|
# listening to {Worochi.push} requests.
|
19
21
|
#
|
22
|
+
# @param service [Symbol] service name as defined in {Config.services}
|
23
|
+
# @param token [String] authorization token for the service API
|
24
|
+
# @param opts [Hash] additional service-specific options
|
25
|
+
# @return [Worochi::Agent]
|
26
|
+
# @see Agent.new
|
20
27
|
# @example
|
21
28
|
# Worochi.create(:dropbox, 'as89h38nFBUSHFfuh99f', { dir: '/folder' })
|
22
29
|
# @example
|
@@ -27,12 +34,6 @@ class Worochi
|
|
27
34
|
# commit_msg: 'Hello'
|
28
35
|
# }
|
29
36
|
# Worochi.create(:github, '6st46setsytgbhd64', opts)
|
30
|
-
#
|
31
|
-
# @param service [Symbol] service name as defined in {Config.services}
|
32
|
-
# @param token [String] authorization token for the service API
|
33
|
-
# @param opts [Hash] additional service-specific options
|
34
|
-
# @return [Worochi::Agent]
|
35
|
-
# @see Agent.new
|
36
37
|
def create(service, token, opts={})
|
37
38
|
opts[:service] = service
|
38
39
|
opts[:token] = token
|
@@ -47,7 +48,7 @@ class Worochi
|
|
47
48
|
# @param agent [Worochi::Agent]
|
48
49
|
# @return [nil]
|
49
50
|
def add(agent)
|
50
|
-
@agents << agent
|
51
|
+
@agents << agent unless @agents.include?(agent)
|
51
52
|
nil
|
52
53
|
end
|
53
54
|
|
@@ -62,13 +63,13 @@ class Worochi
|
|
62
63
|
end
|
63
64
|
|
64
65
|
# Remove all agents belonging to a given service from the list. Removes
|
65
|
-
# all agents if service is not specified.
|
66
|
-
#
|
67
|
-
# @example
|
68
|
-
# Worochi.remove(:dropbox)
|
66
|
+
# all agents if service is not specified.
|
69
67
|
#
|
70
68
|
# @param service [Symbol] service name as defined in {Config.services}
|
71
69
|
# @return [nil]
|
70
|
+
# @see Worochi.reset
|
71
|
+
# @example
|
72
|
+
# Worochi.remove(:dropbox)
|
72
73
|
def remove_service(service=nil)
|
73
74
|
if service.nil?
|
74
75
|
reset
|
@@ -78,18 +79,24 @@ class Worochi
|
|
78
79
|
nil
|
79
80
|
end
|
80
81
|
|
81
|
-
# Removes all agents from the list
|
82
|
+
# Removes all agents from the list.
|
82
83
|
#
|
83
84
|
# @return [nil]
|
84
85
|
def reset
|
85
86
|
@agents.clear
|
86
87
|
end
|
87
88
|
|
88
|
-
# List the active agents.
|
89
|
+
# List the active agents in a human-readable form.
|
89
90
|
#
|
90
|
-
# @
|
91
|
-
|
92
|
-
|
91
|
+
# @param print [Boolean] prints the result if `true`
|
92
|
+
# @return [String] formatted list of agents
|
93
|
+
def list(print=true)
|
94
|
+
list = @agents.each_with_index.map do |a, i|
|
95
|
+
" \033[33m# #{i}\033[0m\t#{a.name}"
|
96
|
+
end
|
97
|
+
result = list.join("\n")
|
98
|
+
puts result if print && !result.empty?
|
99
|
+
result
|
93
100
|
end
|
94
101
|
|
95
102
|
# @return [Integer] number of active agents.
|