yodel 0.0.3 → 0.0.4

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