worochi 0.0.0 → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.
|