syncwrap 1.4.0 → 1.5.0

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/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
- ...