syncwrap 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.rdoc CHANGED
@@ -1,3 +1,13 @@
1
+ === 1.5.0 (2013-4-3)
2
+ * Extended shell_escape_command for sudo sh command.
3
+ * New SyncWrap::AWS for EC2 instance creation, mdraid over EBS
4
+ volumes, and Route53 DNS updates.
5
+ * Add *_s command format-only variants of the distro commands for
6
+ increased flexibility usage and ability to reduce the number of
7
+ shells/round-trips.
8
+ * Add :minimal flag support to Ubuntu.dist_install*
9
+ * Add auto-once, per-host `apt-get update` to Ubuntu.dist_install*
10
+
1
11
  === 1.4.0 (2012-10-16)
2
12
  * PostgreSQL configuration updates for 9.2.x (RHEL only)
3
13
  * Add support for build, deploy, configure of Apache Qpid for which
data/README.rdoc CHANGED
@@ -8,8 +8,7 @@ A generalized and modular set of provisioning and deployment routines.
8
8
  The Rake-centric Vlad and not-actually-Rake Capistrano both suffer
9
9
  from lack of objects, e.g. the ability to customize and mix-in
10
10
  behavior. SyncWrap offers an Object/Module system that can be used
11
- with either. Known to work with Vlad/rake-remote_task but could also
12
- be integrated with Capistrano, or others.
11
+ with either.
13
12
 
14
13
  == Features
15
14
 
@@ -30,10 +29,13 @@ be integrated with Capistrano, or others.
30
29
 
31
30
  Currently the following provisions are provided:
32
31
 
33
- * Complete SyncWrap::Java, SyncWrap::Hashdot, SyncWrap::JRuby stack
32
+ * SyncWrap::AWS for EC2 instances, mdraid over EBS volumes, and
33
+ Route53 DNS updates.
34
34
 
35
35
  * SyncWrap::PostgreSQL
36
36
 
37
+ * Complete SyncWrap::Java, SyncWrap::Hashdot, SyncWrap::JRuby stack
38
+
37
39
  * SyncWrap::Iyyov job scheduler and process monitor
38
40
 
39
41
  * SyncWrap::UserRun for setup of a run user for deployed daemons, jobs
@@ -77,7 +79,7 @@ For example, in your Rakefile with the SyncWrap::RemoteTask adapter:
77
79
 
78
80
  == License
79
81
 
80
- Copyright (c) 2011-2012 David Kellum
82
+ Copyright (c) 2011-2013 David Kellum
81
83
 
82
84
  Licensed under the Apache License, Version 2.0 (the "License"); you
83
85
  may not use this file except in compliance with the License. You
data/Rakefile CHANGED
@@ -12,6 +12,7 @@ require 'syncwrap/hashdot'
12
12
  require 'syncwrap/jruby'
13
13
  require 'syncwrap/iyyov'
14
14
  require 'syncwrap/rhel'
15
+ require 'syncwrap/aws'
15
16
  require 'syncwrap/postgresql'
16
17
  require 'syncwrap/remote_task'
17
18
  require 'syncwrap/geminabox'
@@ -22,6 +23,7 @@ class SyncWrapper
22
23
  include SyncWrap::JRuby
23
24
  include SyncWrap::Iyyov
24
25
  include SyncWrap::RHEL
26
+ include SyncWrap::AWS
25
27
  include SyncWrap::PostgreSQL
26
28
  include SyncWrap::Geminabox
27
29
 
data/lib/syncwrap/base.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2011-2012 David Kellum
2
+ # Copyright (c) 2011-2013 David Kellum
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you
5
5
  # may not use this file except in compliance with the License. You may
@@ -15,5 +15,5 @@
15
15
  #++
16
16
 
17
17
  module SyncWrap
18
- VERSION='1.4.0'
18
+ VERSION='1.5.0'
19
19
  end
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2011-2012 David Kellum
2
+ # Copyright (c) 2011-2013 David Kellum
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you
5
5
  # may not use this file except in compliance with the License. You may
@@ -148,4 +148,14 @@ module SyncWrap::Common
148
148
  raise "Include a remoting-specific module, e.g. RemoteTask"
149
149
  end
150
150
 
