yodel 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,7 +5,7 @@ Encoding.default_external = "utf-8"
5
5
  class CommandRunner
6
6
  def self.run
7
7
  OptionParser.new do |opts|
8
- opts.banner = "Usage: yodel [options] server|dns|console|migrate|setup|deploy"
8
+ opts.banner = "Usage: yodel [options] server|dns|restart|console|migrate|deploy|setup|update"
9
9
  opts.on('-p', '--port PORT', Integer, 'Override the default web server port') do |port|
10
10
  $web_port = port
11
11
  end
@@ -73,9 +73,7 @@ class CommandRunner
73
73
  require '../../yodel'
74
74
  Yodel.config.extensions_folder = $extensions_folder if $extensions_folder
75
75
  $application = Application.new
76
- Site.all.each do |site|
77
- Migration.run_migrations(site)
78
- end
76
+ Migration.run_migrations_for_all_sites
79
77
 
80
78
  when 'deploy'
81
79
  require '../../yodel'
@@ -86,6 +84,24 @@ class CommandRunner
86
84
  when 'setup'
87
85
  require './installer'
88
86
  Installer.new.install_system_files
87
+
88
+ when 'restart'
89
+ require './restart'
90
+ if Restart.can_restart?
91
+ Restart.restart!
92
+ else
93
+ puts "Restart can only be run on OS X machines"
94
+ end
95
+
96
+ when 'update'
97
+ require '../../yodel'
98
+ require './restart'
99
+ Yodel.config.extensions_folder = $extensions_folder if $extensions_folder
100
+ $application = Application.new
101
+
102
+ Migration.copy_missing_migrations_for_all_sites
103
+ Migration.run_migrations_for_all_sites
104
+ Restart.restart! if Restart.can_restart?
89
105
 
90
106
  else
91
107
  puts "Unknown command: #{command}"
@@ -0,0 +1,8 @@
1
+ require 'highline'
2
+
3
+ module Feedback
4
+ def self.report(verb, noun)
5
+ @h ||= HighLine.new
6
+ @h.say "<%= color('#{verb}', GREEN) %>\t#{noun}"
7
+ end
8
+ end
@@ -1,4 +1,5 @@
1
- require 'highline'
1
+ require './feedback'
2
+ require './restart'
2
3
  require 'tempfile'
3
4
  require 'ember'
4
5
  require 'etc'
@@ -9,7 +10,8 @@ class Installer
9
10
  # ----------------------------------------
10
11
  attr_reader :database_hostname, :database_port, :database_name,
11
12
  :sites_root, :ruby_path, :web_port, :dns_port,
12
- :user, :group, :public_directory
13
+ :user, :group, :public_directory, :git_path,
14
+ :identify_path, :convert_path
13
15
 
14
16
  def default_sites_root
15
17
  if `uname -a` =~ /Darwin/
@@ -34,9 +36,6 @@ class Installer
34
36
  @group = pwnam.gid
35
37
  end
36
38
 
37
- def default_group
38
- end
39
-
40
39
  def initialize
41
40
  # assign default values; not all values have associated questions
42
41
  # presented to the user depen
@@ -48,6 +47,9 @@ class Installer
48
47
  @public_directory = '/var/www'
49
48
  @sites_root = default_sites_root
50
49
  @ruby_path = default_ruby_path
50
+ @git_path = `which git`.strip
51
+ @identify_path = `which identify`.strip
52
+ @convert_path = `which convert`.strip
51
53
  assign_default_user_and_group
52
54
  end
53
55
 
@@ -59,10 +61,6 @@ class Installer
59
61
  @system_path ||= File.join(File.dirname(__FILE__), '..', '..', '..', 'system')
60
62
  end
61
63
 
62
- def report(verb, noun)
63
- @h.say "<%= color('#{verb}', GREEN) %>\t#{noun}"
64
- end
65
-
66
64
  def escape_quotes(str)
67
65
  str.gsub("'", "\\\\'")
68
66
  end
@@ -75,7 +73,7 @@ class Installer
75
73
  end
76
74
  source_path = File.join(system_path, file)
77
75
  temp_file = Tempfile.new('yodel')
