winnie 0.0.5 → 0.0.6
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.
- data/Gemfile.lock +12 -12
- data/lib/winnie.rb +8 -7
- data/lib/winnie/client.rb +12 -11
- data/lib/winnie/commands/app.rb +4 -3
- data/lib/winnie/commands/base.rb +7 -7
- data/lib/winnie/commands/help.rb +1 -1
- data/lib/winnie/helpers.rb +6 -6
- data/lib/winnie/version.rb +1 -1
- data/spec/client_spec.rb +44 -23
- data/spec/command_spec.rb +10 -10
- data/spec/commands/app_spec.rb +34 -22
- data/spec/commands/base_spec.rb +1 -1
- data/winnie.gemspec +2 -1
- metadata +31 -11
data/Gemfile.lock
CHANGED
@@ -1,34 +1,34 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
winnie (0.0.
|
4
|
+
winnie (0.0.6)
|
5
5
|
json
|
6
6
|
rest-client
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: http://rubygems.org/
|
10
10
|
specs:
|
11
|
+
ZenTest (4.5.0)
|
11
12
|
diff-lcs (1.1.2)
|
12
13
|
fakefs (0.2.1)
|
13
|
-
json (1.
|
14
|
+
json (1.5.1)
|
14
15
|
mime-types (1.16)
|
15
16
|
rest-client (1.6.1)
|
16
17
|
mime-types (>= 1.16)
|
17
|
-
rspec (2.
|
18
|
-
rspec-core (~> 2.
|
19
|
-
rspec-expectations (~> 2.
|
20
|
-
rspec-mocks (~> 2.
|
21
|
-
rspec-core (2.1
|
22
|
-
rspec-expectations (2.
|
18
|
+
rspec (2.2.0)
|
19
|
+
rspec-core (~> 2.2)
|
20
|
+
rspec-expectations (~> 2.2)
|
21
|
+
rspec-mocks (~> 2.2)
|
22
|
+
rspec-core (2.2.1)
|
23
|
+
rspec-expectations (2.2.0)
|
23
24
|
diff-lcs (~> 1.1.2)
|
24
|
-
rspec-mocks (2.
|
25
|
+
rspec-mocks (2.2.0)
|
25
26
|
|
26
27
|
PLATFORMS
|
27
28
|
ruby
|
28
29
|
|
29
30
|
DEPENDENCIES
|
31
|
+
ZenTest
|
30
32
|
fakefs
|
31
|
-
|
32
|
-
rest-client
|
33
|
-
rspec (~> 2.1.0)
|
33
|
+
rspec (~> 2.2.0)
|
34
34
|
winnie!
|
data/lib/winnie.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
# TODO: loop here, and load all commands
|
2
1
|
require 'rubygems'
|
3
2
|
require 'rest_client'
|
4
3
|
require 'json'
|
5
4
|
require 'optparse'
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
require
|
11
|
-
|
5
|
+
|
6
|
+
lib_path = File.expand_path(File.dirname(__FILE__))
|
7
|
+
|
8
|
+
%w(version helpers client command commands/base).each do |file|
|
9
|
+
require File.join(lib_path, "winnie", file)
|
10
|
+
end
|
11
|
+
|
12
|
+
Dir["#{lib_path}/winnie/commands/*"].each { |c| require c }
|
data/lib/winnie/client.rb
CHANGED
@@ -40,10 +40,6 @@ module Winnie
|
|
40
40
|
) { |response, request| process_response(response) }
|
41
41
|
end
|
42
42
|
|
43
|
-
class UnauthorizedException < Exception; end
|
44
|
-
class ResourceNotFoundException < Exception; end
|
45
|
-
class CommandFailedException < Exception; end
|
46
|
-
|
47
43
|
def self.version
|
48
44
|
VERSION
|
49
45
|
end
|
@@ -51,6 +47,7 @@ module Winnie
|
|
51
47
|
private
|
52
48
|
|
53
49
|
def self.winnie_headers
|
50
|
+
# User-Agent header is used by winnie-app to check compatibility
|
54
51
|
{'User-Agent' => "winnie-gem-#{version}",
|
55
52
|
'X-Ruby-Version' => RUBY_VERSION}
|
56
53
|
end
|
@@ -58,7 +55,6 @@ module Winnie
|
|
58
55
|
def process_response(response)
|
59
56
|
# TODO: this fragment could look better
|
60
57
|
if [404, 500, 401].include?(response.code)
|
61
|
-
|
62
58
|
exception = case response.code
|
63
59
|
when 404; ResourceNotFoundException
|
64
60
|
when 500; CommandFailedException
|
@@ -69,13 +65,18 @@ module Winnie
|
|
69
65
|
raise exception.new(error)
|
70
66
|
end
|
71
67
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
68
|
+
begin
|
69
|
+
response.return!
|
70
|
+
JSON.parse(response.body)
|
71
|
+
rescue RestClient::RequestFailed => e
|
72
|
+
raise UnauthorizedException.new if e.http_code == 406
|
73
|
+
raise UnsupportedException.new
|
76
74
|
end
|
77
|
-
|
78
|
-
JSON.parse(response.body)
|
79
75
|
end
|
76
|
+
|
77
|
+
class UnauthorizedException < Exception; end
|
78
|
+
class ResourceNotFoundException < Exception; end
|
79
|
+
class CommandFailedException < Exception; end
|
80
|
+
class UnsupportedException < Exception; end
|
80
81
|
end
|
81
82
|
end
|
data/lib/winnie/commands/app.rb
CHANGED
@@ -4,12 +4,13 @@ module Winnie
|
|
4
4
|
def run
|
5
5
|
list
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
def command
|
9
|
-
|
9
|
+
command = File.exists?(args.first) ? File.read(args.first) : args.first
|
10
|
+
response = winnie.command(command, code_name)
|
10
11
|
display response['result']
|
11
12
|
end
|
12
|
-
|
13
|
+
|
13
14
|
def list
|
14
15
|
apps = winnie.apps
|
15
16
|
|
data/lib/winnie/commands/base.rb
CHANGED
@@ -2,34 +2,34 @@ module Winnie
|
|
2
2
|
module Commands
|
3
3
|
class Base
|
4
4
|
attr_reader :winnie, :args
|
5
|
-
|
5
|
+
|
6
6
|
include Winnie::Helpers
|
7
|
-
|
7
|
+
|
8
8
|
def initialize(*args)
|
9
9
|
@args = args.flatten
|
10
10
|
extract_options(@args)
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def extract_options(args)
|
14
14
|
return if args.empty?
|
15
|
-
|
15
|
+
|
16
16
|
OptionParser.new do |opts|
|
17
17
|
opts.on("-a", "--app [CODE_NAME]", :text, "Run for given application") do |a|
|
18
18
|
@code_name = a
|
19
19
|
end
|
20
20
|
end.parse!(@args)
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def code_name
|
24
24
|
raise ApplicationNotSpecyfiedException.new unless @code_name
|
25
25
|
@code_name
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
def winnie
|
29
29
|
auth = Winnie::Commands::Auth.new
|
30
30
|
@winnie ||= Winnie::Client.new(auth.api_key)
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
def config_path
|
34
34
|
File.expand_path('~/.winnie')
|
35
35
|
end
|
data/lib/winnie/commands/help.rb
CHANGED
@@ -3,7 +3,7 @@ module Winnie
|
|
3
3
|
class Help < Base
|
4
4
|
def run
|
5
5
|
display_columns 'auth', 'Configure your winnie username and password'
|
6
|
-
display_columns 'command', 'Run
|
6
|
+
display_columns 'command <command or file>', 'Run ruby command, a file with commands can be given'
|
7
7
|
display_columns 'list', 'List your applications'
|
8
8
|
display_columns 'help', 'Show this information'
|
9
9
|
end
|
data/lib/winnie/helpers.rb
CHANGED
@@ -4,25 +4,25 @@ module Winnie
|
|
4
4
|
STDOUT << message
|
5
5
|
STDOUT << "\n" if new_line
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
def display_columns(*columns)
|
9
|
-
columns.each { |field| display(field.to_s.ljust(
|
9
|
+
columns.each { |field| display(field.to_s.ljust(30), false) }
|
10
10
|
display ''
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def line
|
14
14
|
display '-' * 45
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def error(message)
|
18
18
|
STDERR << message << "\n"
|
19
19
|
exit 1
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def ask
|
23
23
|
gets.strip
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
def confirm(message)
|
27
27
|
loop do
|
28
28
|
STDERR << message << " (Y/N): "
|
data/lib/winnie/version.rb
CHANGED
data/spec/client_spec.rb
CHANGED
@@ -60,38 +60,59 @@ describe Winnie::Client do
|
|
60
60
|
@client.get('/api/account')
|
61
61
|
end
|
62
62
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
63
|
+
context "on 401 response code" do
|
64
|
+
it "should raise UnauthorizedException" do
|
65
|
+
@response.stub(:code).and_return(401)
|
66
|
+
lambda {
|
67
|
+
@client.get('/api/account')
|
68
|
+
}.should raise_error(Winnie::Client::UnauthorizedException)
|
69
|
+
end
|
68
70
|
end
|
69
71
|
|
70
|
-
|
71
|
-
|
72
|
-
|
72
|
+
context "on 406 response code" do
|
73
|
+
it "should raise UnauthorizedException" do
|
74
|
+
exception = RestClient::RequestFailed.new
|
75
|
+
exception.stub(:http_code).and_return(406)
|
76
|
+
@response.should_receive(:return!).and_raise(exception)
|
73
77
|
|
74
|
-
|
75
|
-
|
76
|
-
|
78
|
+
lambda {
|
79
|
+
@client.get('/api/account')
|
80
|
+
}.should raise_error(Winnie::Client::UnauthorizedException)
|
81
|
+
end
|
77
82
|
end
|
78
83
|
|
79
|
-
|
80
|
-
|
81
|
-
|
84
|
+
context "on 404 response code" do
|
85
|
+
it "should raise ResourceNotFoundException" do
|
86
|
+
@response.stub(:code).and_return(404)
|
87
|
+
@response.stub(:body).and_return({'error' => 'App not found'}.to_json)
|
82
88
|
|
83
|
-
|
84
|
-
|
85
|
-
|
89
|
+
lambda {
|
90
|
+
@client.post('/api/apps/flower/command', :body => 'puts User.count')
|
91
|
+
}.should raise_error(Winnie::Client::ResourceNotFoundException, 'App not found')
|
92
|
+
end
|
86
93
|
end
|
87
94
|
|
88
|
-
|
89
|
-
|
90
|
-
|
95
|
+
context "on 500 response code" do
|
96
|
+
it "should raise CommandFailedException" do
|
97
|
+
@response.stub(:code).and_return(500)
|
98
|
+
@response.stub(:body).and_return({'error' => 'random error happened'}.to_json)
|
91
99
|
|
92
|
-
|
93
|
-
|
94
|
-
|
100
|
+
lambda {
|
101
|
+
@client.post('/api/apps/flower/command', :body => 'puts User.count')
|
102
|
+
}.should raise_error(Winnie::Client::CommandFailedException, 'random error happened')
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context "on unsupported response code" do
|
107
|
+
it "should raise UnknownResponse exception" do
|
108
|
+
exception = RestClient::RequestFailed.new
|
109
|
+
exception.stub(:http_code).and_return(409)
|
110
|
+
@response.should_receive(:return!).and_raise(exception)
|
111
|
+
|
112
|
+
lambda {
|
113
|
+
@client.get('/api/account')
|
114
|
+
}.should raise_error(Winnie::Client::UnsupportedException)
|
115
|
+
end
|
95
116
|
end
|
96
117
|
end
|
97
118
|
|
data/spec/command_spec.rb
CHANGED
@@ -7,7 +7,7 @@ describe Winnie::Command do
|
|
7
7
|
@command.stub!(:respond_to?).and_return(true)
|
8
8
|
Winnie::Commands::Help.stub!(:new).and_return(@command)
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
it "should create command class object" do
|
12
12
|
Winnie::Command.should_receive(:eval).with('Winnie::Commands::Help').and_return(Winnie::Commands::Help)
|
13
13
|
Winnie::Command.run('help')
|
@@ -20,7 +20,7 @@ describe Winnie::Command do
|
|
20
20
|
Winnie::Command.run('help:connection')
|
21
21
|
end
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
describe "and command name is not provided" do
|
25
25
|
it "should invoke run method" do
|
26
26
|
@command.should_receive(:run).and_return(true)
|
@@ -28,34 +28,34 @@ describe Winnie::Command do
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
describe "when command class doesn't exist" do
|
33
33
|
before do
|
34
34
|
@app = mock('Winnie::Commands::App', :list => [])
|
35
35
|
Winnie::Commands::App.stub(:new).and_return(@app)
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
it "should use App command class as default" do
|
39
39
|
Winnie::Commands::App.should_receive(:new).and_return(@app)
|
40
40
|
Winnie::Command.run('list')
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
it "should use command class name as command name" do
|
44
44
|
@app.should_receive(:list)
|
45
45
|
Winnie::Command.run('list')
|
46
|
-
end
|
46
|
+
end
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
it "should notify user when resource doesn't exist" do
|
50
50
|
app = mock(Winnie::Commands::App)
|
51
51
|
app.should_receive(:command).and_raise(Winnie::Client::ResourceNotFoundException.new('App not found'))
|
52
52
|
Winnie::Commands::App.stub(:new).and_return(app)
|
53
|
-
|
53
|
+
|
54
54
|
Winnie::Command.should_receive(:error).with('App not found')
|
55
|
-
|
55
|
+
|
56
56
|
Winnie::Command.run('command', ["'puts User.count'", '--app', 'flower'])
|
57
57
|
end
|
58
|
-
|
58
|
+
|
59
59
|
it "should notify user when command doesn't exist" do
|
60
60
|
Winnie::Command.should_receive(:error).with('Unknown command')
|
61
61
|
Winnie::Command.run('unknown')
|
data/spec/commands/app_spec.rb
CHANGED
@@ -2,13 +2,14 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
|
2
2
|
|
3
3
|
describe Winnie::Commands::App do
|
4
4
|
before do
|
5
|
-
@
|
5
|
+
@client = mock(Winnie::Client)
|
6
|
+
@app = Winnie::Commands::App.new('--app', 'flower', 'Product.cleanup_cache!')
|
7
|
+
@app.stub(:winnie).and_return(@client)
|
6
8
|
@app.stub(:display_columns)
|
9
|
+
@app.stub(:display)
|
7
10
|
@app.stub(:line)
|
8
|
-
@client = mock(Winnie::Client.new('secret-api-key'))
|
9
|
-
@app.stub(:winnie).and_return(@client)
|
10
11
|
end
|
11
|
-
|
12
|
+
|
12
13
|
describe "when user has some apps" do
|
13
14
|
it "should list apps" do
|
14
15
|
@client.should_receive(:apps).and_return(apps)
|
@@ -17,9 +18,9 @@ describe Winnie::Commands::App do
|
|
17
18
|
@app.list
|
18
19
|
end
|
19
20
|
end
|
20
|
-
|
21
|
+
|
21
22
|
describe "when user doesn't have any app" do
|
22
|
-
it "should inform the user that he doesn't have any
|
23
|
+
it "should inform the user that he doesn't have any apps" do
|
23
24
|
@client.should_receive(:apps).and_return([])
|
24
25
|
@app.should_receive(:display).with("You don't have any apps yet")
|
25
26
|
@app.list
|
@@ -27,23 +28,34 @@ describe Winnie::Commands::App do
|
|
27
28
|
end
|
28
29
|
|
29
30
|
describe "running commands" do
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
31
|
+
context "command given by command line parameter" do
|
32
|
+
it "should send command to winnie given as a command line parameter" do
|
33
|
+
@client.should_receive(:command).with('Product.cleanup_cache!', 'flower').and_return({})
|
34
|
+
@app.command
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should display the result" do
|
38
|
+
@client.should_receive(:command).with('Product.cleanup_cache!', 'flower').and_return('result' => 'foo')
|
39
|
+
@app.should_receive(:display).with('foo')
|
40
|
+
@app.command
|
41
|
+
end
|
41
42
|
end
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
|
44
|
+
context "command given by a file" do
|
45
|
+
include FakeFS::SpecHelpers
|
46
|
+
before do
|
47
|
+
File.open('test-command.rb', 'w') { |f| f << '10 + 10' }
|
48
|
+
@app = Winnie::Commands::App.new('--app', 'flower', 'test-command.rb')
|
49
|
+
@app.stub(:winnie).and_return(@client)
|
50
|
+
@app.stub(:display_columns)
|
51
|
+
@app.stub(:display)
|
52
|
+
@app.stub(:line)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should read the file and execute the command" do
|
56
|
+
@client.should_receive(:command).with('10 + 10', 'flower').and_return({})
|
57
|
+
@app.command
|
58
|
+
end
|
47
59
|
end
|
48
60
|
end
|
49
61
|
end
|
data/spec/commands/base_spec.rb
CHANGED
@@ -6,7 +6,7 @@ describe Winnie::Commands::Base do
|
|
6
6
|
Winnie::Commands::Base.new.config_path.should == File.expand_path('~/.winnie')
|
7
7
|
end
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
describe "extract_options" do
|
11
11
|
it "should extract app code name if provided" do
|
12
12
|
base = Winnie::Commands::Base.new('--app', 'crazy-one')
|
data/winnie.gemspec
CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
|
22
22
|
s.add_dependency "json"
|
23
23
|
s.add_dependency "rest-client"
|
24
|
-
s.add_development_dependency "rspec", "~> 2.
|
24
|
+
s.add_development_dependency "rspec", "~> 2.2.0"
|
25
25
|
s.add_development_dependency "fakefs"
|
26
|
+
s.add_development_dependency "ZenTest"
|
26
27
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: winnie
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 19
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- winnie
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-02-23 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -54,12 +54,12 @@ dependencies:
|
|
54
54
|
requirements:
|
55
55
|
- - ~>
|
56
56
|
- !ruby/object:Gem::Version
|
57
|
-
hash:
|
57
|
+
hash: 7
|
58
58
|
segments:
|
59
59
|
- 2
|
60
|
-
-
|
60
|
+
- 2
|
61
61
|
- 0
|
62
|
-
version: 2.
|
62
|
+
version: 2.2.0
|
63
63
|
type: :development
|
64
64
|
version_requirements: *id003
|
65
65
|
- !ruby/object:Gem::Dependency
|
@@ -76,6 +76,20 @@ dependencies:
|
|
76
76
|
version: "0"
|
77
77
|
type: :development
|
78
78
|
version_requirements: *id004
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: ZenTest
|
81
|
+
prerelease: false
|
82
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
hash: 3
|
88
|
+
segments:
|
89
|
+
- 0
|
90
|
+
version: "0"
|
91
|
+
type: :development
|
92
|
+
version_requirements: *id005
|
79
93
|
description: Command line tool which allows interacting with winnie's API
|
80
94
|
email:
|
81
95
|
- winnie-devs@ragnarson.com
|
@@ -140,9 +154,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
154
|
requirements: []
|
141
155
|
|
142
156
|
rubyforge_project: winnie
|
143
|
-
rubygems_version: 1.
|
157
|
+
rubygems_version: 1.5.0
|
144
158
|
signing_key:
|
145
159
|
specification_version: 3
|
146
160
|
summary: Winnie command line tool
|
147
|
-
test_files:
|
148
|
-
|
161
|
+
test_files:
|
162
|
+
- spec/client_spec.rb
|
163
|
+
- spec/command_spec.rb
|
164
|
+
- spec/commands/app_spec.rb
|
165
|
+
- spec/commands/auth_spec.rb
|
166
|
+
- spec/commands/base_spec.rb
|
167
|
+
- spec/spec_helper.rb
|
168
|
+
- spec/winnie_spec.rb
|