151
+ def deep_merge_hashes( h1, h2 )
152
+ h1.merge( h2 ) do |key, v1, v2|
153
+ if v1.is_a?( Hash ) && v2.is_a?( Hash )
154
+ deep_merge_hashes( v1, v2 )
155
+ else
156
+ v2
157
+ end
158
+ end
159
+ end
160
+
151
161
  end
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2011-2012 David Kellum
2
+ # Copyright (c) 2011-2013 David Kellum
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you
5
5
  # may not use this file except in compliance with the License. You may
@@ -30,34 +30,62 @@ module SyncWrap::Distro
30
30
  end
31
31
 
32
32
  # Map internal/common names and return distro-specific names. If a
33
- # mapping does not exist, assume internal name is a common name and
34
- # return.
33
+ # mapping does not exist, assume internal name is a common name.
35
34
  def dist_map_packages( *pkgs )
36
35
  pkgs.flatten.compact.map { |pkg| packages_map[ pkg ] || pkg }
37
36
  end
38
37
 
39
38
  # Install the specified packages using distro-specific mapped
40
- # package names and command.
41
- def dist_install( *pkgs )
39
+ # package names and command via dist_install_s. The last argument is
40
+ # interpreted as options if it is a Hash.
41
+ # === Options
42
+ # :succeed:: Always succeed (useful for local rpms which might
43
+ # already be installed.
44
+ # :minimal:: Avoid additional "optional" packages when possible.
45
+ def dist_install( *args )
46
+ sudo( dist_install_s( *args ) )
47
+ end
48
+
49
+ # Generate command to install the specified packages using
50
+ # distro-specific mapped package names. The last argument is
51
+ # interpreted as options if it is a Hash.
52
+ def dist_install_s( *args )
42
53
  raise "Include a distro-specific module, e.g. Ubuntu, RHEL"
43
54
  end
44
55
 
45
56
  # Uninstall specified packages using distro-specific mapped
46
57
  # package names and command.
47
- def dist_uninstall( *pkgs )
58
+ def dist_uninstall( *args )
59
+ sudo( dist_uninstall_s( *args ) )
60
+ end
61
+
62
+ # Return command to uninstall specified packages using
63
+ # distro-specific mapped package names.
64
+ def dist_uninstall_s( *args )
48
65
  raise "Include a distro-specific module, e.g. Ubuntu, RHEL"
49
66
  end
50
67
 
51
68
  # Install a System V style init.d script (already placed at remote
52
69
  # /etc/init.d/<name>) via distro-specific command
53
70
  def dist_install_init_service( name )
71
+ sudo( dist_install_init_service_s( name ) )
72
+ end
73
+
74
+ # Return command to install a System V style init.d script (already
75
+ # placed at remote /etc/init.d/<name>).
76
+ def dist_install_init_service_s( name )
54
77
  raise "Include a distro-specific module, e.g. Ubuntu, RHEL"
55
78
  end
56
79
 
57
- # Distro (and System V replacement) specific service command,
58
- # typically supporting 'start', 'stop', 'restart', 'status',
59
- # etc. argumnets.
80
+ # Run via sudo, the System V style, distro specific `service`
81
+ # command, typically supporting 'start', 'stop', 'restart',
82
+ # 'status', etc. arguments.
60
83
  def dist_service( *args )
84
+ sudo( dist_service_s( *args ) )
85
+ end
86
+
87
+ # Return the System V style, distro specific `service` command.
88
+ def dist_service_s( *args )
61
89
  raise "Include a distro-specific module, e.g. Ubuntu, RHEL"
62
90
  end
63
91
 
data/lib/syncwrap/ec2.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2011-2012 David Kellum
2
+ # Copyright (c) 2011-2013 David Kellum
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you
5
5
  # may not use this file except in compliance with the License. You may
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2011-2012 David Kellum
2
+ # Copyright (c) 2011-2013 David Kellum
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you
5
5
  # may not use this file except in compliance with the License. You may
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2011-2012 David Kellum
2
+ # Copyright (c) 2011-2013 David Kellum
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you
5
5
  # may not use this file except in compliance with the License. You may
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2011-2012 David Kellum
2
+ # Copyright (c) 2011-2013 David Kellum
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you
5
5
  # may not use this file except in compliance with the License. You may
data/lib/syncwrap/java.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2011-2012 David Kellum
2
+ # Copyright (c) 2011-2013 David Kellum
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you
5
5
  # may not use this file except in compliance with the License. You may
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2011-2012 David Kellum
2
+ # Copyright (c) 2011-2013 David Kellum
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you
5
5
  # may not use this file except in compliance with the License. You may
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2011-2012 David Kellum
2
+ # Copyright (c) 2011-2013 David Kellum
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you
5
5
  # may not use this file except in compliance with the License. You may
