taketo 0.1.0 → 0.1.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.
data/README.md CHANGED
@@ -141,9 +141,15 @@ Default configs are merged appropriately.
141
141
 
142
142
  An SSH config file can be generated from taketo config. To do so, run ```taketo --generate-ssh-config```.
143
143
 
144
+
145
+ Taketo has autocompletion support for ZSH; completion file can be found at: scripts/zsh/completion/_taketo
146
+
144
147
  The Changelog:
145
148
  --------------
146
149
 
150
+ ### v0.1.1 (04.12.2012) ###
151
+ * Add basic autocompletion support for ZSH, see scripts/zsh/completion
152
+
147
153
  ### v0.1.0 (04.12.2012) ###
148
154
  * Servers can now be outside projects and environments (userful for standalone servers)
149
155
  * SSH config is being generated both for hostnames and global aliases
@@ -213,6 +219,4 @@ The Changelog:
213
219
  TO-DO:
214
220
  ------
215
221
 
216
- * Define servers outside projects and environments
217
- * Destination completion
218
222
  * Command completion
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
data/bin/taketo CHANGED
@@ -6,6 +6,7 @@ require 'taketo'
6
6
  require 'taketo/constructs_factory'
7
7
  require 'taketo/commands'
8
8
  require 'taketo/destination_resolver'
9
+ require 'taketo/destination_matcher'
9
10
  require 'optparse'
10
11
 
11
12
  Signal.trap("SIGINT") do
@@ -61,6 +62,10 @@ def parse_options
61
62
  options[:debug] = d
62
63
  end
63
64
 
65
+ opts.on("--matches") do |m|
66
+ options[:matches] = m
67
+ end
68
+
64
69
  end.parse!
65
70
 
66
71
  options
@@ -96,7 +101,9 @@ begin
96
101
  destination_path = ARGV.shift.to_s
97
102
  resolver = DestinationResolver.new(config, destination_path)
98
103
 
99
- if options.delete(:view)
104
+ if options.delete(:matches)
105
+ puts DestinationMatcher.new(resolver.servers).matches.join(" ")
106
+ elsif options.delete(:view)
100
107
  node = resolver.get_node
101
108
  traverser = ConfigTraverser.new(node)
102
109
  config_printer = ConfigPrinterVisitor.new
@@ -14,7 +14,7 @@ module Taketo
14
14
  end
15
15
 
16
16
  visit Project do |p|
17
- raise ConfigError, "Project #{p.path}: no environments" unless p.has_environments?
17
+ raise ConfigError, "Project #{p.path}: no servers" unless p.has_servers?
18
18
  end
19
19
 
20
20
  visit Environment do |e|
@@ -0,0 +1,22 @@
1
+ module Taketo
2
+ class DestinationMatcher
3
+ def initialize(servers)
4
+ @servers = servers
5
+ end
6
+
7
+ def matches
8
+ (path_matches + global_alias_matches).uniq
9
+ end
10
+
11
+ private
12
+
13
+ def path_matches
14
+ @servers.map(&:path)
15
+ end
16
+
17
+ def global_alias_matches
18
+ @servers.map(&:global_alias).map(&:to_s).reject(&:empty?)
19
+ end
20
+ end
21
+ end
22
+
@@ -58,7 +58,8 @@ module Taketo
58
58
  when 1
59
59
  results.first
60
60
  else
61
- raise AmbiguousDestinationError,
61
+ exact_match = results.detect { |n| n.path == @path }
62
+ exact_match or raise AmbiguousDestinationError,
62
63
  "There are multiple possible destinations: #{results.map(&:path).join(", ")}"
63
64
  end
64
65
  end
@@ -0,0 +1,23 @@
1
+ require 'acceptance_spec_helper'
2
+
3
+ feature "Aids completion with matches" do
4
+ scenario "Show matching servers" do
5
+ create_config <<-CONFIG
6
+ project :foo do
7
+ server :s1 do
8
+ host '1.2.3.4'
9
+ end
10
+ end
11
+
12
+ server :s10 do
13
+ host '2.3.4.5'
14
+ end
15
+ CONFIG
16
+
17
+ run "taketo s1 --matches"
18
+ exit_status.should be_success
19
+ stdout.should =~ %r{(foo:s1 s10|s10 foo:s1)}
20
+ end
21
+ end
22
+
23
+
@@ -10,7 +10,7 @@ feature "Config validation" do
10
10
  stderr.should include("There are no servers. Add some to your config (~/.taketo.rc.rb by default)")
11
11
  end
12
12
 
13
- scenario "Project has no environments" do
13
+ scenario "Project has no servers" do
14
14
  create_config <<-CONFIG
15
15
  project :foo do
16
16
  end
@@ -26,28 +26,7 @@ feature "Config validation" do
26
26
 
27
27
  run "taketo"
28
28
  exit_status.should_not be_success
