billy_the_tool 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.
- data/LICENSE.txt +20 -0
- data/README.md +28 -0
- data/bin/billy +7 -0
- data/lib/billy/commands/command.rb +36 -0
- data/lib/billy/commands/config.rb +25 -0
- data/lib/billy/commands/eat.rb +68 -0
- data/lib/billy/commands/hello.rb +79 -0
- data/lib/billy/commands/walk.rb +130 -0
- data/lib/billy/commands.rb +24 -0
- data/lib/billy/config.rb +117 -0
- data/lib/billy/session.rb +29 -0
- data/lib/billy.rb +7 -0
- metadata +199 -0
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 4pcbr
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# Billy the tool
|
2
|
+
|
3
|
+
## Commands
|
4
|
+
|
5
|
+
### Setup existing project
|
6
|
+
* billy hello
|
7
|
+
* billy eat {billy_config}
|
8
|
+
|
9
|
+
### Deploy existing project
|
10
|
+
* billy walk {app_name}
|
11
|
+
|
12
|
+
## Sample config file
|
13
|
+
|
14
|
+
```
|
15
|
+
deploy_to: /var/web/
|
16
|
+
user: user
|
17
|
+
server: 192.168.216.93
|
18
|
+
```
|
19
|
+
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
```bash
|
23
|
+
cd ~
|
24
|
+
billy eat http://192.168.216.93/billy.cfg
|
25
|
+
cd project_name
|
26
|
+
billy walk project_name
|
27
|
+
open http://192.168.216.93/project_name/index.html
|
28
|
+
```
|
data/bin/billy
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'billy/commands'
|
2
|
+
|
3
|
+
class Billy
|
4
|
+
class Commands
|
5
|
+
class Command
|
6
|
+
|
7
|
+
def name
|
8
|
+
self.class.to_s.split( "::" ).last.downcase
|
9
|
+
end
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_confirmation
|
17
|
+
gets.chomp.downcase == "y"
|
18
|
+
end
|
19
|
+
|
20
|
+
class << self
|
21
|
+
|
22
|
+
attr_accessor :_instance
|
23
|
+
|
24
|
+
def instance
|
25
|
+
self._instance ||= self.new
|
26
|
+
end
|
27
|
+
|
28
|
+
def register_self!
|
29
|
+
Billy::Commands.register_command!( instance )
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'billy/commands/command'
|
2
|
+
|
3
|
+
class Billy
|
4
|
+
class Commands
|
5
|
+
class Config < Command
|
6
|
+
|
7
|
+
def proceed!( arguments = nil )
|
8
|
+
dir = Dir.pwd
|
9
|
+
if !Billy::Config.config_exists?( dir )
|
10
|
+
print "Billy config file could not be found here. Say Billy hello."
|
11
|
+
exit 1
|
12
|
+
else
|
13
|
+
Billy::Config.load!( dir )
|
14
|
+
print "Current Billy settings: \n"
|
15
|
+
Billy::Config.settings.each_pair do |k, v|
|
16
|
+
print "#{k}:\t\t\t#{v}\n"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
Billy::Commands::Config.register_self!
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'net/http'
|
3
|
+
require 'billy/commands/command'
|
4
|
+
|
5
|
+
class Billy
|
6
|
+
class Commands
|
7
|
+
class Eat < Command
|
8
|
+
|
9
|
+
def proceed!( arguments )
|
10
|
+
( path = arguments.shift ) unless arguments.nil?
|
11
|
+
begin
|
12
|
+
if path.nil? || path.empty?
|
13
|
+
raise "No config path given. \nYou have to provide some settings path, e.g. in your local filesystem or direct link to blob file in repository etc.\n"
|
14
|
+
elsif uri?( path ) && ( result = load_remote_config( path ) ).nil?
|
15
|
+
raise "Remote config file could not be loaded"
|
16
|
+
elsif file?( path ) && ( !File.exists?( path ) || ( result = File.read( path ) ).nil? )
|
17
|
+
raise "Config File not found: #{path}"
|
18
|
+
end
|
19
|
+
rescue Exception => e
|
20
|
+
print e.message
|
21
|
+
exit 1
|
22
|
+
end
|
23
|
+
eat_config( result )
|
24
|
+
save_config
|
25
|
+
end
|
26
|
+
|
27
|
+
def eat_config( config_string )
|
28
|
+
Billy::Config.instance.eat_string_config( config_string )
|
29
|
+
end
|
30
|
+
|
31
|
+
def save_config
|
32
|
+
print "Parsed config data:\n"
|
33
|
+
Billy::Config.settings.each_pair do |k, v|
|
34
|
+
print "#{k}: #{v}\n"
|
35
|
+
end
|
36
|
+
print "Save this settings?(y/n): "
|
37
|
+
confirm = get_confirmation
|
38
|
+
if !confirm
|
39
|
+
print "Billy didn't save config file. Skipping\n"
|
40
|
+
exit 1
|
41
|
+
end
|
42
|
+
Billy::Config.save
|
43
|
+
print "Billy saved config file to #{Billy::Config::BILLYRC}\n"
|
44
|
+
end
|
45
|
+
|
46
|
+
def uri?( str )
|
47
|
+
begin
|
48
|
+
uri = URI.parse( str )
|
49
|
+
%w( http https ).include?( uri.scheme )
|
50
|
+
rescue
|
51
|
+
false
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def file?( str )
|
56
|
+
!uri?( str )
|
57
|
+
end
|
58
|
+
|
59
|
+
def load_remote_config( path )
|
60
|
+
uri = URI( path )
|
61
|
+
Net::HTTP.get( uri )
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
Billy::Commands::Eat.register_self!
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'billy/commands/command'
|
2
|
+
|
3
|
+
class Billy
|
4
|
+
class Commands
|
5
|
+
class Hello < Command
|
6
|
+
|
7
|
+
def proceed!( arguments = nil )
|
8
|
+
billy_say_hello
|
9
|
+
path = get_init_path( arguments )
|
10
|
+
config = Billy::Config.instance
|
11
|
+
config.save!( path, true )
|
12
|
+
if !ssh_command_exists?
|
13
|
+
suggest_install_ssh
|
14
|
+
exit 1
|
15
|
+
end
|
16
|
+
offer_ssh_keygen unless ssh_key_exists?
|
17
|
+
print "All done!\n"
|
18
|
+
end
|
19
|
+
|
20
|
+
def billy_say_hello
|
21
|
+
print "Hi! I'm Billy, simple deploy tool.\n"
|
22
|
+
print "Usage:\n"
|
23
|
+
print " * billy hello (path) -- init billy in {path} folder. Inites in current if no one given.\n"
|
24
|
+
print " * billy eat {cfg_path} -- parse and save billy config in current folder. {cfg_path} here means remote file url or local one.\n"
|
25
|
+
print " * billy walk {application_name} -- deploy HEAD version in repository to remote server.\n"
|
26
|
+
end
|
27
|
+
|
28
|
+
def ssh_command_exists?
|
29
|
+
res = true
|
30
|
+
%w(ssh ssh-keygen).each do |cmd|
|
31
|
+
res &= system( "which #{cmd} 2>&1 > /dev/null" )
|
32
|
+
end
|
33
|
+
res
|
34
|
+
end
|
35
|
+
|
36
|
+
def ssh_key_exists?
|
37
|
+
ssh_root_path = File.expand_path( "~/.ssh" )
|
38
|
+
res = true
|
39
|
+
res &= File.exists?( ssh_root_path )
|
40
|
+
res &= File.directory?( ssh_root_path )
|
41
|
+
res &= Dir[ ssh_root_path + "/*.pub" ].any?
|
42
|
+
res
|
43
|
+
end
|
44
|
+
|
45
|
+
def suggest_install_ssh
|
46
|
+
print "Billy wants you to install ssh command. Please do it first.\n"
|
47
|
+
end
|
48
|
+
|
49
|
+
def offer_ssh_keygen
|
50
|
+
print "Billy did not find your ssh key. Would you like to create it now?(y/n): "
|
51
|
+
confirm = get_confirmation
|
52
|
+
if !confirm
|
53
|
+
print "Ssh key should be generated before we continue. Please generate it.\n"
|
54
|
+
exit 1
|
55
|
+
end
|
56
|
+
enc_type = 'rsa'
|
57
|
+
print "Billy creates ssh keys for you...\n"
|
58
|
+
system "ssh-keygen -t #{enc_type} -N '' -f ~/.ssh/id_#{enc_type}"
|
59
|
+
print "All done!"
|
60
|
+
end
|
61
|
+
|
62
|
+
def get_init_path( arguments )
|
63
|
+
( path = arguments.shift ) unless arguments.nil?
|
64
|
+
if path.nil? || path.empty?
|
65
|
+
print "Billy will be inited in current directory. Proceed?(y/n): "
|
66
|
+
confirm = get_confirmation
|
67
|
+
if !confirm
|
68
|
+
print "Billy has nothing to do. Bye-bye."
|
69
|
+
end
|
70
|
+
path = Dir.pwd
|
71
|
+
end
|
72
|
+
File.expand_path( path )
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
Billy::Commands::Hello.register_self!
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'billy/commands/command'
|
2
|
+
require 'capistrano'
|
3
|
+
|
4
|
+
class Billy
|
5
|
+
class Commands
|
6
|
+
class Walk < Command
|
7
|
+
|
8
|
+
GIT_PATH = ".git"
|
9
|
+
|
10
|
+
def proceed!( arguments = nil )
|
11
|
+
|
12
|
+
if !Billy::Config.load
|
13
|
+
print "Billy config could not be found. Say Billy hello."
|
14
|
+
exit 1
|
15
|
+
end
|
16
|
+
|
17
|
+
destination = ( arguments.shift rescue nil ) || Billy::Config.instance.destination
|
18
|
+
|
19
|
+
if destination.nil?
|
20
|
+
print "Billy doesn't know where to walk."
|
21
|
+
print "You have to provide deploy folder, e.g.: billy walk my_super_project.\n"
|
22
|
+
exit 1
|
23
|
+
end
|
24
|
+
|
25
|
+
cap = prepare_capistrano( destination )
|
26
|
+
%w(deploy:setup deploy).each do |command|
|
27
|
+
cap.find_and_execute_task(command, :before => :start, :after => :finish)
|
28
|
+
end
|
29
|
+
cap.trigger( :exit )
|
30
|
+
|
31
|
+
print "All done! Billy is a clever boy!\n"
|
32
|
+
end
|
33
|
+
|
34
|
+
def prepare_capistrano( destination )
|
35
|
+
|
36
|
+
cap = Capistrano::Configuration.new
|
37
|
+
cap.load "standard"
|
38
|
+
cap.load "deploy"
|
39
|
+
cap.trigger( :load )
|
40
|
+
config = Billy::Config.instance
|
41
|
+
|
42
|
+
if config.deploy_to.nil?
|
43
|
+
print "Billy doesn't know remote deploy path. Please provide it in config under deploy_to key.\n"
|
44
|
+
exit 1
|
45
|
+
end
|
46
|
+
|
47
|
+
cap.set :scm, "git"
|
48
|
+
cap.set :use_sudo, false
|
49
|
+
cap.set :deploy_via, :remote_cache
|
50
|
+
cap.set :application, destination
|
51
|
+
cap.set :deploy_to, File.join( config.deploy_to, destination )
|
52
|
+
cap.server config.server, :app, :web, :db, :primary => true
|
53
|
+
cap.set :user, config.user
|
54
|
+
|
55
|
+
repository = config.repository || get_repository_path
|
56
|
+
|
57
|
+
cap.set :repository, repository
|
58
|
+
cap.set :normalize_asset_timestamps, false
|
59
|
+
|
60
|
+
cap.namespace :deploy do
|
61
|
+
cap.task :start, :roles => :app do; end
|
62
|
+
cap.task :stop, :roles => :app do; end
|
63
|
+
cap.task :restart, :roles => :app do; end
|
64
|
+
end
|
65
|
+
|
66
|
+
cap
|
67
|
+
end
|
68
|
+
|
69
|
+
def get_repository_path
|
70
|
+
if !local_repository_exists?
|
71
|
+
print "Git repository was not created. Do you want Billy to create it now?\n"
|
72
|
+
confirm = get_confirmation
|
73
|
+
if !confirm
|
74
|
+
print "Billy could not proceed without git repository.\n"
|
75
|
+
exit 1
|
76
|
+
else
|
77
|
+
print "Creating git repository.\n"
|
78
|
+
init_git_repository
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
config = get_git_config
|
83
|
+
|
84
|
+
if !remote_repository_exists?( config )
|
85
|
+
print "Billy could not find remote repository for your project.\n"
|
86
|
+
print "Please add some remote, e.g. git remote add git@github.com:myUsername/myProject.git.\n"
|
87
|
+
exit 1
|
88
|
+
end
|
89
|
+
|
90
|
+
idx = 1
|
91
|
+
i = 0
|
92
|
+
|
93
|
+
match_data = get_remotes( config )
|
94
|
+
|
95
|
+
if match_data.length > 1
|
96
|
+
print "Billy found several remotes in repository. Choose one to deploy from:"
|
97
|
+
match_data.each do |remote|
|
98
|
+
i += 1
|
99
|
+
print "#{i}: #{remote[0]}\t\t#{remote[1]}\n"
|
100
|
+
end
|
101
|
+
while ( idx = gets.chomp.to_i ) > match_data.length; end
|
102
|
+
end
|
103
|
+
match_data[ idx - 1 ][ 1 ]
|
104
|
+
end
|
105
|
+
|
106
|
+
def get_git_config
|
107
|
+
File.read( File.expand_path( GIT_PATH + "/config" ) )
|
108
|
+
end
|
109
|
+
|
110
|
+
def local_repository_exists?
|
111
|
+
File.exists?( File.expand_path( GIT_PATH ) )
|
112
|
+
end
|
113
|
+
|
114
|
+
def remote_repository_exists?( config )
|
115
|
+
get_remotes( config ).any?
|
116
|
+
end
|
117
|
+
|
118
|
+
def get_remotes( config )
|
119
|
+
config.gsub( /\n/, ';' ).scan /\[remote\s+\"([^"]+)\"\][^\[]+url\s*=\s*([^;]+)/
|
120
|
+
end
|
121
|
+
|
122
|
+
def init_git_repository
|
123
|
+
system "git init ."
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
Billy::Commands::Walk.register_self!
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Billy
|
2
|
+
class Commands
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
attr_accessor :pool
|
7
|
+
|
8
|
+
def load_pool!
|
9
|
+
self.pool ||= Hash.new
|
10
|
+
commands_path = File.expand_path( File.dirname(__FILE__) + '/commands/**/*.rb' )
|
11
|
+
Dir[ commands_path ].each do |file|
|
12
|
+
require file
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def register_command!( command )
|
17
|
+
load_pool! unless !pool.nil?
|
18
|
+
( pool[ command.name ] = command ) unless pool.values.include?( command )
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
data/lib/billy/config.rb
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
class Billy
|
2
|
+
class Config
|
3
|
+
|
4
|
+
BILLYRC = '.billyrc'
|
5
|
+
SEPARATOR = ': '
|
6
|
+
|
7
|
+
attr_accessor :storage
|
8
|
+
attr_accessor :storage_path
|
9
|
+
|
10
|
+
def method_missing( m, *args, &block )
|
11
|
+
if m.to_s[ /=$/ ].nil?
|
12
|
+
self.storage[ m.to_s ]
|
13
|
+
else
|
14
|
+
key = ( m.to_s )[ /^([^=]+)/ ]
|
15
|
+
val = args.shift
|
16
|
+
( self.storage[ key ] = val ) unless key.nil? && key.empty?
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def config_exists?( dir )
|
21
|
+
File.exists?( File.expand_path( dir + "/#{BILLYRC}" ) )
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
[].tap { |res|
|
26
|
+
self.storage.each_pair do |k, v|
|
27
|
+
res.push "#{k}#{SEPARATOR}#{v}"
|
28
|
+
end
|
29
|
+
}.push( "" ).join( "\n" )
|
30
|
+
end
|
31
|
+
|
32
|
+
def load
|
33
|
+
%w(. ~).each do |path|
|
34
|
+
begin
|
35
|
+
load!( File.expand_path( path ) )
|
36
|
+
return true
|
37
|
+
rescue
|
38
|
+
next
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
false
|
43
|
+
end
|
44
|
+
|
45
|
+
def load!( dir )
|
46
|
+
self.storage_path = File.expand_path( dir )
|
47
|
+
file_path = storage_path + "/#{BILLYRC}"
|
48
|
+
raise "Config was not found in #{path}" unless File.exists?( file_path )
|
49
|
+
eat_string_config( File.read( file_path ) )
|
50
|
+
end
|
51
|
+
|
52
|
+
def clear
|
53
|
+
self.storage.clear
|
54
|
+
end
|
55
|
+
|
56
|
+
def reload!( dir = nil )
|
57
|
+
dir ||= storage_path
|
58
|
+
clear
|
59
|
+
load!( dir )
|
60
|
+
end
|
61
|
+
|
62
|
+
def save( dir = nil )
|
63
|
+
dir ||= Dir.pwd
|
64
|
+
begin
|
65
|
+
save!( dir, true )
|
66
|
+
true
|
67
|
+
rescue
|
68
|
+
false
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def save!( dir, force = false )
|
73
|
+
raise 'Directory name should not be empty' unless !dir.empty?
|
74
|
+
raise "Directory #{dir.to_s} doesn't exist" unless File.exist?( File.expand_path( dir ) )
|
75
|
+
billyrc_path = File.expand_path( dir + "/#{BILLYRC}" )
|
76
|
+
raise "Config already exists in #{billyrc_path}" unless !File.exists?( billyrc_path ) || force
|
77
|
+
File.open( billyrc_path, 'w' ) { |file|
|
78
|
+
file.flush
|
79
|
+
file.write( self.to_s )
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
def eat_string_config( string_config )
|
84
|
+
clear
|
85
|
+
string_config.each_line do |line|
|
86
|
+
next unless !line.empty?
|
87
|
+
items = line.split( SEPARATOR )
|
88
|
+
k = items.shift
|
89
|
+
v = items.join( SEPARATOR ).strip
|
90
|
+
( self.storage[ k.to_s ] = v ) unless k.nil? || k.empty? || v.nil? || v.empty?
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
protected
|
95
|
+
|
96
|
+
def initialize
|
97
|
+
self.storage = Hash.new
|
98
|
+
end
|
99
|
+
|
100
|
+
class << self
|
101
|
+
|
102
|
+
def instance
|
103
|
+
@@instance ||= self.new
|
104
|
+
end
|
105
|
+
|
106
|
+
def settings
|
107
|
+
instance.storage
|
108
|
+
end
|
109
|
+
|
110
|
+
def method_missing( m, *args, &block )
|
111
|
+
instance.send( m, *args, &block ) if instance.respond_to?( m )
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class Billy
|
2
|
+
class Session
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def run!( args )
|
6
|
+
Billy::Commands.load_pool!
|
7
|
+
command = ARGV.shift
|
8
|
+
arguments = ARGV
|
9
|
+
if command.nil?
|
10
|
+
print "Billy has nothing to do. Yay!\n"
|
11
|
+
exit 0
|
12
|
+
end
|
13
|
+
status = proceed_command!( command, arguments )
|
14
|
+
exit status
|
15
|
+
end
|
16
|
+
|
17
|
+
def proceed_command!( command_name, arguments )
|
18
|
+
cmd = Billy::Commands.pool[ command_name.to_s ]
|
19
|
+
if cmd.nil?
|
20
|
+
print "Billy doesn't know this command: #{command_name}. Say billy hello.\n"
|
21
|
+
return 1
|
22
|
+
end
|
23
|
+
cmd.proceed!( arguments )
|
24
|
+
0
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/billy.rb
ADDED
metadata
ADDED
@@ -0,0 +1,199 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: billy_the_tool
|
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
|
+
- 4pcbr
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-11-29 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
prerelease: false
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - ~>
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
hash: 49
|
28
|
+
segments:
|
29
|
+
- 2
|
30
|
+
- 13
|
31
|
+
- 5
|
32
|
+
version: 2.13.5
|
33
|
+
type: :runtime
|
34
|
+
name: capistrano
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
47
|
+
type: :development
|
48
|
+
name: shoulda
|
49
|
+
version_requirements: *id002
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ~>
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 31
|
58
|
+
segments:
|
59
|
+
- 3
|
60
|
+
- 12
|
61
|
+
version: "3.12"
|
62
|
+
type: :development
|
63
|
+
name: rdoc
|
64
|
+
version_requirements: *id003
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
prerelease: false
|
67
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ~>
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
hash: 27
|
73
|
+
segments:
|
74
|
+
- 1
|
75
|
+
- 2
|
76
|
+
- 2
|
77
|
+
version: 1.2.2
|
78
|
+
type: :development
|
79
|
+
name: bundler
|
80
|
+
version_requirements: *id004
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
prerelease: false
|
83
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ~>
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
hash: 63
|
89
|
+
segments:
|
90
|
+
- 1
|
91
|
+
- 8
|
92
|
+
- 4
|
93
|
+
version: 1.8.4
|
94
|
+
type: :development
|
95
|
+
name: jeweler
|
96
|
+
version_requirements: *id005
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
prerelease: false
|
99
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
100
|
+
none: false
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
hash: 3
|
105
|
+
segments:
|
106
|
+
- 0
|
107
|
+
version: "0"
|
108
|
+
type: :development
|
109
|
+
name: rcov
|
110
|
+
version_requirements: *id006
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
prerelease: false
|
113
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ~>
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
hash: 63
|
119
|
+
segments:
|
120
|
+
- 2
|
121
|
+
- 12
|
122
|
+
- 0
|
123
|
+
version: 2.12.0
|
124
|
+
type: :development
|
125
|
+
name: rspec
|
126
|
+
version_requirements: *id007
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
prerelease: false
|
129
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
131
|
+
requirements:
|
132
|
+
- - ~>
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
hash: 49
|
135
|
+
segments:
|
136
|
+
- 2
|
137
|
+
- 13
|
138
|
+
- 5
|
139
|
+
version: 2.13.5
|
140
|
+
type: :runtime
|
141
|
+
name: capistrano
|
142
|
+
version_requirements: *id008
|
143
|
+
description: Billy is simplified deploy system based on top of capistrano
|
144
|
+
email: me@4pcbr.com
|
145
|
+
executables:
|
146
|
+
- billy
|
147
|
+
extensions: []
|
148
|
+
|
149
|
+
extra_rdoc_files:
|
150
|
+
- LICENSE.txt
|
151
|
+
- README.md
|
152
|
+
files:
|
153
|
+
- bin/billy
|
154
|
+
- lib/billy.rb
|
155
|
+
- lib/billy/commands.rb
|
156
|
+
- lib/billy/commands/command.rb
|
157
|
+
- lib/billy/commands/config.rb
|
158
|
+
- lib/billy/commands/eat.rb
|
159
|
+
- lib/billy/commands/hello.rb
|
160
|
+
- lib/billy/commands/walk.rb
|
161
|
+
- lib/billy/config.rb
|
162
|
+
- lib/billy/session.rb
|
163
|
+
- LICENSE.txt
|
164
|
+
- README.md
|
165
|
+
homepage: http://github.com/AltSpace/billy
|
166
|
+
licenses:
|
167
|
+
- MIT
|
168
|
+
post_install_message:
|
169
|
+
rdoc_options: []
|
170
|
+
|
171
|
+
require_paths:
|
172
|
+
- lib
|
173
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
174
|
+
none: false
|
175
|
+
requirements:
|
176
|
+
- - ">="
|
177
|
+
- !ruby/object:Gem::Version
|
178
|
+
hash: 3
|
179
|
+
segments:
|
180
|
+
- 0
|
181
|
+
version: "0"
|
182
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
183
|
+
none: false
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
hash: 3
|
188
|
+
segments:
|
189
|
+
- 0
|
190
|
+
version: "0"
|
191
|
+
requirements: []
|
192
|
+
|
193
|
+
rubyforge_project:
|
194
|
+
rubygems_version: 1.8.24
|
195
|
+
signing_key:
|
196
|
+
specification_version: 3
|
197
|
+
summary: Billy the tool
|
198
|
+
test_files: []
|
199
|
+
|