vagrant-gatling-rsync 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d981cfb603768c87a0a307b415b32acf4fdacc27
4
+ data.tar.gz: 7517d55a2e0be0a9d6fc04c7ae60c15262ebc82d
5
+ SHA512:
6
+ metadata.gz: 6e0938d9cc6f4e67da39c1865c004b348a7ef03451ed8b93086af4dff9706101dee20a5313c4006153803588edd4def025b538a2c0fb9e1779404ad880dfb992
7
+ data.tar.gz: 176593bea18b5cc114ebd0f9ce944ccfe7c7438beb128ea738e770056ee38cc0301ede1641bfcacbcf339ea599008cc8d159f26396dda8a55cdac798692fdce6
data/.gitignore ADDED
@@ -0,0 +1,21 @@
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
+ *.swp
19
+ *.swo
20
+ example/files/*
21
+ example/vagrant/.vagrant
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.0.0-p353
data/CHANGELOG.txt ADDED
@@ -0,0 +1,16 @@
1
+ ## 0.0.1 (March 23, 2014)
2
+
3
+ Initial release.
4
+
5
+ FEATURES:
6
+
7
+ - Implement an rb-fsevent adapter for Mac.
8
+ - Implement an rb-inotify adapter for Linux.
9
+ - Add the `vagrant gatling-rsync-auto` command.
10
+ - Implement the first draft of a config option to allow changing the latency.
11
+
12
+ ## Backlog
13
+
14
+ - Test and release the Windows adapter.
15
+ - Allow configuring and running the rsync daemon to avoid SSH overhead.
16
+ - Get latency validation working.
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in vagrant-gatling-rsync.gemspec
4
+ gemspec
5
+
6
+ group :development do
7
+ gem "vagrant", :git => "https://github.com/mitchellh/vagrant.git", :tag => 'v1.5.1'
8
+ gem "pry"
9
+ end
10
+
11
+ group :plugins do
12
+ gem "vagrant-gatling-rsync", path: "."
13
+ end
14
+
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Steven Merrill
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,73 @@
1
+ # vagrant-gatling-rsync
2
+
3
+ An rsync watcher for Vagrant 1.5+ that uses fewer host resources at the
4
+ potential cost of more rsync actions.
5
+
6
+ ## Authors
7
+
8
+ Steven Merrill (@stevenmerrill) originally had the idea to tap into rb-fsevent
9
+ and rb-inotify to more efficiently rsync files.
10
+
11
+ Doug Marcey (@dougmarcey) provided considerable guidance in the implementation
12
+ of the coalescing functionality and wrote the initial sketch of the Linux and
13
+ Windows adapters.
14
+
15
+ ## Why "gatling"?
16
+
17
+ The gatling gun was the first gun capable of firing continuously.
18
+
19
+ ## This plugin
20
+
21
+ The built-in rsync-auto plugin sometimes uses a lot of CPU and disk I/O when
22
+ it starts up on very large rsynced directories. This plugin is designed to
23
+ work well with such large rsynced folders.
24
+
25
+ The rsync-auto command that ships with Vagrant 1.5 uses the listen gem. The
26
+ Listen gem is quite thorough - it uses Celluloid to spin up an actor system
27
+ and it checks file contents on OS X to ensure that running "touch" on a file
28
+ (to do a write but not update its content) will not fire the rsync command.
29
+
30
+ The downside of using Listen is that it takes a large amount of host resources
31
+ to monitor large directory structures. This gem works well with to monitor
32
+ directories hierarchies with 10,000-100,000 files.
33
+
34
+ This gem's implementation is much closer to the underlying fsevent or inotify
35
+ APIs, which allows for higher performance.
36
+
37
+ ## Event coalescing
38
+
39
+ This plugin also coalesces events for you. The default latency is 1.5 seconds.
40
+ (This will be a configurable option in future versions.) If you specify a
41
+ latency of two seconds, this plugin will not fire a `vagrant rsync` until two
42
+ contiguous seconds without file events have passed. This will delay rsyncs from
43
+ happening if many writes are happening on the host (during a `make` or a
44
+ `git clone`, for example) until the activity has leveled off.
45
+
46
+ ## Working with this plugin
47
+
48
+ Add the following information to the Vagrantfile to set the coalescing
49
+ threshold in seconds. If you do not set it, it will default to 1.5.
50
+
51
+ You will also need to have at least one synced folder set to type "rsync"
52
+ to use the plugin.
53
+
54
+ ```ruby
55
+ VAGRANTFILE_API_VERSION = "2"
56
+
57
+ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
58
+ config.vm.box = "hashicorp/precise64"
59
+
60
+ config.vm.synced_folder "../files", "/opt/vagrant/rsynced_folder", type: "rsync",
61
+ rsync__exclude: [".git/", ".idea/"]
62
+
63
+ # Configure the window for gatling to coalesce writes.
64
+ config.gatling.latency = 2.5
65
+ end
66
+ ```
67
+
68
+ With the Vagrantfile configured in this fashion, you can run the following
69
+ command to sync files.
70
+
71
+ ```bash
72
+ vagrant gatling-rsync-auto
73
+ ```
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1 @@
1
+ This file only exists to keep this directory in git.
@@ -0,0 +1,19 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ # Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
5
+ VAGRANTFILE_API_VERSION = "2"
6
+
7
+ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
8
+ config.vm.box = "hashicorp/precise64"
9
+
10
+ # Share an additional folder to the guest VM. The first argument is
11
+ # the path on the host to the actual folder. The second argument is
12
+ # the path on the guest to mount the folder. And the optional third
13
+ # argument is a set of non-required options.
14
+ config.vm.synced_folder "../files", "/opt/vagrant/rsynced_folder", type: "rsync",
15
+ rsync__exclude: [".git/", ".idea/"]
16
+
17
+ # Configure the window for gatling to coalesce writes.
18
+ config.gatling.latency = 2.5
19
+ end
@@ -0,0 +1,130 @@
1
+ require "log4r"
2
+ require "optparse"
3
+
4
+ require "vagrant"
5
+
6
+ module VagrantPlugins
7
+ module GatlingRsync
8
+ class GatlingRsyncAuto < Vagrant.plugin(2, :command)
9
+ include Vagrant::Action::Builtin::MixinSyncedFolders
10
+
11
+ def self.synopsis
12
+ "syncs rsync synced folders when folders change"
13
+ end
14
+
15
+ def execute
16
+ @logger = Log4r::Logger.new("vagrant::commands::gatling-rsync-auto")
17
+
18
+ opts = OptionParser.new do |o|
19
+ o.banner = "Usage: vagrant gatling-rsync-auto [vm-name]"
20
+ o.separator ""
21
+ end
22
+
23
+ # Parse the options and return if we don't have any target.
24
+ argv = parse_options(opts)
25
+ return if !argv
26
+
27
+ latency = nil
28
+
29
+ # Build up the paths that we need to listen to.
30
+ paths = {}
31
+ ignores = []
32
+ with_target_vms(argv) do |machine|
33
+ latency = machine.config.gatling.latency
34
+
35
+ folders = synced_folders(machine)[:rsync]
36
+ next if !folders || folders.empty?
37
+
38
+ folders.each do |id, folder_opts|
39
+ # If we marked this folder to not auto sync, then
40
+ # don't do it.
41
+ next if folder_opts.has_key?(:auto) && !folder_opts[:auto]
42
+
43
+ hostpath = folder_opts[:hostpath]
44
+ hostpath = File.expand_path(hostpath, machine.env.root_path)
45
+ paths[hostpath] ||= []
46
+ paths[hostpath] << {
47
+ id: id,
48
+ machine: machine,
49
+ opts: folder_opts,
50
+ }
51
+
52
+ if folder_opts[:exclude]
53
+ Array(folder_opts[:exclude]).each do |pattern|
54
+ ignores << VagrantPlugins::SyncedFolderRSync::RsyncHelper.exclude_to_regexp(hostpath, pattern.to_s)
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ # Output to the user what paths we'll be watching
61
+ paths.keys.sort.each do |path|
62
+ paths[path].each do |path_opts|
63
+ path_opts[:machine].ui.info(I18n.t(
64
+ "vagrant.rsync_auto_path",
65
+ path: path.to_s,
66
+ ))
67
+ end
68
+ end
69
+
70
+ @logger.info("Listening to paths: #{paths.keys.sort.inspect}")
71
+ @logger.info("Ignoring #{ignores.length} paths:")
72
+ ignores.each do |ignore|
73
+ @logger.info(" -- #{ignore.to_s}")
74
+ end
75
+
76
+ case RUBY_PLATFORM
77
+ when /darwin/
78
+ ListenOSX.new(paths, ignores, latency, @logger, self.method(:callback)).run
79
+ when /linux/
80
+ ListenLinux.new(paths, ignores, latency, @logger, self.method(:callback)).run
81
+ else
82
+ # @TODO: Raise this earlier?
83
+ raise Errors::OnlyOSXLinuxSupportError
84
+ end
85
+
86
+ 0
87
+ end
88
+
89
+ # This callback gets called when any directory changes.
90
+ def callback(paths, ignores, modified)
91
+ @logger.info("File change callback called!")
92
+ @logger.info(" - Paths: #{paths.inspect}")
93
+ @logger.info(" - Ignores: #{ignores.inspect}")
94
+ @logger.info(" - Modified: #{modified.inspect}")
95
+
96
+ tosync = []
97
+ paths.each do |hostpath, folders|
98
+ # Find out if this path should be synced
99
+ found = catch(:done) do
100
+ modified.each do |changed|
101
+ match = nil
102
+ ignores.each do |ignore|
103
+ next unless match.nil?
104
+ match = ignore.match(changed)
105
+ end
106
+
107
+ next unless match.nil?
108
+ throw :done, true if changed.start_with?(hostpath)
109
+ end
110
+
111
+ # Make sure to return false if all else fails so that we
112
+ # don't sync to this machine.
113
+ false
114
+ end
115
+
116
+ # If it should be synced, store it for later
117
+ tosync << folders if found
118
+ end
119
+
120
+ # Sync all the folders that need to be synced
121
+ tosync.each do |folders|
122
+ folders.each do |opts|
123
+ ssh_info = opts[:machine].ssh_info
124
+ VagrantPlugins::SyncedFolderRSync::RsyncHelper.rsync_single(opts[:machine], ssh_info, opts[:opts])
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,36 @@
1
+ require "vagrant"
2
+
3
+ module VagrantPlugins
4
+ module GatlingRsync
5
+ class Config < Vagrant.plugin("2", :config)
6
+ attr_accessor :latency
7
+
8
+ def initialize
9
+ @latency = UNSET_VALUE
10
+ end
11
+
12
+ def finalize!
13
+ @latency = 1.5 if @latency == UNSET_VALUE
14
+ end
15
+
16
+ # @TODO: This does not appear to be called.
17
+ def validate(machine)
18
+ errors = _detected_errors
19
+
20
+ if @latency == UNSET_VALUE
21
+ return
22
+ elsif not @latency.is_a? Numeric
23
+ @latency = 1.5
24
+ # @TODO: Translate.
25
+ errors << "The latency must be set to a number. Substituting 1.5 as a value."
26
+ elsif @latency < 0.2
27
+ @latency = 0.2
28
+ # @TODO: Translate.
29
+ errors << "The latency may not be below 0.2 seconds."
30
+ end
31
+
32
+ { "gatling" => errors }
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,19 @@
1
+ require "vagrant"
2
+
3
+ module VagrantPlugins
4
+ module GatlingRsync
5
+ module Errors
6
+ class VagrantGatlingRsyncError < Vagrant::Errors::VagrantError
7
+ error_namespace("vagrant_gatling_rsync.errors")
8
+ end
9
+
10
+ class OnlyOSXLinuxSupportError < VagrantGatlingRsyncError
11
+ error_key(:only_osx_linux_support)
12
+ end
13
+
14
+ class Vagrant15RequiredError < VagrantGatlingRsyncError
15
+ error_key(:vagrant_15_required)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,44 @@
1
+ require "rb-inotify"
2
+
3
+ module VagrantPlugins
4
+ module GatlingRsync
5
+ class ListenLinux
6
+ def initialize(paths, ignores, latency, logger, callback)
7
+ @paths = paths
8
+ @ignores = ignores
9
+ @latency = latency
10
+ @logger = logger
11
+ @callback = callback
12
+ end
13
+
14
+ def run
15
+ @logger.info("Listening via: rb-inotify on Linux.")
16
+
17
+ notifier = INotify::Notifier.new
18
+ @paths.keys.each do |path|
19
+ notifier.watch(path, :modify, :create, :delete, :recursive) {}
20
+ end
21
+
22
+ while true do
23
+ directories = Set.new
24
+ begin
25
+ while true do
26
+ events = []
27
+ events = Timeout::timeout(@latency) {
28
+ notifier.read_events
29
+ }
30
+ events.each { |e| directories << e.absolute_name }
31
+ end
32
+ rescue Timeout::Error
33
+ @logger.info("Breaking out of the loop at #{Time.now.to_s}.")
34
+ end
35
+
36
+ @logger.info("Detected changes to #{directories.inspect}.") unless directories.empty?
37
+
38
+ @callback.call(@paths, @ignores, directories) unless directories.empty?
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+
@@ -0,0 +1,53 @@
1
+ require "rb-fsevent"
2
+
3
+ module VagrantPlugins
4
+ module GatlingRsync
5
+ class ListenOSX
6
+ def initialize(paths, ignores, latency, logger, callback)
7
+ @paths = paths
8
+ @ignores = ignores
9
+ @latency = latency
10
+ @options = {
11
+ # We set this to a small value to ensure that we can coalesce the
12
+ # events together to prevent rsyncing too often under heavy write
13
+ # load.
14
+ :latency => 0.1,
15
+ :no_defer => false,
16
+ }
17
+ @logger = logger
18
+ @callback = callback
19
+ end
20
+
21
+ def run
22
+ @logger.info("Listening via: rb-fsevent on Mac OS X.")
23
+ changes = Queue.new
24
+
25
+ fsevent = FSEvent.new
26
+ fsevent.watch @paths.keys, @options do |directories|
27
+ directories.each { |d| changes << d }
28
+ end
29
+ Thread.new { fsevent.run }
30
+
31
+ while true do
32
+ directories = Set.new
33
+ begin
34
+ while true do
35
+ @logger.info("Starting the timeout at #{Time.now.to_s}.")
36
+ change = Timeout::timeout(@latency) {
37
+ changes.pop
38
+ }
39
+ directories << change unless change.nil?
40
+ end
41
+ rescue Timeout::Error
42
+ @logger.info("Breaking out of the loop at #{Time.now.to_s}.")
43
+ end
44
+
45
+ @logger.info("Detected changes to #{directories.inspect}.") unless directories.empty?
46
+
47
+ @callback.call(@paths, @ignores, directories) unless directories.empty?
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+
@@ -0,0 +1,33 @@
1
+ # @TODO: Note that this is entirely untested and not yet implemented.
2
+
3
+ require "timeout"
4
+ require "thread"
5
+
6
+ paths = {"/path/to/a/directory" => {}}
7
+ latency = 2
8
+
9
+ monitor = WDM::Monitor.new
10
+ changes = Queue.new
11
+ paths.keys.each do |path|
12
+ monitor.watch_recursively(path) { |change| changes << change }
13
+ end
14
+ Thread.new { monitor.run! }
15
+
16
+ while true do
17
+ directories = Set.new
18
+ begin
19
+ while true do
20
+ change = Timeout::timeout(latency) {
21
+ changes.pop
22
+ }
23
+ directories << change.path
24
+ end
25
+ rescue Timeout::Error
26
+ @logger.info("Breaking out of the loop at #{Time.now.to_s}.")
27
+ end
28
+
29
+ @logger.info(directories.inspect) unless directories.empty?
30
+
31
+ #@callback.call(paths, ignores, directories) unless directories.empty?
32
+ end
33
+
@@ -0,0 +1,40 @@
1
+ begin
2
+ require "vagrant"
3
+ rescue LoadError
4
+ raise "The Vagrant gatling rsync plugin must be run within Vagrant."
5
+ end
6
+
7
+ # This is a sanity check to make sure no one is attempting to install
8
+ # this into an early Vagrant version.
9
+ if Vagrant::VERSION < "1.5.0"
10
+ raise Errors::Vagrant15RequiredError
11
+ end
12
+
13
+ module VagrantPlugins
14
+ module GatlingRsync
15
+ class Plugin < Vagrant.plugin("2")
16
+ name "Gatling Rsync"
17
+ description <<-DESC
18
+ Rsync large project directories to your Vagrant VM without using many resources on the host.
19
+ DESC
20
+
21
+ # This initializes the internationalization strings.
22
+ def self.setup_i18n
23
+ I18n.load_path << File.expand_path("locales/en.yml", GatlingRsync.source_root)
24
+ I18n.reload!
25
+ end
26
+
27
+ command "gatling-rsync-auto" do
28
+ setup_i18n
29
+
30
+ require_relative "command/rsync_auto"
31
+ GatlingRsyncAuto
32
+ end
33
+
34
+ config "gatling" do
35
+ require_relative "config"
36
+ Config
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,5 @@
1
+ module VagrantPlugins
2
+ module GatlingRsync
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,25 @@
1
+ # This file is required because Vagrant's plugin system expects
2
+ # a eponymous ruby file matching the rubygem.
3
+ #
4
+ # So this gem is called 'vagrant-gatling-rsync' and thus vagrant tries
5
+ # to require "vagrant-gatling-rsync"
6
+
7
+ require "vagrant-gatling-rsync/plugin"
8
+
9
+ require "pathname"
10
+
11
+ module VagrantPlugins
12
+ module GatlingRsync
13
+ lib_path = Pathname.new(File.expand_path("../vagrant-gatling-rsync", __FILE__))
14
+ autoload :Errors, lib_path.join("errors")
15
+ autoload :ListenOSX, lib_path.join("listen/listenosx")
16
+ autoload :ListenLinux, lib_path.join("listen/listenlinux")
17
+
18
+ # This returns the path to the source of this plugin.
19
+ #
20
+ # @return [Pathname]
21
+ def self.source_root
22
+ @source_root ||= Pathname.new(File.expand_path("../../", __FILE__))
23
+ end
24
+ end
25
+ end
data/locales/en.yml ADDED
@@ -0,0 +1,8 @@
1
+ en:
2
+ vagrant_gatling_rsync:
3
+ errors:
4
+ only_osx_linux_support: |-
5
+ This plugin currently only supports Max OS X and Linux hosts.
6
+ vagrant_15_required: |-
7
+ This plugin requires Vagrant 1.5 or newer to function.
8
+
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'vagrant-gatling-rsync/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "vagrant-gatling-rsync"
8
+ spec.version = VagrantPlugins::GatlingRsync::VERSION
9
+ spec.authors = ["Steven Merrill"]
10
+ spec.email = ["steven.merrill@gmail.com"]
11
+ spec.summary = %q{A lighter-weight Vagrant plugin for watching and rsyncing directories.}
12
+ spec.description = %q{The gatling-rsync plugin run on Mac (and soon on Linux) and is far less CPU-intensive than the built-in 'vagrant rsync-auto' plugin, at the cost of possibly rsyncing more often.}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ # @TODO: Remove example files from the built gem.
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.5"
23
+ spec.add_development_dependency "rake"
24
+ spec.add_development_dependency "pry"
25
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vagrant-gatling-rsync
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Steven Merrill
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-24 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.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
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
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: The gatling-rsync plugin run on Mac (and soon on Linux) and is far less
56
+ CPU-intensive than the built-in 'vagrant rsync-auto' plugin, at the cost of possibly
57
+ rsyncing more often.
58
+ email:
59
+ - steven.merrill@gmail.com
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - .gitignore
65
+ - .ruby-version
66
+ - CHANGELOG.txt
67
+ - Gemfile
68
+ - LICENSE
69
+ - README.md
70
+ - Rakefile
71
+ - example/files/.gitkeep
72
+ - example/vagrant/Vagrantfile
73
+ - lib/vagrant-gatling-rsync.rb
74
+ - lib/vagrant-gatling-rsync/command/rsync_auto.rb
75
+ - lib/vagrant-gatling-rsync/config.rb
76
+ - lib/vagrant-gatling-rsync/errors.rb
77
+ - lib/vagrant-gatling-rsync/listen/listenlinux.rb
78
+ - lib/vagrant-gatling-rsync/listen/listenosx.rb
79
+ - lib/vagrant-gatling-rsync/listen/listenwindows.rb
80
+ - lib/vagrant-gatling-rsync/plugin.rb
81
+ - lib/vagrant-gatling-rsync/version.rb
82
+ - locales/en.yml
83
+ - vagrant-gatling-rsync.gemspec
84
+ homepage: ''
85
+ licenses:
86
+ - MIT
87
+ metadata: {}
88
+ post_install_message:
89
+ rdoc_options: []
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ requirements: []
103
+ rubyforge_project:
104
+ rubygems_version: 2.0.14
105
+ signing_key:
106
+ specification_version: 4
107
+ summary: A lighter-weight Vagrant plugin for watching and rsyncing directories.
108
+ test_files: []