78
- report('installing', dest_path)
76
+ Feedback.report('installing', dest_path)
79
77
 
80
78
  # render the file template
81
79
  temp_file.write Ember::Template.new(IO.read(source_path), {source_file: source_path}).render(binding)
@@ -149,6 +147,14 @@ class Installer
149
147
  h.say "your local user password.\n\n"
150
148
  h.say "-----------------------------------------------------------------------------\n\n"
151
149
 
150
+ # default program paths
151
+ Feedback.report('locating', "git: #{@git_path}")
152
+ Feedback.report('warning', "git not found, path must be set manually in /usr/local/etc/yodel/settings.rb") if @git_path.empty?
153
+ Feedback.report('locating', "identify: #{@identify_path}")
154
+ Feedback.report('warning', "identify not found, path must be set manually in /usr/local/etc/yodel/settings.rb") if @identify_path.empty?
155
+ Feedback.report('locating', "convert: #{@convert_path}")
156
+ Feedback.report('warning', "convert not found, path must be set manually in /usr/local/etc/yodel/settings.rb") if @convert_path.empty?
157
+
152
158
  # install system files
153
159
  if `uname -a` =~ /Darwin/
154
160
  install_mac_files
@@ -157,13 +163,13 @@ class Installer
157
163
  end
158
164
 
159
165
  # start yodel for environment installation
160
- report('starting', 'yodel')
166
+ Feedback.report('starting', 'yodel')
161
167
  require '../../yodel'
162
168
  Yodel.config.extensions_folder = $extensions_folder if $extensions_folder
163
169
  Yodel.load_extensions
164
170
 
165
171
  # install an environment support site
166
- report('installing', "#{@environment} environment support site")
172
+ Feedback.report('installing', "#{@environment} environment support site")
167
173
  site = Site.new
168
174
  site.name = "yodel"
169
175
  site.domains = ['yodel', 'localhost', '127.0.0.1']
@@ -198,17 +204,7 @@ class Installer
198
204
  install 'usr/local/etc/yodel/production_settings.rb', '0644', 'settings.rb'
199
205
  end
200
206
 
201
- report('starting', 'dns server')
202
- if `sudo launchctl list` =~ /\d+.+com.yodelcms.dns$/
203
- `sudo launchctl unload /Library/LaunchDaemons/com.yodelcms.dns.plist`
204
- end
205
- `sudo launchctl load /Library/LaunchDaemons/com.yodelcms.dns.plist`
206
-
207
- report('starting', 'web server')
208
- if `sudo launchctl list` =~ /\d+.+com.yodelcms.server$/
209
- `sudo launchctl unload /Library/LaunchDaemons/com.yodelcms.server.plist`
210
- end
211
- `sudo launchctl load /Library/LaunchDaemons/com.yodelcms.server.plist`
207
+ Restart.restart!
212
208
  end
213
209
 
214
210
 
@@ -0,0 +1,21 @@
1
+ require './feedback'
2
+
3
+ class Restart
4
+ def self.can_restart?
5
+ `uname -a` =~ /Darwin/
6
+ end
7
+
8
+ def self.restart!
9
+ Feedback.report('starting', 'dns server')
10
+ if `sudo launchctl list` =~ /\d+.+com.yodelcms.dns$/
11
+ `sudo launchctl unload /Library/LaunchDaemons/com.yodelcms.dns.plist`
12
+ end
13
+ `sudo launchctl load /Library/LaunchDaemons/com.yodelcms.dns.plist`
14
+
15
+ Feedback.report('starting', 'web server')
16
+ if `sudo launchctl list` =~ /\d+.+com.yodelcms.server$/
17
+ `sudo launchctl unload /Library/LaunchDaemons/com.yodelcms.server.plist`
18
+ end
19
+ `sudo launchctl load /Library/LaunchDaemons/com.yodelcms.server.plist`
20
+ end
21
+ end
@@ -15,17 +15,30 @@ class PublicAssets
15
15
  request = Rack::Request.new(env)
16
16
  site = env['yodel.site']
17
17
 
18
+ # when a site is missing, use the default set of public directories
18
19
  unless site.nil?
19
20
  public_directories = site.public_directories
