makitzo 0.1.2

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.
Files changed (49) hide show
  1. data/Gemfile +12 -0
  2. data/Gemfile.lock +27 -0
  3. data/LICENSE.txt +20 -0
  4. data/README.mdown +22 -0
  5. data/RESOURCES +2 -0
  6. data/Rakefile +51 -0
  7. data/VERSION +1 -0
  8. data/bin/makitzo +6 -0
  9. data/lib/makitzo/application.rb +151 -0
  10. data/lib/makitzo/application_aware.rb +19 -0
  11. data/lib/makitzo/cli.rb +71 -0
  12. data/lib/makitzo/config.rb +148 -0
  13. data/lib/makitzo/file_system.rb +24 -0
  14. data/lib/makitzo/logging/blackhole.rb +16 -0
  15. data/lib/makitzo/logging/collector.rb +170 -0
  16. data/lib/makitzo/logging/colorize.rb +38 -0
  17. data/lib/makitzo/memoized_proc.rb +15 -0
  18. data/lib/makitzo/migrations/commands.rb +11 -0
  19. data/lib/makitzo/migrations/generator.rb +24 -0
  20. data/lib/makitzo/migrations/migration.rb +69 -0
  21. data/lib/makitzo/migrations/migrator.rb +87 -0
  22. data/lib/makitzo/migrations/paths.rb +7 -0
  23. data/lib/makitzo/monkeys/array.rb +10 -0
  24. data/lib/makitzo/monkeys/bangify.rb +15 -0
  25. data/lib/makitzo/monkeys/net-ssh.rb +73 -0
  26. data/lib/makitzo/monkeys/string.rb +15 -0
  27. data/lib/makitzo/multiplexed_reader.rb +26 -0
  28. data/lib/makitzo/settings.rb +30 -0
  29. data/lib/makitzo/ssh/commands/apple.rb +104 -0
  30. data/lib/makitzo/ssh/commands/file_system.rb +59 -0
  31. data/lib/makitzo/ssh/commands/file_transfer.rb +9 -0
  32. data/lib/makitzo/ssh/commands/http.rb +51 -0
  33. data/lib/makitzo/ssh/commands/makitzo.rb +46 -0
  34. data/lib/makitzo/ssh/commands/ruby.rb +18 -0
  35. data/lib/makitzo/ssh/commands/unix.rb +7 -0
  36. data/lib/makitzo/ssh/context.rb +91 -0
  37. data/lib/makitzo/ssh/multi.rb +79 -0
  38. data/lib/makitzo/store/mysql.rb +176 -0
  39. data/lib/makitzo/store/skeleton.rb +46 -0
  40. data/lib/makitzo/world/host.rb +84 -0
  41. data/lib/makitzo/world/named_entity.rb +41 -0
  42. data/lib/makitzo/world/query.rb +54 -0
  43. data/lib/makitzo/world/role.rb +4 -0
  44. data/lib/makitzo.rb +90 -0
  45. data/makitzo.gemspec +106 -0
  46. data/templates/migration.erb +9 -0
  47. data/test/helper.rb +17 -0
  48. data/test/test_makitzo.rb +7 -0
  49. metadata +222 -0