data/lib/syncwrap/qpid.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2011-2012 David Kellum
2
+ # Copyright (c) 2011-2013 David Kellum
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you
5
5
  # may not use this file except in compliance with the License. You may
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2011-2012 David Kellum
2
+ # Copyright (c) 2011-2013 David Kellum
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you
5
5
  # may not use this file except in compliance with the License. You may
@@ -25,12 +25,24 @@ module SyncWrap::RemoteTask
25
25
  include SyncWrap::Common
26
26
  include Rake::DSL
27
27
 
28
+ # Array of zero to many host_names (typically short) that were
29
+ # extracted from the HOSTS environment variable if set.
30
+ attr_reader :hosts
31
+
32
+ # A common domain name for all hosts, used to make host_long_name if
33
+ # specified (default: nil)
34
+ attr_accessor :common_domain
35
+
28
36
  def initialize
37
+ @common_domain = nil
38
+ interpret_hosts_var
29
39
  super
30
40
 
31
41
  # Defaults:
32
42
  set( :sudo_flags, %w[ -H ] )
33
43
  set( :rsync_flags, %w[ -rlpcb -ii ] )
44
+
45
+ load_hosts_from_aws_instances if defined? aws_instances
34
46
  end
35
47
 
36
48
  # Implements SyncWrap::Common#run
@@ -41,7 +53,6 @@ module SyncWrap::RemoteTask
41
53
 
42
54
  args = cleanup_arg_lines( args, exit_multi )
43
55
 
44
- #FIXME: Should cleanup multi-line commands
45
56
  remote_task_current.run( *args )
46
57
  end
47
58
 
@@ -57,7 +68,7 @@ module SyncWrap::RemoteTask
57
68
  unless opts[ :shell ] == false
58
69
  exit_multi = opts[ :error ].nil? || opts[ :error ] == :exit
59
70
  cmd = cleanup_arg_lines( args, exit_multi )