20
21
  else
21
22
  public_directories = Yodel.config.public_directories
22
23
  end
23
24
 
24
- public_directories.each do |public_dir|
25
- path = File.join(public_dir, *parts)
25
+ # attachments are handled separately to normal public resources; to handle
26
+ # /attachments/* the same way as other public folders, the site root would
27
+ # need to be used as a public folder. Adding attachments as a public folder
28
+ # and removing /attachments/ from the url, or making the path of all
29
+ # attachments in development have no /attachments/ prefix could cause issues.
30
+ if !site.nil? && parts[1] == 'attachments'
31
+ path = File.join(site.attachments_directory, *parts[2..-1])
26
32
  if File.file?(path) && File.readable?(path)
27
33
  return dup.serve_file(path, env)
28
34
  end
35
+ else
36
+ public_directories.each do |public_dir|
37
+ path = File.join(public_dir, *parts)
38
+ if File.file?(path) && File.readable?(path)
39
+ return dup.serve_file(path, env)
40
+ end
41
+ end
29
42
  end
30
43
 
31
44
  # raise any delayed exceptions. These are delayed till this middleware so
@@ -6,12 +6,32 @@ class Image < Attachment
6
6
 
7
7
  def crop_image
8
8
  sizes = (@field.options['sizes'] || {}).to_hash.merge('admin_thumb' => '100x100')
9
- return unless exist?
9
+ return unless exist?
10
+
11
+ # determine image dimensions
12
+ dimensions = `#{Yodel.config.identify_path} -ping -format "%w %h" #{path}`
13
+ unless ('0'..'9').include?(dimensions[0])
14
+ raise "Invalid image format or unknown Image Magick error: #{dimensions}"
15
+ else
16
+ iw, ih = dimensions.split.map(&:to_i)
17
+ end
18
+
19
+ # resize to each custom size, using the given dimensions as a maximum and
20
+ # minimum size - the resulting image is cropped if necessary
10
21
  sizes.each do |size_name, size|
11
- image = MiniMagick::Image.open(path.to_s)
12
- image.resize("#{size}^")
13
- image.format('jpeg')
14
- image.write(resized_image_path(size_name, false).to_s)
22
+ sw, sh = size.split('x').map(&:to_i)
23
+ aspect = sw.to_f / sh.to_f
24
+ w, h = (ih * aspect), (iw / aspect)
25
+ w = [iw, w].min.to_i
26
+ h = [ih, h].min.to_i
27
+
28
+ command = "#{Yodel.config.convert_path} #{path} "
29
+ command += "-crop '#{w}x#{h}+#{(iw-w)/2}+#{(ih-h)/2}' "
30
+ command += "-resize '#{sw}x#{sh}' "
31
+ command += "-quality #{Yodel.config.image_quality} "
32
+ command += resized_image_path(size_name, false).to_s
33
+ result = `#{command}`
34
+ raise "Error converting image: #{result}" unless result.empty?
15
35
  end
16
36
  end
17
37
 
@@ -32,7 +52,7 @@ class Image < Attachment
32
52
  if size == :original
33
53
  super()
34
54
  else
35
- Pathname.new('/').join(relative_resized_image_path(size, crop_if_required))
55
+ Pathname.new('/').join(Yodel::ATTACHMENTS_DIRECTORY_NAME, relative_resized_image_path(size, crop_if_required))
36
56
  end
37
57
  end
38
58
  end
@@ -1,4 +1,29 @@
1
1
  class Migration
2
+ def self.copy_missing_migrations_for_all_sites
3
+ Site.all.each do |site|
4
+ next if site.name == 'yodel'
5
+ copy_missing_migrations_for_site(site)
6
+ end
7
+ end
8
+
9
+ def self.copy_missing_migrations_for_site(site)
10
+ # core yodel migrations
11
+ site_yodel_migrations_dir = File.join(site.migrations_directory, Yodel::YODEL_MIGRATIONS_DIRECTORY_NAME)
12
+ sync_migration_directories(Yodel.config.yodel_migration_directory, site_yodel_migrations_dir)
13
+
14
+ # extension migrations
15
+ extension_migrations_dir = File.join(site.root_directory, Yodel::MIGRATIONS_DIRECTORY_NAME, Yodel::EXTENSION_MIGRATIONS_DIRECTORY_NAME)
16
+ Yodel.config.extensions.each do |extension|
17
+ sync_migration_directories(extension.migrations_dir, File.join(extension_migrations_dir, extension.name))
18
+ end
19
+ end
20
+
21
+ def self.run_migrations_for_all_sites
22
+ Site.all.each do |site|
23
+ run_migrations(site)
24
+ end
25
+ end
26
+
2
27
  def self.run_migrations(site)