@@ -0,0 +1,84 @@
1
+ module Makitzo; module World
2
+ class Host < NamedEntity
3
+ include Makitzo::FileSystem
4
+
5
+ def roles
6
+ @roles ||= []
7
+ end
8
+
9
+ def roles=(roles)
10
+ resolved_roles = [roles].flatten.map { |r| config.resolve_role(r) }
11
+ @roles = resolved_roles
12
+ end
13
+
14
+ def address
15
+ address = name
16
+
17
+ if username = read_merged(:ssh_username)
18
+ address = "#{username}@#{address}"
19
+ end
20
+
21
+ if port = read_merged(:ssh_port)
22
+ address << ":#{port}"
23
+ end
24
+
25
+ address
26
+ end
27
+
28
+ def root; read_merged(:makitzo_root); end
29
+ def root!; read_merged!(:makitzo_root); end
30
+
31
+ # read a setting from this host, or from its roles
32
+ # if the setting is not present on this host, all roles supplying
33
+ # a non-nil value must be in consensus or else a ConflictingPropertyError
34
+ # will be raised.
35
+ def read_merged(key, default = nil)
36
+ config.synchronize do
37
+ val = read(key)
38
+ if val.nil?
39
+ role_values = roles.map { |r| r.read(key) }.compact.uniq
40
+ raise ConflictingPropertyError if role_values.length > 1
41
+ val = role_values.first
42
+ end
43
+ val.nil? ? default : val
44
+ end
45
+ end
46
+
47
+ def read_merged!(key)
48
+ val = read_merged(key)
49
+ raise MissingPropertyError, "missing property: #{key}" if val.nil?
50
+ val
51
+ end
52
+
53
+ #
54
+ # Store delegators
55
+
56
+ def read_from_store(key, default = nil)
57
+ store.read(self, key) || default
58
+ end
59
+
60
+ def write_to_store(key, value)
61
+ store.write(self, key, value)
62
+ end
63
+
64
+ def read_all_from_store(*keys)
65
+ store.read_all(self, *keys)
66
+ end
67
+
68
+ def write_all_to_store(hash)
69
+ store.write_all(self, hash)
70
+ end
71
+
72
+ def applied_migrations
73
+ store.applied_migrations_for_host(self)
74
+ end
75
+
76
+ def mark_migration_as_applied(migration)
77
+ store.mark_migration_as_applied(self, migration)
78
+ end
79
+
80
+ def unmark_migration_as_applied(migration)
81
+ store.unmark_migration_as_applied(self, migration)
82
+ end
83
+ end
84
+ end; end
@@ -0,0 +1,41 @@
1
+ module Makitzo; module World
2
+ # NamedEntity is a base class for categories of objects uniquely identified
3
+ # by name. Equality is defined based on name and class.
4
+ class NamedEntity
5
+ include ApplicationAware
6
+ include Settings
7
+
8
+ def self.setting_accessor(*syms)
9
+ syms.each do |sym|
10
+ class_eval <<-CODE
11
+ def #{sym}; read(:#{sym}); end
12
+ def #{sym}=(value); set(:#{sym}, value); end
13
+ CODE
14
+ end
15
+ end
16
+
17
+ attr_reader :name
18
+
19
+ setting_accessor :makitzo_root
20
+ setting_accessor :ssh_username, :ssh_port, :ssh_timeout
21
+
22
+ def initialize(app, name, options = {})
23
+ @app, @name = app, name.to_s
24
+ options.each do |k,v|
25
+ send(:"#{k}=", v)
26
+ end
27
+ end
28
+
29
+ def <=>(other); name <=> other.name; end
30
+ def hash; name.hash; end
31
+ def eql?(other); other.is_a?(self.class) && other.name == name; end
32
+
33
+ def to_s; name; end
34
+
35
+ def read!(key)
36
+ val = read(key)
37
+ raise MissingPropertyError if val.nil?
38
+ val
39
+ end
40
+ end
41
+ end; end
@@ -0,0 +1,54 @@
1
+ module Makitzo; module World
2
+ # Query enables selection of a subset of hosts based on name/role
3
+ class Query
4
+ class StringArray < Array
5
+ def <<(item); super(item.to_s); end
6
+ def push(item); super(item.to_s); end
7
+ def unshift(item); super(item.to_s); end
8
+ end
9
+
10
+ # Returns a Query which will match all hosts
11
+ def self.all
12
+ new
13
+ end
14
+
15
+ attr_reader :roles, :hosts
16
+
17
+ def initialize
18
+ @roles, @hosts = StringArray.new, StringArray.new
19
+ end
20
+
21
+ def empty?
22
+ @roles.empty? && @hosts.empty?
23
+ end
24
+
25
+ def merge!(query)
26
+ @roles |= query.roles
27
+ @hosts |= query.hosts
28
+ self
29
+ end
30
+
31
+ def includes?(host)
32
+ empty? || @hosts.include?(host.to_s) || (host.roles.any? { |r| @roles.include?(r.to_s) })
33
+ end
34
+
35
+ def exec(config)
36
+ if !empty?
37
+ hosts, all_hosts = [], config.hosts
38
+
39
+ if @roles.length > 0
40
+ hosts |= all_hosts.select { |host| (@roles & (host.roles.map { |r| r.name })).any? }
41
+ end
42
+
43
+ if @hosts.length > 0
44
+ host_patterns = @hosts.map { |h| Regexp.new('^' + h.gsub('.', '\\.').gsub('*', '.*?') + '$') }
45
+ hosts |= all_hosts.select { |host| host_patterns.any? { |hp| host.name =~ hp } }
46
+ end
47
+ else
48
+ hosts = config.hosts
49
+ end
50
+
51
+ hosts
52
+ end
53
+ end
54
+ end; end
@@ -0,0 +1,4 @@
1
+ module Makitzo; module World
2
+ class Role < NamedEntity
3
+ end
4
+ end; end
data/lib/makitzo.rb ADDED
@@ -0,0 +1,90 @@
1
+ require 'fileutils'
2
+ require 'forwardable'
3
+ require 'set'
4
+ require 'thread'
5
+ require 'ostruct'
6
+ require 'optparse'
7
+ require 'erb'
8
+ require 'date'
9
+ require 'time'
10
+
11
+ require 'active_support'
12
+ require 'active_support/inflector'
13
+ require 'net/ssh'
14
+ require 'net/scp'
15
+ require 'highline'
16
+
17
+ require 'makitzo/monkeys/array'
18
+ require 'makitzo/monkeys/bangify'
19
+ require 'makitzo/monkeys/net-ssh'
20
+ require 'makitzo/monkeys/string'
21
+
22
+ module Makitzo
23
+ ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
24
+
25
+ class ConflictingPropertyError < RuntimeError; end
26
+ class MissingPropertyError < RuntimeError; end
27
+
28
+ def self.apple?
29
+ !! (RUBY_PLATFORM =~ /darwin/)
30
+ end
31
+
32
+ autoload :Application, 'makitzo/application'
33
+ autoload :ApplicationAware, 'makitzo/application_aware'
34
+ autoload :CLI, 'makitzo/cli'
35
+ autoload :Config, 'makitzo/config'
36
+ autoload :FileSystem, 'makitzo/file_system'
37
+ autoload :MemoizedProc, 'makitzo/memoized_proc'
38
+ autoload :Migration, 'makitzo/migration'
39
+ autoload :MultiplexedReader, 'makitzo/multiplexed_reader'
40
+ autoload :Settings, 'makitzo/settings'
41
+
42
+ module Logging
43
+ autoload :Blackhole, 'makitzo/logging/blackhole'
44
+ autoload :Collector, 'makitzo/logging/collector'
45
+ autoload :Colorize, 'makitzo/logging/colorize'
46
+ end
47
+
48
+ module Migrations
49
+ class UnsupportedMigrationError < RuntimeError; end
50
+ class MigrationNotFound < RuntimeError; end
51
+
52
+ autoload :Commands, 'makitzo/migrations/commands'
53
+ autoload :Generator, 'makitzo/migrations/generator'
54
+ autoload :Migration, 'makitzo/migrations/migration'
55
+ autoload :Migrator, 'makitzo/migrations/migrator'
56
+ autoload :Paths, 'makitzo/migrations/paths'
57
+ end
58
+
59
+ module SSH
60
+ class CommandFailed < RuntimeError; end
61
+
62
+ autoload :Context, 'makitzo/ssh/context'
63
+ autoload :Multi, 'makitzo/ssh/multi'
64
+
65
+ module Commands
66
+ autoload :Apple, 'makitzo/ssh/commands/apple'
67
+ autoload :FileSystem, 'makitzo/ssh/commands/file_system'
68
+ autoload :FileTransfer, 'makitzo/ssh/commands/file_transfer'
69
+ autoload :HTTP, 'makitzo/ssh/commands/http'
70
+ autoload :Makitzo, 'makitzo/ssh/commands/makitzo'
71
+ autoload :Ruby, 'makitzo/ssh/commands/ruby'
72
+ autoload :Unix, 'makitzo/ssh/commands/unix'
73
+ end
74
+ end
75
+
76
+ module Store
77
+ class OperationFailedError < RuntimeError; end
78
+ class MissingStoreError < RuntimeError; end
79
+
80
+ autoload :Skeleton, 'makitzo/store/skeleton'
81
+ autoload :MySQL, 'makitzo/store/mysql'
82
+ end
83
+
84
+ module World
85
+ autoload :Host, 'makitzo/world/host'
86
+ autoload :NamedEntity, 'makitzo/world/named_entity'
87
+ autoload :Query, 'makitzo/world/query'
88
+ autoload :Role, 'makitzo/world/role'
89
+ end
90
+ end
data/makitzo.gemspec ADDED
@@ -0,0 +1,106 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{makitzo}
8
+ s.version = "0.1.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jason Frame"]
12
+ s.date = %q{2011-07-08}
13
+ s.default_executable = %q{makitzo}
14
+ s.email = %q{jason@onehackoranother.com}
15
+ s.executables = ["makitzo"]
16
+ s.extra_rdoc_files = [
17
+ "LICENSE.txt",
18
+ "README.mdown"
19
+ ]
20
+ s.files = [
21
+ "Gemfile",
22
+ "Gemfile.lock",
23
+ "LICENSE.txt",
24
+ "README.mdown",
25
+ "RESOURCES",
26
+ "Rakefile",
27
+ "VERSION",
28
+ "bin/makitzo",
29
+ "lib/makitzo.rb",
30
+ "lib/makitzo/application.rb",
31
+ "lib/makitzo/application_aware.rb",
32
+ "lib/makitzo/cli.rb",
33
+ "lib/makitzo/config.rb",
34
+ "lib/makitzo/file_system.rb",
35
+ "lib/makitzo/logging/blackhole.rb",
36
+ "lib/makitzo/logging/collector.rb",
37
+ "lib/makitzo/logging/colorize.rb",
38
+ "lib/makitzo/memoized_proc.rb",
39
+ "lib/makitzo/migrations/commands.rb",
40
+ "lib/makitzo/migrations/generator.rb",
41
+ "lib/makitzo/migrations/migration.rb",
42
+ "lib/makitzo/migrations/migrator.rb",
43
+ "lib/makitzo/migrations/paths.rb",
44
+ "lib/makitzo/monkeys/array.rb",
45
+ "lib/makitzo/monkeys/bangify.rb",
46
+ "lib/makitzo/monkeys/net-ssh.rb",
47
+ "lib/makitzo/monkeys/string.rb",
48
+ "lib/makitzo/multiplexed_reader.rb",
49
+ "lib/makitzo/settings.rb",
50
+ "lib/makitzo/ssh/commands/apple.rb",
51
+ "lib/makitzo/ssh/commands/file_system.rb",
52
+ "lib/makitzo/ssh/commands/file_transfer.rb",
53
+ "lib/makitzo/ssh/commands/http.rb",
54
+ "lib/makitzo/ssh/commands/makitzo.rb",
55
+ "lib/makitzo/ssh/commands/ruby.rb",
56
+ "lib/makitzo/ssh/commands/unix.rb",
57
+ "lib/makitzo/ssh/context.rb",
58
+ "lib/makitzo/ssh/multi.rb",
59
+ "lib/makitzo/store/mysql.rb",
60
+ "lib/makitzo/store/skeleton.rb",
61
+ "lib/makitzo/world/host.rb",
62
+ "lib/makitzo/world/named_entity.rb",
63
+ "lib/makitzo/world/query.rb",
64
+ "lib/makitzo/world/role.rb",
65
+ "makitzo.gemspec",
66
+ "templates/migration.erb",
67
+ "test/helper.rb",
68
+ "test/test_makitzo.rb"
69
+ ]
70
+ s.homepage = %q{http://github.com/jaz303/makitzo}
71
+ s.licenses = ["MIT"]
72
+ s.require_paths = ["lib"]
73
+ s.rubygems_version = %q{1.4.2}
74
+ s.summary = %q{the swiss army knife of remote host manipulation}
75
+
76
+ if s.respond_to? :specification_version then
77
+ s.specification_version = 3
78
+
79
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
80
+ s.add_runtime_dependency(%q<activesupport>, ["~> 3.0.2"])
81
+ s.add_runtime_dependency(%q<net-ssh>, ["~> 2.1.0"])
82
+ s.add_runtime_dependency(%q<net-scp>, ["~> 1.0.4"])
83
+ s.add_runtime_dependency(%q<highline>, ["~> 1.6.1"])
84
+ s.add_development_dependency(%q<bundler>, [">= 0"])
85
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
86
+ s.add_development_dependency(%q<rcov>, [">= 0"])
87
+ else
88
+ s.add_dependency(%q<activesupport>, ["~> 3.0.2"])
89
+ s.add_dependency(%q<net-ssh>, ["~> 2.1.0"])
90
+ s.add_dependency(%q<net-scp>, ["~> 1.0.4"])
91
+ s.add_dependency(%q<highline>, ["~> 1.6.1"])
92
+ s.add_dependency(%q<bundler>, [">= 0"])
93
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
94
+ s.add_dependency(%q<rcov>, [">= 0"])
95
+ end
96
+ else
97
+ s.add_dependency(%q<activesupport>, ["~> 3.0.2"])
98
+ s.add_dependency(%q<net-ssh>, ["~> 2.1.0"])
99
+ s.add_dependency(%q<net-scp>, ["~> 1.0.4"])
100
+ s.add_dependency(%q<highline>, ["~> 1.6.1"])
101
+ s.add_dependency(%q<bundler>, [">= 0"])
102
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
103
+ s.add_dependency(%q<rcov>, [">= 0"])
104
+ end
105
+ end
106
+
@@ -0,0 +1,9 @@
1
+ class <%= @migration_class_name %> < ::Makitzo::Migrations::Migration
2
+ # Restrict this migration to certain roles/hosts:
3
+ # roles :foo, :bar, :baz
4
+ # hosts 'foo.local', 'bar.local'
5
+
6
+ def up
7
+
8
+ end
9
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+
12
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ require 'makitzo'
15
+
16
+ class Test::Unit::TestCase
17
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestMakitzo < Test::Unit::TestCase
4
+ def test_something_for_real
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,222 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: makitzo
3
+ version: !ruby/object:Gem::Version
4
+ hash: 31
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 2
10
+ version: 0.1.2
11
+ platform: ruby
12
+ authors:
13
+ - Jason Frame
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-07-08 00:00:00 +01:00
19
+ default_executable: makitzo
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ type: :runtime
23
+ version_requirements: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 3
31
+ - 0
32
+ - 2
33
+ version: 3.0.2
34
+ requirement: *id001
35
+ prerelease: false
36
+ name: activesupport
37
+ - !ruby/object:Gem::Dependency
38
+ type: :runtime
39
+ version_requirements: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ hash: 11
45
+ segments:
46
+ - 2
47
+ - 1
48
+ - 0
49
+ version: 2.1.0
50
+ requirement: *id002
51
+ prerelease: false
52
+ name: net-ssh
53
+ - !ruby/object:Gem::Dependency
54
+ type: :runtime
55
+ version_requirements: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ~>
59
+ - !ruby/object:Gem::Version
60
+ hash: 31
61
+ segments:
62
+ - 1
63
+ - 0
64
+ - 4
65
+ version: 1.0.4
66
+ requirement: *id003
67
+ prerelease: false
68
+ name: net-scp
69
+ - !ruby/object:Gem::Dependency
70
+ type: :runtime
71
+ version_requirements: &id004 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ hash: 13
77
+ segments:
78
+ - 1
79
+ - 6
80
+ - 1
81
+ version: 1.6.1
82
+ requirement: *id004
83
+ prerelease: false
84
+ name: highline
85
+ - !ruby/object:Gem::Dependency
86
+ type: :development
87
+ version_requirements: &id005 !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ hash: 3
93
+ segments:
94
+ - 0
95
+ version: "0"
96
+ requirement: *id005
97
+ prerelease: false
98
+ name: bundler
99
+ - !ruby/object:Gem::Dependency
100
+ type: :development
101
+ version_requirements: &id006 !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ~>
105
+ - !ruby/object:Gem::Version
106
+ hash: 7
107
+ segments:
108
+ - 1
109
+ - 6
110
+ - 4
111
+ version: 1.6.4
112
+ requirement: *id006
113
+ prerelease: false
114
+ name: jeweler
115
+ - !ruby/object:Gem::Dependency
116
+ type: :development
117
+ version_requirements: &id007 !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ hash: 3
123
+ segments:
124
+ - 0
125
+ version: "0"
126
+ requirement: *id007
127
+ prerelease: false
128
+ name: rcov
129
+ description:
130
+ email: jason@onehackoranother.com
131
+ executables:
132
+ - makitzo
133
+ extensions: []
134
+
135
+ extra_rdoc_files:
136
+ - LICENSE.txt
137
+ - README.mdown
138
+ files:
139
+ - Gemfile
140
+ - Gemfile.lock
141
+ - LICENSE.txt
142
+ - README.mdown
143
+ - RESOURCES
144
+ - Rakefile
145
+ - VERSION
146
+ - bin/makitzo
147
+ - lib/makitzo.rb
148
+ - lib/makitzo/application.rb
149
+ - lib/makitzo/application_aware.rb
150
+ - lib/makitzo/cli.rb
151
+ - lib/makitzo/config.rb
152
+ - lib/makitzo/file_system.rb
153
+ - lib/makitzo/logging/blackhole.rb
154
+ - lib/makitzo/logging/collector.rb
155
+ - lib/makitzo/logging/colorize.rb
156
+ - lib/makitzo/memoized_proc.rb
157
+ - lib/makitzo/migrations/commands.rb
158
+ - lib/makitzo/migrations/generator.rb
159
+ - lib/makitzo/migrations/migration.rb
160
+ - lib/makitzo/migrations/migrator.rb
161
+ - lib/makitzo/migrations/paths.rb
162
+ - lib/makitzo/monkeys/array.rb
163
+ - lib/makitzo/monkeys/bangify.rb
164
+ - lib/makitzo/monkeys/net-ssh.rb
165
+ - lib/makitzo/monkeys/string.rb
166
+ - lib/makitzo/multiplexed_reader.rb
167
+ - lib/makitzo/settings.rb
168
+ - lib/makitzo/ssh/commands/apple.rb
169
+ - lib/makitzo/ssh/commands/file_system.rb
170
+ - lib/makitzo/ssh/commands/file_transfer.rb
171
+ - lib/makitzo/ssh/commands/http.rb
172
+ - lib/makitzo/ssh/commands/makitzo.rb
173
+ - lib/makitzo/ssh/commands/ruby.rb
174
+ - lib/makitzo/ssh/commands/unix.rb
175
+ - lib/makitzo/ssh/context.rb
176
+ - lib/makitzo/ssh/multi.rb
177
+ - lib/makitzo/store/mysql.rb
178
+ - lib/makitzo/store/skeleton.rb
179
+ - lib/makitzo/world/host.rb
180
+ - lib/makitzo/world/named_entity.rb
181
+ - lib/makitzo/world/query.rb
182
+ - lib/makitzo/world/role.rb
183
+ - makitzo.gemspec
184
+ - templates/migration.erb
185
+ - test/helper.rb
186
+ - test/test_makitzo.rb
187
+ has_rdoc: true
188
+ homepage: http://github.com/jaz303/makitzo
189
+ licenses:
190
+ - MIT
191
+ post_install_message:
192
+ rdoc_options: []
193
+
194
+ require_paths:
195
+ - lib
196
+ required_ruby_version: !ruby/object:Gem::Requirement
197
+ none: false
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ hash: 3
202
+ segments:
203
+ - 0
204
+ version: "0"
205
+ required_rubygems_version: !ruby/object:Gem::Requirement
206
+ none: false
207
+ requirements:
208
+ - - ">="
209
+ - !ruby/object:Gem::Version
210
+ hash: 3
211
+ segments:
212
+ - 0
213
+ version: "0"
214
+ requirements: []
215
+
216
+ rubyforge_project:
217
+ rubygems_version: 1.4.2
218
+ signing_key:
219
+ specification_version: 3
220
+ summary: the swiss army knife of remote host manipulation
221
+ test_files: []
222
+