29
- stderr.should include("Project foo: no environments")
30
- end
31
-
32
- scenario "Environment has no servers" do
33
- create_config <<-CONFIG
34
- project :foo do
35
- environment :bar do
36
- end
37
- end
38
-
39
- project :bar do
40
- environment :baz do
41
- server :qux do
42
- host '1.2.3.4'
43
- end
44
- end
45
- end
46
- CONFIG
47
-
48
- run "taketo"
49
- exit_status.should_not be_success
50
- stderr.should include("Environment foo:bar: no servers")
29
+ stderr.should include("Project foo: no servers")
51
30
  end
52
31
 
53
32
  scenario "Server has no host defined" do
@@ -18,22 +18,15 @@ end
18
18
  describe "ConfigValidator::ConfigValidatorVisitor" do
19
19
  subject(:visitor) { ConfigValidator::ConfigValidatorVisitor.new }
20
20
 
21
- it "requires config to have servers" do
22
- config = stub(:Config, :has_servers? => false)
23
- error_message = /no servers/
24
- expect { visitor.visit_config(config) }.to raise_error ConfigError, error_message
25
-
26
- config.stub(:has_servers? => true)
27
- expect { visitor.visit_config(config) }.not_to raise_error ConfigError, error_message
28
- end
29
-
30
- it "requires projects to have environments" do
31
- project = stub(:Project, :has_environments? => false, :path => "my_project")
32
- error_message = /my_project: no environments/
33
- expect { visitor.visit_project(project) }.to raise_error ConfigError, error_message
34
-
35
- project.stub(:has_environments? => true)
36
- expect { visitor.visit_project(project) }.not_to raise_error ConfigError, error_message
21
+ { :Config => nil, :Project => "my_project" }.each do |node_type, path|
22
+ it "requires #{node_type} to have servers" do
23
+ node = stub(node_type, :has_servers? => false, :path => path)
24
+ error_message = /#{path ? path + ": " : ""}no servers/
25
+ expect { visitor.send("visit_#{node_type.to_s.downcase}", node) }.to raise_error ConfigError, error_message
26
+
27
+ node.stub(:has_servers? => true)
28
+ expect { visitor.send("visit_#{node_type.to_s.downcase}", node) }.not_to raise_error ConfigError, error_message
29
+ end
37
30
  end
38
31
 
39
32
  it "requires environments to have servers" do
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ require 'support/helpers/construct_spec_helper'
3
+ require 'taketo/support/named_nodes_collection'
4
+ require 'taketo/destination_matcher'
5
+
6
+ describe "DestinationMatcher" do
7
+ include ConstructsFixtures
8
+
9
+ let!(:server1) { s = server(:s1); s.global_alias = :foo_server_alias; s }
10
+ let!(:environment1) { environment(:bar, :servers => server1) }
11
+ let!(:project1) { project(:foo, :environments => environment1) }
12
+
13
+ let!(:server2) { server(:s2) }
14
+
15
+ let!(:config) { create_config(:projects => project1, :servers => server2) }
16
+
17
+ subject(:matcher) { Taketo::DestinationMatcher.new([server1, server2]) }
18
+
19
+ describe "#matches" do
20
+ it "returns list of all server paths" do
21
+ expect(matcher.matches).to match_array(%w(foo_server_alias foo:bar:s1 s2))
22
+ end
23
+ end
24
+
25
+ end
26
+
@@ -21,7 +21,9 @@ describe "DestinationResolver" do
21
21
  let(:environment3) { environment(:corge, :servers => [server3, server4]) }
22
22
  let(:project3) { project(:quux, :environments => environment3) }
23
23
 
24
- let(:environment4) { environment(:garply, :servers => [server(:s5), server(:s6)]) }
24
+ let(:server5) { server(:s5) }
25
+ let(:server6) { server(:s6) }
26
+ let(:environment4) { environment(:garply, :servers => [server5, server6]) }
25
27
  let(:environment5) { environment(:waldo, :servers => server(:s7)) }
26
28
  let(:project4) { project(:grault, :environments => [environment4, environment5]) }
27
29
 
@@ -127,6 +129,15 @@ describe "DestinationResolver" do
127
129
  expect(resolver(config, "").resolve).to eq(server1)
128
130
  end
129
131
  end
132
+
133
+ context "when there is exact match and partial match" do
134
+ it "resolves to exact match" do
135
+ s1 = server(:server1)
136
+ s10 = server(:server10)
137
+ config = create_config(:servers => [s1, s10])
138
+ expect(resolver(config, "server1").resolve).to eq(s1)
139
+ end
140
+ end
130
141
  end
131
142
 
132
143
  context "when there is global matching server alias" do
metadata CHANGED
@@ -1,91 +1,89 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: taketo
3
- version: !ruby/object:Gem::Version
4
- hash: 27
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 0
10
- version: 0.1.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Vladimir Yarotsky
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-12-04 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-12-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: rspec
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
18
+ requirements:
26
19
  - - ~>
27
- - !ruby/object:Gem::Version
28
- hash: 21
29
- segments:
30
- - 2
31
- - 11
32
- version: "2.11"
20
+ - !ruby/object:Gem::Version
21
+ version: '2.11'
33
22
  type: :development
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: rake
37
23
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '2.11'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
39
33
  none: false
40
- requirements:
34
+ requirements:
41
35
  - - ~>