3
28
  Yodel.config.logger.info "Migrating #{site.name}"
4
29
 
@@ -49,4 +74,17 @@ class Migration
49
74
  Object.send(:remove_const, @migration.name.to_sym) if @migration
50
75
  end
51
76
  end
77
+
78
+ def self.sync_migration_directories(authoritative_folder, site_folder)
79
+ if File.exist?(site_folder)
80
+ Dir[File.join(authoritative_folder, '**/*.rb')].each do |file|
81
+ destination = File.join(site_folder, File.basename(file))
82
+ unless File.exist?(destination)
83
+ FileUtils.cp(file, destination)
84
+ end
85
+ end
86
+ else
87
+ FileUtils.cp_r(authoritative_folder, site_folder)
88
+ end
89
+ end
52
90
  end
@@ -58,13 +58,7 @@ class Site < MongoRecord
58
58
  end
59
59
 
60
60
  def public_directories
61
- @public_dirs ||= begin
62
- if Yodel.env.production?
63
- Yodel.config.public_directories + [public_directory]
64
- else
65
- Yodel.config.public_directories + [public_directory, attachments_directory]
66
- end
67
- end
61
+ @public_dirs ||= Yodel.config.public_directories + [public_directory]
68
62
  end
69
63
 
70
64
  def layouts_directory
data/lib/yodel/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Yodel
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.4'
3
3
  end
@@ -14,7 +14,10 @@ Yodel.config.define do |config|
14
14
  # environment
15
15
  config.web_port = <%= web_port %>
16
16
  config.dns_port = <%= dns_port %>
17
- config.git_path = `which git`.strip
17
+ config.git_path = '<%= git_path %>'
18
+ config.identify_path = '<%= identify_path %>'
19
+ config.convert_path = '<%= convert_path %>'
20
+ config.image_quality = 95
18
21
 
19
22
  # logging
20
23
  config.logger = Logger.new('/var/log/yodel.log')
@@ -11,9 +11,12 @@ Yodel.config.define do |config|
11
11
 
12
12
  # environment
13
13
  config.dns_port = <%= dns_port %>
14
- config.git_path = `which git`.strip
15
14
  config.public_directory = '<%= public_directory %>'
16
15
  config.deploy_command = 'yodel'
16
+ config.git_path = '<%= git_path %>'
17
+ config.identify_path = '<%= identify_path %>'
18
+ config.convert_path = '<%= convert_path %>'
19
+ config.image_quality = 95
17
20
 
18
21
  # logging
19
22
  config.logger = Logger.new('/var/log/yodel.log')
data/yodel.gemspec CHANGED
@@ -32,7 +32,6 @@ Gem::Specification.new do |s|
32
32
  s.add_runtime_dependency 'rubydns', '~> 0.3.3'
33
33
  s.add_runtime_dependency 'git', '~> 1.2.5'
34
34
  s.add_runtime_dependency 'highline', '~> 1.6.2'
35
- s.add_runtime_dependency 'mini_magick', '~> 3.3'
36
35
  s.add_runtime_dependency 'linguistics', '~> 1.0.9'
37
36
 
