front 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.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MzAwNTk0OTg0MWE0NjA3YTVhMzM3MmU5ZDVlMTk0OTI5ZTEwODQzMw==
5
+ data.tar.gz: !binary |-
6
+ YmNlMWMwNDY4MmMxZGUwYzQxNTQzY2YxNzBjMzMzM2M3ODA1NDdmMA==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ YTY0NWZlNzFmNjJmMGIzOGE0MmUwNjU1ZGE1YjZhNzQ0MTExMGVlMWU2ZjZh
10
+ YjVhOTk0ODliNTlmNWU2OGE0OThhMWVhNjYyZTgzMTgxY2I3YTFmNTRjMTFj
11
+ YjVjODc5NDU5MGYzZDQ4YmM5NTNlNmZiOTYxMmJkNGY1NzI4ODQ=
12
+ data.tar.gz: !binary |-
13
+ M2JlZDEzZTMyYmJhMmEyM2QxNGY3ZGNiODlmOTg5NjdkMzgwYTIzNDFhODQx
14
+ NzRiMzRiNDEyNDBiMTgzODU3ZmQxMmZhYzU3YTBmYjc3NzQ3NTUwYTM3Njg3
15
+ MjU4YjViZGM1YzIzZDE5NTUzMzdmMzEzNDFjNTY0MzNhMDdlMGM=
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .front
19
+ .vagrant
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in front.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Darshan Sawardekar
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # Front
2
+
3
+ ### Speed up your Vagrant workflow
4
+
5
+ Booting up a fresh virtual machine takes time. `Front` speeds up VM boot
6
+ time by preinitializing a pool of VMs. When you need a fresh instance,
7
+ use `front next` and you are ready to work instantly. And while you work
8
+ it rebuilds the old VM for your next refill!
9
+
10
+ ## Installation
11
+
12
+ Install with rubygems:
13
+
14
+ $ gem install front
15
+
16
+ ## Usage
17
+
18
+ When starting a work session, create a new Vagrantfile for your project.
19
+ Then create a new pool with `create`. Without an inventory file, front
20
+ uses a default Vagrantfile with a Ubuntu `precise64` box.
21
+
22
+ $ front create
23
+
24
+ As soon as the 1st VM is ready control is returned to you while the
25
+ other instances in the pool are being preloaded. You can now login to
26
+ this VM with,
27
+
28
+ $ front ssh
29
+
30
+ After you are done with this instance, and need a fresh one, you can
31
+ fetch it with `front next`.
32
+
33
+ $ front next
34
+
35
+ An inventory file is maintained with the SSH port every time you switch
36
+ instances. This can be accessed with the `inventory` action.
37
+
38
+ $ front inventory
39
+
40
+ Finally when done, dispose of the pool with the `destroy` action.
41
+
42
+ $ front destroy
43
+
44
+ ## Implementation
45
+
46
+ `Front` clones your project Vagrantfile into a `.front` directory
47
+ containing the virtual machine instances. When you access the
48
+ `front` commands it steps into these subdirectories and calls the
49
+ corresponding vagrant command. Most actions run in the background
50
+ allowing you to continue working while they complete.
51
+
52
+ ## Complete Usage
53
+
54
+ $ front [options] [action]
55
+
56
+ Actions
57
+ create : create a new pool
58
+ destroy : destroy pool
59
+ next : switch to next instance in pool
60
+ ssh : ssh to current instance => vagrant ssh
61
+ ssh_config : print ssh config for current instance
62
+ inventory : print inventory file
63
+
64
+ Options
65
+
66
+ -s, --size <size> Size of instance pool
67
+ -V, --version Print Front version
68
+ -h, --help Print Front help
69
+
70
+ ## Caveats
71
+
72
+ * Running multiple VMs requires a fast computer with lots of RAM.
73
+ The actual amount depends on the number of VMs, and their configuration.
74
+ Eg:- For a Ubuntu box with 512MB ram with a pool of size 4, you need
75
+ at least 2GB for Virtual Box. Plus additional RAM for the host system.
76
+ * Default pool size is 2.
77
+
78
+ ## TODO
79
+
80
+ * Needs to handle Vagrant errors better.
81
+ * Pool size once created should be persistent.
82
+ * If an instance isn't ready should be able to show it's status.
83
+ * Allow running of other vagrant subcommands
84
+
85
+ ## Contributing
86
+
87
+ * This project uses the gitflow branching model. PR's go against `develop`.
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/Vagrantfile ADDED
@@ -0,0 +1,3 @@
1
+ Vagrant.configure('2') do |config|
2
+ config.vm.box = 'precise64'
3
+ end
data/bin/front ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path('../../lib/front/loader', __FILE__)
4
+
5
+ module Front
6
+ require 'front/cli/app'
7
+
8
+ app = Front::CLI::App.new
9
+ app.start(ARGV)
10
+ end
data/front.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'front/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "front"
8
+ spec.version = Front::VERSION
9
+ spec.authors = ["Darshan Sawardekar"]
10
+ spec.email = ["darshan@sawardekar.org"]
11
+ spec.description = %q{Speed up your Vagrant workflow}
12
+ spec.summary = %q{Booting up a fresh virtual machine takes time. `Front` speeds up VM boot time by preinitializing a pool of VMs. When you need a fresh instance, use `front next` and you are ready to work instantly. And while you work it rebuilds the old VM for your next refill!}
13
+ spec.homepage = "https://github.com/dsawardekar/front"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ end
@@ -0,0 +1,16 @@
1
+ module Front
2
+ module CLI
3
+ require_relative 'configuration'
4
+ require_relative 'router'
5
+
6
+ class App
7
+ def start(args)
8
+ config = Configuration.new
9
+ options = config.load(args)
10
+
11
+ router = Router.new
12
+ router.route(options)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,75 @@
1
+ module Front
2
+ module CLI
3
+ require 'optparse'
4
+ require 'ostruct'
5
+
6
+ class Configuration
7
+ include Loader
8
+
9
+ def load(args)
10
+ options = OpenStruct.new
11
+ options.action = nil
12
+ options.error = nil
13
+ options.pool_size = 2
14
+
15
+ parse(args, options)
16
+ end
17
+
18
+ def get_parser(args, options)
19
+ OptionParser.new do |opts|
20
+ options.opts = opts
21
+ opts.banner = 'Usage: front [options] [action]'
22
+ opts.separator ''
23
+ opts.separator 'Actions'
24
+ opts.separator ' create : create a new pool'
25
+ opts.separator ' destroy : destroy pool'
26
+ opts.separator ' next : switch to next instance in pool'
27
+ opts.separator ' ssh : ssh to current instance => vagrant ssh'
28
+ opts.separator ' ssh_config : print ssh config for current instance'
29
+ opts.separator ' inventory : print inventory file (for ansible)'
30
+ opts.separator ''
31
+ opts.separator 'Options'
32
+ opts.separator ''
33
+
34
+ opts.on('-s', '--size <size>', Integer, 'Size of instance pool') do |pool_size|
35
+ options.pool_size = pool_size
36
+ end
37
+
38
+ opts.on_tail('-V', '--version', 'Print Front version') do
39
+ options.action = :show_version
40
+ end
41
+
42
+ opts.on_tail('-h', '--help', 'Print Front help') do
43
+ options.action = :show_help
44
+ end
45
+ end
46
+ end
47
+
48
+ def parse(args, options)
49
+ parser = get_parser(args, options)
50
+
51
+ begin
52
+ parser.parse!(args)
53
+ if options.action.nil?
54
+ if args.length == 1
55
+ options.action = args[0]
56
+ else
57
+ raise OptionParser::InvalidOption.new(args)
58
+ end
59
+ end
60
+ rescue OptionParser::InvalidOption => err
61
+ options.error = err
62
+ options.action = :show_invalid_option
63
+ rescue OptionParser::MissingArgument => err
64
+ options.error = err
65
+ options.action = :show_missing_args
66
+ rescue OptionParser::ParseError => err
67
+ options.error = err
68
+ options.action = :show_parser_error
69
+ end
70
+
71
+ options
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,81 @@
1
+ module Front
2
+ module CLI
3
+ require 'front/version'
4
+ require 'front/loader'
5
+ require_relative 'vagrant'
6
+ require_relative 'vagrant_pool'
7
+
8
+ class Controller
9
+ include Loader
10
+ attr_reader :options
11
+
12
+ def initialize(options)
13
+ @options = options
14
+ @pool = VagrantPool.new(options.pool_size)
15
+ end
16
+
17
+ # actions
18
+ def create
19
+ @pool.create
20
+ @pool.load
21
+ end
22
+
23
+ def destroy
24
+ @pool.unload
25
+ end
26
+
27
+ def next
28
+ @pool.next
29
+ end
30
+
31
+ def ssh
32
+ @pool.ssh
33
+ end
34
+
35
+ def ssh_config
36
+ puts @pool.ssh_config
37
+ end
38
+
39
+ def inventory
40
+ puts File.read(@pool.get_inventory_file())
41
+ end
42
+
43
+ def status
44
+ @pool.status
45
+ end
46
+
47
+ # errors
48
+ def show_invalid_option
49
+ show_error @options.error
50
+ end
51
+
52
+ def show_missing_args
53
+ show_error @options.error
54
+ end
55
+
56
+ def show_parser_error
57
+ show_error @options.error
58
+ end
59
+
60
+ def show_error(msg = @options.error)
61
+ puts "Error: #{msg}"
62
+ puts
63
+
64
+ show_help
65
+ end
66
+
67
+ def method_missing(method)
68
+ show_error "Unknown action: #{method}"
69
+ end
70
+
71
+ # help
72
+ def show_help
73
+ puts @options.opts
74
+ end
75
+
76
+ def show_version
77
+ puts VERSION
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,51 @@
1
+ module Front
2
+ module CLI
3
+ require 'json'
4
+
5
+ class Frontfile
6
+ attr_reader :path
7
+ attr_reader :data
8
+
9
+ def initialize(path)
10
+ @path = path
11
+ end
12
+
13
+ def exists?
14
+ File.exists?(path)
15
+ end
16
+
17
+ def create(defaults)
18
+ @data = defaults
19
+ save()
20
+ end
21
+
22
+ def load
23
+ file_contents = File.read(path)
24
+ @data = JSON.parse(file_contents)
25
+ end
26
+
27
+ def save
28
+ json = @data.to_json
29
+ File.open(path, 'w') do |file|
30
+ file.write(json)
31
+ end
32
+ end
33
+
34
+ def get_current_id
35
+ @data['current_id']
36
+ end
37
+
38
+ def set_current_id(current_id)
39
+ @data['current_id'] = current_id
40
+ end
41
+
42
+ def get_pool_size
43
+ @data['pool_size']
44
+ end
45
+
46
+ def set_pool_size(pool_size)
47
+ @data['pool_size'] = pool_size
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,12 @@
1
+ module Front
2
+ module CLI
3
+ require_relative 'controller'
4
+
5
+ class Router
6
+ def route(options)
7
+ controller = Controller.new(options)
8
+ controller.send(options.action)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,38 @@
1
+ module Front
2
+ module CLI
3
+ class Script
4
+ def initialize(path)
5
+ @commands = []
6
+ @path = path
7
+ end
8
+
9
+ def enqueue(cmd)
10
+ @commands << cmd
11
+ end
12
+
13
+ def save
14
+ File.open(@path, 'w') do |file|
15
+ file.puts("#!/bin/bash")
16
+
17
+ @commands.each do |command|
18
+ file.puts(command)
19
+ end
20
+ end
21
+
22
+ File.chmod(0755, @path)
23
+ end
24
+
25
+ def run
26
+ if pending?
27
+ save()
28
+ pid = Kernel.spawn(@path)
29
+ Process.detach pid
30
+ end
31
+ end
32
+
33
+ def pending?
34
+ @commands.length > 0
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,125 @@
1
+ module Front
2
+ module CLI
3
+ require 'resque'
4
+
5
+ class Vagrant
6
+ attr_reader :id
7
+ attr_reader :path
8
+ attr_accessor :wait
9
+ attr_accessor :script
10
+
11
+ def initialize(id, path, script)
12
+ @id = id
13
+ @path = path
14
+ @wait = true
15
+ @script = script
16
+ end
17
+
18
+ def up
19
+ run('up')
20
+ end
21
+
22
+ def destroy
23
+ run('destroy -f')
24
+ end
25
+
26
+ def reload
27
+ run('reload')
28
+ end
29
+
30
+ def ssh
31
+ run('ssh')
32
+ end
33
+
34
+ def ssh_config
35
+ capture('ssh-config')
36
+ end
37
+
38
+ def ssh_port
39
+ output = ssh_config()
40
+ re = /^\s*Port\s*(\d+)$/m
41
+
42
+ matches = output.match(re)
43
+ return matches[1]
44
+ end
45
+
46
+ def status
47
+ output = capture('status')
48
+ re = /^(\w+\s+\w+ \(\w+\))/m
49
+ matches = output.match(re)
50
+ if matches
51
+ return matches[1]
52
+ else
53
+ 'pending'
54
+ end
55
+ end
56
+
57
+ def get_log_file
58
+ "#{path}/front.log"
59
+ end
60
+
61
+ def run(cmd)
62
+ cmd = "vagrant #{cmd}"
63
+ options = {}
64
+ options[:chdir] = path
65
+
66
+ if wait
67
+ pid = Kernel.spawn(cmd, options)
68
+ Process.wait pid
69
+ else
70
+ cmd = "#{cmd} &>> #{get_log_file()} "
71
+ script.enqueue "cd #{path} && #{cmd}"
72
+ end
73
+ end
74
+
75
+ def run2(cmd)
76
+ options = {}
77
+ options[:chdir] = path
78
+ unless wait
79
+ log_file = "#{path}/front.log"
80
+ options[:out] = log_file
81
+ options[:err] = log_file
82
+ end
83
+
84
+ pid = Kernel.spawn("vagrant #{cmd}", options)
85
+ if wait
86
+ Process.wait pid
87
+ else
88
+ Process.detach pid
89
+ end
90
+ end
91
+
92
+ def capture(cmd)
93
+ Dir.chdir(path) do
94
+ `vagrant #{cmd}`
95
+ end
96
+ end
97
+ end
98
+
99
+ class VagrantWorker
100
+ @queue = :vagrant
101
+
102
+ def self.perform(task)
103
+ cmd = task.cmd
104
+ options = task.options
105
+ options[:out] = task.log_file
106
+ options[:err] = task.log_file
107
+
108
+ pid = Kernel.spawn(cmd, options)
109
+ Process.wait pid
110
+ end
111
+ end
112
+
113
+ class VagrantTask
114
+ attr_accessor :cmd
115
+ attr_accessor :options
116
+ attr_accessor :log_file
117
+
118
+ def initialize(cmd, options, log_file)
119
+ @cmd = cmd
120
+ @options = options
121
+ @log_file = log_file
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,193 @@
1
+ module Front
2
+ module CLI
3
+ require 'fileutils'
4
+ require_relative 'front_file'
5
+ require_relative 'script'
6
+
7
+ class VagrantPool
8
+ include Loader
9
+
10
+ def initialize(size)
11
+ @size = size
12
+ @script = Script.new(get_script_path())
13
+ end
14
+
15
+ def create
16
+ front_path = get_front_path()
17
+ FileUtils.mkdir_p(front_path)
18
+
19
+ get_pool_size().times do |index|
20
+ instance_id = index + 1
21
+ instance_path = get_instance_path(instance_id)
22
+
23
+ FileUtils.mkdir_p(instance_path)
24
+ FileUtils.cp get_vagrant_file(), instance_path
25
+ end
26
+
27
+ create_front_file
28
+ end
29
+
30
+ def load
31
+ loaded = false
32
+ get_pool_size().times do |index|
33
+ vagrant = get_vagrant(index + 1)
34
+ vagrant.wait = !loaded
35
+ vagrant.up
36
+
37
+ loaded = true
38
+ end
39
+
40
+ @script.run
41
+ end
42
+
43
+ def unload
44
+ get_pool_size().times do |index|
45
+ instance_id = index + 1
46
+ vagrant = get_vagrant(instance_id)
47
+ puts "Destroying instance \##{instance_id}"
48
+ vagrant.destroy
49
+ end
50
+
51
+ FileUtils.rm_rf(get_front_path())
52
+ end
53
+
54
+ def next
55
+ current_id = get_current_id()
56
+ vagrant = get_vagrant(current_id)
57
+ vagrant.wait = false
58
+ vagrant.destroy
59
+ vagrant.up
60
+
61
+ next_id = get_next_id()
62
+ vagrant = get_vagrant(next_id)
63
+ puts "Switched to instance \##{next_id}"
64
+
65
+ save_front_file(next_id)
66
+ update_inventory(vagrant)
67
+ @script.run()
68
+
69
+ next_id
70
+ end
71
+
72
+ def ssh
73
+ vagrant = get_vagrant(get_current_id())
74
+ vagrant.ssh
75
+ end
76
+
77
+ def ssh_config
78
+ vagrant = get_vagrant(get_current_id())
79
+ vagrant.ssh_config
80
+ end
81
+
82
+ def status
83
+ current_id = get_current_id()
84
+ get_pool_size().times do |index|
85
+ instance_id = index + 1
86
+ if instance_id == current_id
87
+ instance_label = "\##{instance_id}*"
88
+ else
89
+ instance_label = "\##{instance_id} "
90
+ end
91
+
92
+ vagrant = get_vagrant(instance_id)
93
+ puts "Instance #{instance_label}: #{vagrant.status}"
94
+ end
95
+ end
96
+
97
+ def get_vagrant(instance_id)
98
+ instance_path = get_instance_path(instance_id)
99
+ Vagrant.new(instance_id, instance_path, @script)
100
+ end
101
+
102
+ def get_inventory_file
103
+ "#{get_front_path()}/inventory.ini"
104
+ end
105
+
106
+ def get_front_path
107
+ "#{Dir.pwd}/.front"
108
+ end
109
+
110
+ def get_script_path
111
+ "#{get_front_path()}/pending.sh"
112
+ end
113
+
114
+ def get_instance_path(id)
115
+ "#{get_front_path()}/#{id}"
116
+ end
117
+
118
+ def get_vagrant_file
119
+ custom_path = "#{Dir.pwd}/Vagrantfile"
120
+ if File.exists?(custom_path)
121
+ return custom_path
122
+ else
123
+ return "#{ROOT_DIR}/Vagrantfile"
124
+ end
125
+ end
126
+
127
+ def get_frontfile_path
128
+ "#{get_front_path()}/Frontfile"
129
+ end
130
+
131
+ def get_current_id
132
+ get_front_file().get_current_id()
133
+ end
134
+
135
+ def get_next_id
136
+ current_id = get_current_id()
137
+ if current_id + 1 > get_pool_size()
138
+ next_id = 1
139
+ else
140
+ next_id = current_id + 1
141
+ end
142
+
143
+ next_id
144
+ end
145
+
146
+ def get_pool_size
147
+ front_file = get_front_file()
148
+ if front_file.exists?
149
+ front_file.get_pool_size()
150
+ else
151
+ @size
152
+ end
153
+ end
154
+
155
+ # helpers
156
+ def get_front_file
157
+ if @front_file.nil?
158
+ @front_file = Frontfile.new(get_frontfile_path())
159
+ if @front_file.exists?
160
+ @front_file.load()
161
+ end
162
+ end
163
+
164
+ @front_file
165
+ end
166
+
167
+ def create_front_file
168
+ defaults = {}
169
+ defaults['current_id'] = 1
170
+ defaults['pool_size'] = @size
171
+
172
+ front_file = get_front_file()
173
+ front_file.create(defaults)
174
+ end
175
+
176
+ def save_front_file(current_id)
177
+ front_file = get_front_file()
178
+ front_file.set_current_id(current_id)
179
+ front_file.save()
180
+ end
181
+
182
+ def update_inventory(vagrant)
183
+ ip_address = "127.0.0.#{get_current_id()}"
184
+ port = vagrant.ssh_port()
185
+
186
+ item = "#{ip_address}:#{port}"
187
+ File.open(get_inventory_file(), 'w') do |file|
188
+ file.write(item)
189
+ end
190
+ end
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,7 @@
1
+ module Front
2
+ module Loader
3
+ ROOT_DIR = File.expand_path('../../../', __FILE__)
4
+ LIB_DIR = File.join(ROOT_DIR, 'lib')
5
+ $:.unshift(LIB_DIR) unless $:.include? LIB_DIR
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module Front
2
+ VERSION = "0.1.2"
3
+ end
data/lib/front.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "front/version"
2
+
3
+ module Front
4
+ # Your code goes here...
5
+ end
data/portkey.json ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "lib/front/cli/*.rb": {
3
+ "type": "cli",
4
+ "test": "spec/front/cli/%s_spec.rb"
5
+ },
6
+
7
+ "test/front/cli/*_spec.rb": {
8
+ "type": "spec",
9
+ "alternate": "lib/front/cli/%s.rb"
10
+ }
11
+ }
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: front
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Darshan Sawardekar
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Speed up your Vagrant workflow
42
+ email:
43
+ - darshan@sawardekar.org
44
+ executables:
45
+ - front
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - .gitignore
50
+ - Gemfile
51
+ - LICENSE.txt
52
+ - README.md
53
+ - Rakefile
54
+ - Vagrantfile
55
+ - bin/front
56
+ - front.gemspec
57
+ - lib/front.rb
58
+ - lib/front/cli/app.rb
59
+ - lib/front/cli/configuration.rb
60
+ - lib/front/cli/controller.rb
61
+ - lib/front/cli/front_file.rb
62
+ - lib/front/cli/router.rb
63
+ - lib/front/cli/script.rb
64
+ - lib/front/cli/vagrant.rb
65
+ - lib/front/cli/vagrant_pool.rb
66
+ - lib/front/loader.rb
67
+ - lib/front/version.rb
68
+ - portkey.json
69
+ homepage: https://github.com/dsawardekar/front
70
+ licenses:
71
+ - MIT
72
+ metadata: {}
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubyforge_project:
89
+ rubygems_version: 2.0.5
90
+ signing_key:
91
+ specification_version: 4
92
+ summary: Booting up a fresh virtual machine takes time. `Front` speeds up VM boot
93
+ time by preinitializing a pool of VMs. When you need a fresh instance, use `front
94
+ next` and you are ready to work instantly. And while you work it rebuilds the old
95
+ VM for your next refill!
96
+ test_files: []