60
- cmd = cmd.join( ' ' ).gsub( /"/, '\"' )
71
+ cmd = shell_escape_cmd( cmd.join( ' ' ) )
61
72
  cmd = "sh -c \"#{cmd}\""
62
73
  else
63
74
  cmd = cleanup_arg_lines( args, false )
@@ -71,10 +82,19 @@ module SyncWrap::RemoteTask
71
82
  remote_task_current.rsync( *args )
72
83
  end
73
84
 
85
+ # Return the target host name of the currently executing RemoteTask.
86
+ # Raises a StandardError if executed out of that context.
74
87
  def target_host
75
88
  remote_task_current.target_host
76
89
  end
77
90
 
91
+ # Return true if the current target_host or specified host is part
92
+ # of the specified role.
93
+ def host_in_role?( role, host = target_host )
94
+ role_hosts = Rake::RemoteTask.roles[ role ]
95
+ role_hosts && !!( role_hosts[ host ] )
96
+ end
97
+
78
98
  # Implements Common#exec_conditional
79
99
  def exec_conditional
80
100
  yield
@@ -94,6 +114,10 @@ module SyncWrap::RemoteTask
94
114
  end
95
115
  end
96
116
 
117
+ def shell_escape_cmd( cmd )
118
+ cmd.gsub( /["$`\\]/ ) { |c| '\\' + c }
119
+ end
120
+
97
121
  def remote_task( name, *args, &block )
98
122
  Rake::RemoteTask.remote_task( name, *args, &block )
99
123
  end
@@ -102,15 +126,74 @@ module SyncWrap::RemoteTask
102
126
  Rake::RemoteTask.set( *args )
103
127
  end
104
128
 
129
+ def interpret_hosts_var
130
+ hvar, ENV[ 'HOSTS' ] = ENV[ 'HOSTS' ], nil
131
+ @hosts = (hvar || '').strip.split( /\s+/ )
132
+ @host_pattern = if @hosts.empty?
133
+ // #match all if none specified.
134
+ else
135
+ Regexp.new( '^((' + @hosts.join( ')|(' ) + '))$' )
136
+ end
137
+ end
138
+
139
+ # Forward to Rake::RemoteTask.host using the host_long_name, but
140
+ # only if the specified host_name matches any host_pattern. The :all
141
+ # role is automatically included for all hosts. Note this need not
142
+ # be manually provided int the Rakefile if aws_instances is provided
143
+ # instead.
105
144
  def host( host_name, *roles )
106
- Rake::RemoteTask.host( host_name, *roles )
145
+ if host_name =~ @host_pattern
146
+ Rake::RemoteTask.host( host_long_name( host_name ), :all, *roles )
147
+ end
148
+ end
149
+
150
+ # Define a RemoteTask host from an inst hash as defined by the AWS
151
+ # module. Override to change how instances are mapped to RemoteTask, host By
152
+ # default, using host_long_name( inst[:name] )
153
+ def host_from_instance( inst )
154
+ host( inst[:name], *inst[:roles] )
155
+ end
156
+
157
+ # Calls host_from_instance for all aws_instances.
158
+ def load_hosts_from_aws_instances
159
+ aws_instances.each do |inst|
160
+ host_from_instance( inst )
161
+ end
107
162
  end
108
163
 
109
- def role( role_name, host = nil, args = {} )
110
- Rake::RemoteTask.role( role_name, host, args )
164
+ # Speculative override from AWS to automaticly set a host when added.
165
+ # Will fail if used without AWS module as super receiver.
166
+ def aws_instance_added( inst )
167
+ super
168
+ host_from_instance( inst )
169
+ end
170
+
171
+ # Forward to Rake::RemoteTask.role using the host_long_name, but only if
172
+ # the specified host_name matches any host_pattern.
173
+ def role( role_name, host_name = nil, args = {} )
174
+ if host_name =~ @host_pattern
175
+ Rake::RemoteTask.role( role_name, host_long_name( host_name ), args )
176
+ end
111
177
  end
112
178
 
113
179
  def remote_task_current
114
180
  Thread.current[ :task ] or raise "Not running from a RemoteTask"
115
181
  end
182
+
183
+ # Return a long name for the specified host_name (which may be
184
+ # short). This implementation adds common_domain if
185
+ # specified. Otherwise host_name is returned unmodified.
186
+ def host_long_name( host_name )
187
+ if common_domain
188
+ "#{host_name}.#{common_domain}"
189
+ else
190
+ host_name
191
+ end
192
+ end
193
+
194
+ # Return a short name for the specified host_name (which may be long).
195
+ def host_short_name( host_name )
196
+ ( host_name =~ /^([a-z0-9\-]+)/ ) && $1
197
+ end
198
+
116
199
  end
data/lib/syncwrap/rhel.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2011-2012 David Kellum
2
+ # Copyright (c) 2011-2013 David Kellum
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you
5
5
  # may not use this file except in compliance with the License. You may
@@ -29,40 +29,39 @@ module SyncWrap::RHEL
29
29
  'postgresql' => 'postgresql-server' )
30
30
  end
31
31
 
32
- # Install packages. The last argument is interpreted as a options if
33
- # it is a Hash.
32
+ # Generate command to install packages. The last argument is
33
+ # interpreted as a options if it is a Hash.
34
34
  # === Options
35
35
  # :succeed:: Always succeed (useful for local rpms which might
36
36
  # already be installed.
37
- def dist_install( *pkgs )
38
-
39
- if pkgs.last.is_a?( Hash )
40
- pkgs = pkgs.dup
41
- opts = pkgs.pop
37
+ def dist_install_s( *args )
38
+ if args.last.is_a?( Hash )
39
+ args = args.dup
40
+ opts = args.pop
42
41
  else
43
42
  opts = {}
44
43
  end
45
44
 
46
- pkgs = dist_map_packages( pkgs )
45
+ args = dist_map_packages( args )
47
46
 
48
47
  if opts[ :succeed ]
49
- sudo "yum install -q -y #{pkgs.join( ' ' )} || true"
48
+ "yum install -q -y #{args.join ' '} || true"
50
49
  else
51
- sudo "yum install -q -y #{pkgs.join( ' ' )}"
50
+ "yum install -q -y #{args.join ' '}"
52
51
  end
53
52
  end
54
53
 
55
- def dist_uninstall( *pkgs )
56
- pkgs = dist_map_packages( pkgs )
57
- sudo "yum remove -q -y #{pkgs.join( ' ' )}"
54
+ def dist_uninstall_s( *args )
55
+ args = dist_map_packages( args )
56
+ "yum remove -q -y #{args.join ' '}"
58
57
  end
59
58
 
60
- def dist_install_init_service( name )
61
- sudo "/sbin/chkconfig --add #{name}"
59
+ def dist_install_init_service_s( name )
60
+ "/sbin/chkconfig --add #{name}"
62
61
  end
63
62
 
64
- def dist_service( *args )
65
- sudo( [ '/sbin/service' ] + args )
63
+ def dist_service_s( *args )
64
+ "/sbin/service #{args.join ' '}"
66
65
  end
67
66
 
68
67
  end
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2011-2012 David Kellum
2
+ # Copyright (c) 2011-2013 David Kellum
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you
5
5
  # may not use this file except in compliance with the License. You may
@@ -15,6 +15,7 @@
15
15
  #++
16
16
 
17
17
  require 'syncwrap/distro'
18
+ require 'thread'
18
19
 
19
20
  # Customizations for Ubuntu and possibly other Debian/apt packaged
20
21
  # derivatives. Specific distros/versions may further specialize.
@@ -22,28 +23,56 @@ module SyncWrap::Ubuntu
22
23
  include SyncWrap::Distro
23
24
 
24
25
  def initialize
26
+ @apt_update_state_lock = Mutex.new
27
+ @apt_update_state = {}
28
+
25
29
  super
26
30
 
27
31
  packages_map.merge!( 'apr' => 'libapr1',
28
32
  'apr-devel' => 'libapr1-dev' )
29
33
  end
30
34
 
31
- def dist_install( *pkgs )
32
- pkgs = dist_map_packages( pkgs )
33
- sudo "apt-get -yq install #{pkgs.join( ' ' )}"
35
+ # Generate the apt-get command to install packages. The first time
36
+ # this is applied to any given host, an "apt-get update" is issued
37
+ # as well. The last argument is interpreted as a options if it is a
38
+ # Hash.
39
+ # === Options
40
+ # :minimal:: Eqv to --no-install-recommends
41
+ def dist_install_s( *args )
42
+ args = args.dup
43
+ if args.last.is_a?( Hash )
44
+ opts = args.pop
45
+ else
46
+ opts = {}
47
+ end
48
+
49
+ commands = []
50
+
51
+ @apt_update_state_lock.synchronize do
52
+ unless @apt_update_state[ target_host ]
53
+ commands << "apt-get -yq update"
54
+ @apt_update_state[ target_host ] = true
55
+ end
56
+ end
57
+
58
+ args = dist_map_packages( args )
59
+ args.unshift "--no-install-recommends" if opts[ :minimal ]
60
+ commands << "apt-get -yq install #{args.join ' '}"
61
+
62
+ commands.join( "\n" )
34
63
  end
35
64
 
36
- def dist_uninstall( *pkgs )
37
- pkgs = dist_map_packages( pkgs )
38
- sudo "aptitude -yq purge #{pkgs.join( ' ' )}"
65
+ def dist_uninstall_s( *args )
66
+ args = dist_map_packages( args )
67
+ "aptitude -yq purge #{args.join ' '}"
39
68
  end
40
69
 
41
- def dist_install_init_service( name )
42
- sudo "/usr/sbin/update-rc.d #{name} defaults"
70
+ def dist_install_init_service_s( name )
71
+ "/usr/sbin/update-rc.d #{name} defaults"
43
72
  end
44
73
 
45
- def dist_service( *args )
46
- sudo( [ '/usr/sbin/service' ] + args )
74
+ def dist_service_s( *args )
75
+ "/usr/sbin/service #{args.join ' '}"
47
76
  end
48
77
 
49
78
  end
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2011-2012 David Kellum
2
+ # Copyright (c) 2011-2013 David Kellum
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you
5
5
  # may not use this file except in compliance with the License. You may
data/lib/syncwrap.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2011-2012 David Kellum
2
+ # Copyright (c) 2011-2013 David Kellum
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License"); you
5
5
  # may not use this file except in compliance with the License. You may
@@ -2,7 +2,7 @@
2
2
  #.hashdot.profile += jruby-shortlived
3
3
 
4
4
  #--
5
- # Copyright (c) 2011-2012 David Kellum
5
+ # Copyright (c) 2011-2013 David Kellum
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License"); you
8
8
  # may not use this file except in compliance with the License. You
@@ -28,6 +28,7 @@ require 'syncwrap/hashdot'
28
28
  require 'syncwrap/jruby'
29
29
  require 'syncwrap/iyyov'
30
30
  require 'syncwrap/geminabox'
31
+ require 'syncwrap/aws'
31
32
  require 'syncwrap/ec2'
32
33
  require 'syncwrap/ubuntu'
33
34
  require 'syncwrap/rhel'
@@ -44,6 +45,7 @@ class TestSyncWrap < MiniTest::Unit::TestCase
44
45
  include SyncWrap::Geminabox
45
46
  include SyncWrap::Ubuntu
46
47
  include SyncWrap::EC2
48
+ include SyncWrap::AWS
47
49
  include SyncWrap::PostgreSQL
48
50
  end
49
51
 
metadata CHANGED
@@ -1,49 +1,68 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: syncwrap
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 1.4.0
4
+ version: 1.5.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - David Kellum
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-16 00:00:00.000000000 Z
12
+ date: 2013-04-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
16
- version_requirements: !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
17
18
  requirements:
18
19
  - - ~>
19
20
  - !ruby/object:Gem::Version
20
21
  version: 3.2.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
21
25
  none: false
22
- requirement: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - ~>
25
28
  - !ruby/object:Gem::Version
26
29
  version: 3.2.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: aws-sdk
32
+ requirement: !ruby/object:Gem::Requirement
27
33
  none: false
28
- prerelease: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 1.8.5
29
38
  type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 1.8.5
30
46
  - !ruby/object:Gem::Dependency
31
47
  name: rjack-tarpit
32
- version_requirements: !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
33
50
  requirements:
34
51
  - - ~>
35
52
  - !ruby/object:Gem::Version
36
53
  version: '2.0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
37
57
  none: false
38
- requirement: !ruby/object:Gem::Requirement
39
58
  requirements:
40
59
  - - ~>
41
60
  - !ruby/object:Gem::Version
42
61
  version: '2.0'
43
- none: false
44
- prerelease: false
45
- type: :development
46
- description: A generalized and modular set of provisioning and deployment routines. The Rake-centric Vlad and not-actually-Rake Capistrano both suffer from lack of objects, e.g. the ability to customize and mix-in behavior. SyncWrap offers an Object/Module system that can be used with either. Known to work with Vlad/rake-remote_task but could also be integrated with Capistrano, or others.
62
+ description: A generalized and modular set of provisioning and deployment routines.
63
+ The Rake-centric Vlad and not-actually-Rake Capistrano both suffer from lack of
64
+ objects, e.g. the ability to customize and mix-in behavior. SyncWrap offers an Object/Module
65
+ system that can be used with either.
47
66
  email:
48
67
  - dek-oss@gravitext.com
49
68
  executables: []
@@ -94,35 +113,36 @@ files:
94
113
  - var/iyyov/jobs.rb
95
114
  homepage: http://github.com/dekellum/syncwrap
96
115
  licenses: []
97
- post_install_message:
116
+ post_install_message:
98
117
  rdoc_options:
99
118
  - --main
100
119
  - README.rdoc
101
120
  require_paths:
102
121
  - lib
103
122
  required_ruby_version: !ruby/object:Gem::Requirement
123
+ none: false
104
124
  requirements:
105
125
  - - ! '>='
106
126
  - !ruby/object:Gem::Version
107
127
  version: '0'
108
128
  segments:
109
129
  - 0
110
- hash: 2
111
- none: false
130
+ hash: -4179496661499854471
112
131
  required_rubygems_version: !ruby/object:Gem::Requirement
132
+ none: false
113
133
  requirements:
114
134
  - - ! '>='
115
135
  - !ruby/object:Gem::Version
116
136
  version: '0'
117
137
  segments:
118
138
  - 0
119
- hash: 2
120
- none: false
139
+ hash: -4179496661499854471
121
140
  requirements: []
122
- rubyforge_project:
123
- rubygems_version: 1.8.24
124
- signing_key:
141
+ rubyforge_project:
142
+ rubygems_version: 1.8.25
143
+ signing_key:
125
144
  specification_version: 3
126
- summary: A generalized and modular set of provisioning and deployment routines. The Rake-centric Vlad and not-actually-Rake Capistrano both suffer from lack of objects, e.g. the ability to customize and mix-in behavior. SyncWrap offers an Object/Module system that can be used with either.
145
+ summary: A generalized and modular set of provisioning and deployment routines. The
146
+ Rake-centric Vlad and not-actually-Rake Capistrano both suffer from lack of objects,
147
+ e.g. the ability to customize and mix-in behavior.
127
148
  test_files: []
128
- ...