38
37
  # extensions
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yodel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-13 00:00:00.000000000Z
12
+ date: 2011-12-18 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
- requirement: &70164834814320 !ruby/object:Gem::Requirement
16
+ requirement: &70185758343000 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.0.21
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70164834814320
24
+ version_requirements: *70185758343000
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rack
27
- requirement: &70164834813080 !ruby/object:Gem::Requirement
27
+ requirement: &70185758336560 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.3.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70164834813080
35
+ version_requirements: *70185758336560
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: mongo
38
- requirement: &70164834812520 !ruby/object:Gem::Requirement
38
+ requirement: &70185758336040 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.3.1
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70164834812520
46
+ version_requirements: *70185758336040
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bson
49
- requirement: &70164834811880 !ruby/object:Gem::Requirement
49
+ requirement: &70185758335500 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.3.1
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70164834811880
57
+ version_requirements: *70185758335500
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: bson_ext
60
- requirement: &70164834811120 !ruby/object:Gem::Requirement
60
+ requirement: &70185758334940 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.3.1
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70164834811120
68
+ version_requirements: *70185758334940
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: plucky
71
- requirement: &70164834810420 !ruby/object:Gem::Requirement
71
+ requirement: &70185758334180 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 0.4.1
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *70164834810420
79
+ version_requirements: *70185758334180
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: activesupport
82
- requirement: &70164834800440 !ruby/object:Gem::Requirement
82
+ requirement: &70185758333040 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 3.0.3
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *70164834800440
90
+ version_requirements: *70185758333040
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: ember
93
- requirement: &70164834798560 !ruby/object:Gem::Requirement
93
+ requirement: &70185758332380 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 0.3.1
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *70164834798560
101
+ version_requirements: *70185758332380
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: mail
104
- requirement: &70164834797360 !ruby/object:Gem::Requirement
104
+ requirement: &70185758331740 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 2.3.0
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *70164834797360
112
+ version_requirements: *70185758331740
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: hpricot
115
- requirement: &70164834796140 !ruby/object:Gem::Requirement
115
+ requirement: &70185758330900 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ~>
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: 0.8.4
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *70164834796140
123
+ version_requirements: *70185758330900
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: json
126
- requirement: &70164834794680 !ruby/object:Gem::Requirement
126
+ requirement: &70185758329800 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ~>
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: 1.6.1
132
132
  type: :runtime
133
133
  prerelease: false
134
- version_requirements: *70164834794680
134
+ version_requirements: *70185758329800
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: rack-contrib
137
- requirement: &70164834794120 !ruby/object:Gem::Requirement
137
+ requirement: &70185758328680 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ~>
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: 1.1.0
143
143
  type: :runtime
144
144
  prerelease: false
145
- version_requirements: *70164834794120
145
+ version_requirements: *70185758328680
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: rubydns
148
- requirement: &70164834793220 !ruby/object:Gem::Requirement
148
+ requirement: &70185758321500 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ~>
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: 0.3.3
154
154
  type: :runtime
155
155
  prerelease: false
156
- version_requirements: *70164834793220
156
+ version_requirements: *70185758321500
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: git
159
- requirement: &70164834791920 !ruby/object:Gem::Requirement
159
+ requirement: &70185758320840 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ~>
@@ -164,10 +164,10 @@ dependencies:
164
164
  version: 1.2.5
165
165
  type: :runtime
166
166
  prerelease: false
167
- version_requirements: *70164834791920
167
+ version_requirements: *70185758320840
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: highline
170
- requirement: &70164834791420 !ruby/object:Gem::Requirement
170
+ requirement: &70185758319960 !ruby/object:Gem::Requirement
171
171
  none: false
172
172
  requirements:
173
173
  - - ~>
@@ -175,21 +175,10 @@ dependencies:
175
175
  version: 1.6.2
176
176
  type: :runtime
177
177
  prerelease: false
178
- version_requirements: *70164834791420
179
- - !ruby/object:Gem::Dependency
180
- name: mini_magick
181
- requirement: &70164834790920 !ruby/object:Gem::Requirement
182
- none: false
183
- requirements:
184
- - - ~>
185
- - !ruby/object:Gem::Version
186
- version: '3.3'
187
- type: :runtime
188
- prerelease: false
189
- version_requirements: *70164834790920
178
+ version_requirements: *70185758319960
190
179
  - !ruby/object:Gem::Dependency
191
180
  name: linguistics
192
- requirement: &70164834790100 !ruby/object:Gem::Requirement
181
+ requirement: &70185758319260 !ruby/object:Gem::Requirement
193
182
  none: false
194
183
  requirements:
195
184
  - - ~>
@@ -197,10 +186,10 @@ dependencies:
197
186
  version: 1.0.9
198
187
  type: :runtime
199
188
  prerelease: false
200
- version_requirements: *70164834790100
189
+ version_requirements: *70185758319260
201
190
  - !ruby/object:Gem::Dependency
202
191
  name: yodel_admin
203
- requirement: &70164834789500 !ruby/object:Gem::Requirement
192
+ requirement: &70185758318680 !ruby/object:Gem::Requirement
204
193
  none: false
205
194
  requirements:
206
195
  - - ! '>='
@@ -208,10 +197,10 @@ dependencies:
208
197
  version: '0'
209
198
  type: :runtime
210
199
  prerelease: false
211
- version_requirements: *70164834789500
200
+ version_requirements: *70185758318680
212
201
  - !ruby/object:Gem::Dependency
213
202
  name: yodel_queue
214
- requirement: &70164834788840 !ruby/object:Gem::Requirement
203
+ requirement: &70185758318200 !ruby/object:Gem::Requirement
215
204
  none: false
216
205
  requirements:
217
206
  - - ! '>='
@@ -219,10 +208,10 @@ dependencies:
219
208
  version: '0'
220
209
  type: :runtime
221
210
  prerelease: false
222
- version_requirements: *70164834788840
211
+ version_requirements: *70185758318200
223
212
  - !ruby/object:Gem::Dependency
224
213
  name: yodel_blog
225
- requirement: &70164834788160 !ruby/object:Gem::Requirement
214
+ requirement: &70185758317780 !ruby/object:Gem::Requirement
226
215
  none: false
227
216
  requirements:
228
217
  - - ! '>='
@@ -230,10 +219,10 @@ dependencies:
230
219
  version: '0'
231
220
  type: :runtime
232
221
  prerelease: false
233
- version_requirements: *70164834788160
222
+ version_requirements: *70185758317780
234
223
  - !ruby/object:Gem::Dependency
235
224
  name: yodel_shop
236
- requirement: &70164834787640 !ruby/object:Gem::Requirement
225
+ requirement: &70185758317320 !ruby/object:Gem::Requirement
237
226
  none: false
238
227
  requirements:
239
228
  - - ! '>='
@@ -241,10 +230,10 @@ dependencies:
241
230
  version: '0'
242
231
  type: :runtime
243
232
  prerelease: false
244
- version_requirements: *70164834787640
233
+ version_requirements: *70185758317320
245
234
  - !ruby/object:Gem::Dependency
246
235
  name: yodel_development_environment
247
- requirement: &70164834787180 !ruby/object:Gem::Requirement
236
+ requirement: &70185758316820 !ruby/object:Gem::Requirement
248
237
  none: false
249
238
  requirements:
250
239
  - - ! '>='
@@ -252,10 +241,10 @@ dependencies:
252
241
  version: '0'
253
242
  type: :runtime
254
243
  prerelease: false
255
- version_requirements: *70164834787180
244
+ version_requirements: *70185758316820
256
245
  - !ruby/object:Gem::Dependency
257
246
  name: yodel_production_environment
258
- requirement: &70164834786720 !ruby/object:Gem::Requirement
247
+ requirement: &70185758316380 !ruby/object:Gem::Requirement
259
248
  none: false
260
249
  requirements:
261
250
  - - ! '>='
@@ -263,7 +252,7 @@ dependencies:
263
252
  version: '0'
264
253
  type: :runtime
265
254
  prerelease: false
266
- version_requirements: *70164834786720
255
+ version_requirements: *70185758316380
267
256
  description: Yodel CMS
268
257
  email:
269
258
  - me@willcannings.com
@@ -288,7 +277,9 @@ files:
288
277
  - lib/yodel/command/command.rb
289
278
  - lib/yodel/command/deploy.rb
290
279
  - lib/yodel/command/dns_server.rb
280
+ - lib/yodel/command/feedback.rb
291
281
  - lib/yodel/command/installer.rb
282
+ - lib/yodel/command/restart.rb
292
283
  - lib/yodel/config/config.rb
293
284
  - lib/yodel/config/environment.rb
294
285
  - lib/yodel/config/yodel.rb