42
- - !ruby/object:Gem::Version
43
- hash: 25
44
- segments:
45
- - 0
46
- - 9
47
- version: "0.9"
36
+ - !ruby/object:Gem::Version
37
+ version: '0.9'
48
38
  type: :development
49
- version_requirements: *id002
50
- - !ruby/object:Gem::Dependency
51
- name: simplecov
52
39
  prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '0.9'
46
+ - !ruby/object:Gem::Dependency
47
+ name: simplecov
48
+ requirement: !ruby/object:Gem::Requirement
54
49
  none: false
55
- requirements:
50
+ requirements:
56
51
  - - ~>
57
- - !ruby/object:Gem::Version
58
- hash: 7
59
- segments:
60
- - 0
61
- - 6
62
- version: "0.6"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.6'
63
54
  type: :development
64
- version_requirements: *id003
65
- - !ruby/object:Gem::Dependency
66
- name: open4
67
55
  prerelease: false
68
- requirement: &id004 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0.6'
62
+ - !ruby/object:Gem::Dependency
63
+ name: open4
64
+ requirement: !ruby/object:Gem::Requirement
69
65
  none: false
70
- requirements:
66
+ requirements:
71
67
  - - ~>
72
- - !ruby/object:Gem::Version
73
- hash: 9
74
- segments:
75
- - 1
76
- - 3
77
- version: "1.3"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.3'
78
70
  type: :development
79
- version_requirements: *id004
80
- description: " Taketo is an utility to aid quick access to often used servers for web-developers.\n Taketo uses a config written in ruby using light DSL.\n See http://github.com/v-yarotsky/taketo for additional instructions\n"
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '1.3'
78
+ description: ! " Taketo is an utility to aid quick access to often used servers
79
+ for web-developers.\n Taketo uses a config written in ruby using light DSL.\n
80
+ \ See http://github.com/v-yarotsky/taketo for additional instructions\n"
81
81
  email: vladimir.yarotksy@gmail.com
82
- executables:
82
+ executables:
83
83
  - taketo
84
84
  extensions: []
85
-
86
85
  extra_rdoc_files: []
87
-
88
- files:
86
+ files:
89
87
  - bin/taketo
90
88
  - lib/taketo/associated_nodes.rb
91
89
  - lib/taketo/commands/ssh_command.rb
@@ -102,6 +100,7 @@ files:
102
100
  - lib/taketo/constructs/server.rb
103
101
  - lib/taketo/constructs.rb
104
102
  - lib/taketo/constructs_factory.rb
103
+ - lib/taketo/destination_matcher.rb
105
104
  - lib/taketo/destination_resolver.rb
106
105
  - lib/taketo/dsl.rb
107
106
  - lib/taketo/printer.rb
@@ -111,6 +110,7 @@ files:
111
110
  - lib/taketo/support.rb
112
111
  - lib/taketo.rb
113
112
  - spec/acceptance/command_spec.rb
113
+ - spec/acceptance/completion_spec.rb
114
114
  - spec/acceptance/config_dsl_spec.rb
115
115
  - spec/acceptance/config_validation_spec.rb
116
116
  - spec/acceptance/connect_to_server_spec.rb
@@ -133,6 +133,7 @@ files:
133
133
  - spec/lib/taketo/constructs/project_spec.rb
134
134
  - spec/lib/taketo/constructs/server_spec.rb
135
135
  - spec/lib/taketo/constructs_factory_spec.rb
136
+ - spec/lib/taketo/destination_matcher_spec.rb
136
137
  - spec/lib/taketo/destination_resolver_spec.rb
137
138
  - spec/lib/taketo/dsl_spec.rb
138
139
  - spec/lib/taketo/ssh_config_generator_visitor_spec.rb
@@ -150,40 +151,29 @@ files:
150
151
  - README.md
151
152
  - VERSION
152
153
  homepage: http://github.com/v-yarotsky/taketo
153
- licenses:
154
+ licenses:
154
155
  - MIT
155
156
  post_install_message:
156
157
  rdoc_options: []
157
-
158
- require_paths:
158
+ require_paths:
159
159
  - lib
160
- required_ruby_version: !ruby/object:Gem::Requirement
160
+ required_ruby_version: !ruby/object:Gem::Requirement
161
161
  none: false
162
- requirements:
163
- - - ">="
164
- - !ruby/object:Gem::Version
165
- hash: 3
166
- segments:
167
- - 0
168
- version: "0"
169
- required_rubygems_version: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
170
167
  none: false
171
- requirements:
172
- - - ">="
173
- - !ruby/object:Gem::Version
174
- hash: 23
175
- segments:
176
- - 1
177
- - 3
178
- - 6
168
+ requirements:
169
+ - - ! '>='
170
+ - !ruby/object:Gem::Version
179
171
  version: 1.3.6
180
172
  requirements: []
181
-
182
173
  rubyforge_project:
183
174
  rubygems_version: 1.8.24
184
175
  signing_key:
185
176
  specification_version: 3
186
- summary: A tiny helper utility to make access to servers eaiser for different projects and environments
177
+ summary: A tiny helper utility to make access to servers eaiser for different projects
178
+ and environments
187
179
  test_files: []
188
-
189
- has_rdoc: