woody 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -15,3 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ .idea/
data/bin/woody CHANGED
@@ -13,7 +13,7 @@ command :compile do |c|
13
13
  c.description = "Compiles the site"
14
14
  c.action do |args, options|
15
15
  Woody.init
16
- Woody.compile
16
+ Woody::Compiler.compile
17
17
  end
18
18
  end
19
19
 
@@ -21,7 +21,7 @@ command :deploy do |c|
21
21
  c.description = "Deploys the site"
22
22
  c.action do |args, options|
23
23
  Woody.init
24
- Woody.deploy
24
+ Woody::Deployer.deploy
25
25
  end
26
26
  end
27
27
 
@@ -29,8 +29,8 @@ command :cd do |c|
29
29
  c.description = "Compiles then deploys the site"
30
30
  c.action do |args, options|
31
31
  Woody.init
32
- Woody.compile
33
- Woody.deploy
32
+ Woody::Compiler.compile
33
+ Woody::Deployer.deploy
34
34
  end
35
35
  end
36
36
 
@@ -42,7 +42,7 @@ command :new do |c|
42
42
  puts "Syntax: woody new [sitename]"
43
43
  exit!
44
44
  end
45
- Woody::new_site(args[0])
45
+ Woody::Generator.new_site(args[0])
46
46
  end
47
47
  end
48
48
 
@@ -50,6 +50,6 @@ command :update_templates do |c|
50
50
  c.description = "Sets template files to current default. DESTRUCTIVE!"
51
51
  c.action do |args, options|
52
52
  Woody.init
53
- Woody::update_templates
53
+ Woody::Generator.update_templates
54
54
  end
55
55
  end
@@ -0,0 +1,116 @@
1
+ module Woody
2
+ module Compiler
3
+ def self.compile()
4
+ puts "Compiling..."
5
+ meta = YAML.load_file("content/metadata.yml")
6
+
7
+ episodes = Array.new
8
+ filesfound = Array.new
9
+ touchedfiles = Array.new
10
+ Dir.glob('content/*.mp3') do |file|
11
+ filename = file[8..-1]
12
+ unless meta == false or meta[filename].nil?
13
+ # Episode metadata already stored
14
+ episodes << Episode.new_from_meta(filename, meta[filename])
15
+ filesfound << filename
16
+ else
17
+ # No episode metadata stored for this yet
18
+
19
+ puts "Warning: no metadata found for file #{filename}"
20
+ end
21
+ end
22
+
23
+ # Check for files in meta but not found
24
+ unless meta == false
25
+ meta.each do |file|
26
+ next if filesfound.include? file[0]
27
+ puts "Warning: found metadata for file #{file[0]}, but file itself is missing. Will not be published."
28
+ end
29
+ end
30
+
31
+ # Make sure necessary directories exist
32
+ FileUtils.mkdir_p('output/assets') unless File.directory?('output/assets')
33
+ FileUtils.mkdir_p('output/assets/mp3') unless File.directory?('output/assets/mp3')
34
+ FileUtils.mkdir_p('output/episode') unless File.directory?('output/episode')
35
+
36
+ # Copy over (TODO: and process) MP3 files
37
+ episodes.each do |episode|
38
+ FileUtils.copy "content/#{episode.filename}", "output/assets/mp3/#{episode.compiledname}"
39
+ touchedfiles << "assets/mp3/#{episode.compiledname}"
40
+ end
41
+
42
+ # Copy over assets
43
+ Dir.foreach("templates/assets") do |item|
44
+ next if item == '.' or item == '..'
45
+ begin
46
+ FileUtils.copy "templates/assets/#{item}", "output/assets/#{item}"
47
+ touchedfiles << "assets/#{item}"
48
+ rescue Errno::EISDIR
49
+ puts "Warning: subdirectories in templates/assets are ignored!"
50
+ end
51
+ end
52
+
53
+ # Update index.html
54
+ layout = File.read('templates/layout.html')
55
+ layout = Erubis::Eruby.new(layout)
56
+
57
+ index_compiled = layout.result(config: $config, episodes: episodes) do
58
+ index = Erubis::Eruby.new(File.read('templates/index.html'))
59
+ index.result(config: $config, episodes: episodes, test: "hello, world") do |episode|
60
+ ep = Erubis::Eruby.new(File.read('templates/episode.html'))
61
+ ep.result(config: $config, episodes: episodes, episode: episode)
62
+ end
63
+ end
64
+ File.open('output/index.html', 'w') {|f| f.write(index_compiled) }
65
+ touchedfiles << 'index.html'
66
+
67
+ # Update episode pages
68
+ episodes.each do |episode|
69
+ layout = File.read('templates/layout.html')
70
+ layout = Erubis::Eruby.new(layout)
71
+ episode_compiled = layout.result(config: $config, episodes: episodes) do
72
+ ep = Erubis::Eruby.new(File.read('templates/episode.html'))
73
+ ep.result(config: $config, episodes: episodes, episode: episode)
74
+ end
75
+ File.open("output/#{episode.path(false)}", 'w') {|f| f.write(episode_compiled) }
76
+ touchedfiles << episode.path(false)
77
+ end
78
+
79
+ # Copy over iTunes.png
80
+ if File.exist? "content/iTunes.png"
81
+ FileUtils.copy "content/iTunes.png", "output/assets/iTunes.png"
82
+ touchedfiles << "assets/iTunes.png"
83
+ else
84
+ puts "Warning: content/iTunes.png missing!"
85
+ end
86
+
87
+ # Update iTunes RSS
88
+ itunes = File.read "#{$source_root}/itunes.xml" # Use itunes.xml template in gem, not in site's template folder.
89
+ itunes = Erubis::Eruby.new(itunes)
90
+ itunes_compiled = itunes.result(config: $config, episodes: episodes)
91
+ File.open("output/itunes.xml", 'w') {|f| f.write(itunes_compiled) }
92
+ touchedfiles << "itunes.xml"
93
+
94
+
95
+ # Update General RSS
96
+
97
+
98
+ # Purge left over files
99
+ purge_output(touchedfiles)
100
+ end
101
+
102
+ private
103
+
104
+ def self.purge_output(touchedfiles, subdir = "")
105
+ Dir.foreach("output/#{subdir}") do |item|
106
+ next if item == '.' or item == '..'
107
+ p = "#{subdir}#{item}"
108
+ begin
109
+ File.delete "output/#{subdir}#{item}" unless touchedfiles.include? p
110
+ rescue Errno::EISDIR, Errno::EPERM # Rescuing EPERM seems to be necessary on macs, hmm :/
111
+ purge_output touchedfiles, "#{p}/"
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,67 @@
1
+ module Woody
2
+ module Deployer
3
+ def self.deploy
4
+ touchedfiles = Array.new
5
+ deploy_r touchedfiles
6
+
7
+ # Purge left over files
8
+ purge_bucket touchedfiles
9
+ end
10
+
11
+ private
12
+
13
+ def self.deploy_r(touchedfiles, subdir = "")
14
+ puts "Deploying... " if subdir == ""
15
+ Dir.foreach("output/#{subdir}") do |item|
16
+ next if item == '.' or item == '..'
17
+ begin
18
+ touchedfiles << "#{subdir}#{item}"
19
+ upload("#{subdir}#{item}", "output/#{subdir}#{item}")
20
+ rescue Errno::EISDIR
21
+ deploy_r touchedfiles, "#{subdir}#{item}/"
22
+ end
23
+ end
24
+ end
25
+
26
+ def self.purge_bucket(touchedfiles)
27
+ bucket = AWS::S3::Bucket.find $bucketname
28
+ bucket.objects.each do |object|
29
+ object.delete unless touchedfiles.include? object.key
30
+ end
31
+ end
32
+
33
+ def self.filehash(filepath)
34
+ sha1 = Digest::SHA1.new
35
+ File.open(filepath) do|file|
36
+ buffer = ''
37
+ # Read the file 512 bytes at a time
38
+ while not file.eof
39
+ file.read(512, buffer)
40
+ sha1.update(buffer)
41
+ end
42
+ end
43
+ return sha1.to_s
44
+ end
45
+
46
+ def self.upload(objectname, filepath)
47
+ # Generate hash of file
48
+ hash = filehash filepath
49
+
50
+ # Get hash of version already uploaded, if available.
51
+ begin
52
+ object = AWS::S3::S3Object.find objectname, $bucketname
53
+ oldhash = object.metadata['hash']
54
+ rescue AWS::S3::NoSuchKey
55
+ # File not uploaded yet
56
+ oldhash = nil
57
+ end
58
+ unless hash == oldhash
59
+ # Don't reupload if file hasn't changed
60
+ puts "#{objectname}: Uploading"
61
+ AWS::S3::S3Object.store(objectname, open(filepath), $bucketname, access: :public_read, 'x-amz-meta-hash' => hash)
62
+ else
63
+ puts "#{objectname}: Not uploading, hasn't changed since last time."
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,64 @@
1
+ module Woody
2
+ class Episode
3
+ def self.new_from_meta(filename, meta)
4
+ return Episode.new(filename, meta['title'], Date.parse(meta['date']), meta['synopsis'], meta['subtitle'], meta['tags'])
5
+ end
6
+
7
+ def initialize(filename, title, date, synopsis, subtitle = nil, tags = [], compiledname = nil)
8
+ @filename = filename
9
+ @title = title
10
+ @date = date
11
+ @synopsis = synopsis
12
+ @subtitle = subtitle
13
+ @tags = tags
14
+ @compiledname = compiledname
15
+
16
+ if @compiledname.nil? or @compiledname.empty?
17
+ @compiledname = @filename.gsub(/[^0-9A-Za-z .]/, '').gsub(' ', '_')
18
+ end
19
+ end
20
+
21
+ attr_accessor :filename, :title, :date, :synopsis, :tags, :subtitle, :compiledname
22
+
23
+ def url
24
+ return "#{$config['urlbase']}#{path}" unless path.nil?
25
+ return false
26
+ end
27
+
28
+ def path(leader=true)
29
+ return "#{leader ? "/" : ""}episode/#{@compiledname[0..-5]}.html" unless @compiledname.nil?
30
+ return false
31
+ end
32
+
33
+ def file_url
34
+ return "#{$config['urlbase']}#{file_path}" unless file_path.nil?
35
+ return false
36
+ end
37
+
38
+ def file_path(leader=true)
39
+ return "#{leader ? "/" : ""}assets/mp3/#{@compiledname}" unless @compiledname.nil?
40
+ return false
41
+ end
42
+
43
+ def keywords
44
+ @tags.join ', ' unless @tags.nil? or @tags.empty?
45
+ end
46
+
47
+ def size
48
+ File.size "content/#{filename}"
49
+ end
50
+
51
+ def duration
52
+ return @duration unless @duration.nil?
53
+ length = 0
54
+ Mp3Info.open("content/#{@filename}") do |mp3|
55
+ length = mp3.length
56
+ end
57
+ length = length.to_i
58
+ seconds = length % 60
59
+ minutes = (length / 60).to_i
60
+ @duration = "#{minutes}:#{seconds}"
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,54 @@
1
+ module Woody
2
+ module Generator
3
+ def self.new_site(name)
4
+ puts "Creating new site '#{name}'..."
5
+ if File.directory?(name)
6
+ puts "Error: directory '#{name}' already exists!"
7
+ return false
8
+ end
9
+
10
+ cdir_p(name)
11
+ cpy_t("woody-config.yml", "#{name}/woody-config.yml")
12
+
13
+ cdir_p("#{name}/templates")
14
+ cpy_t("layout.html", "#{name}/templates/layout.html")
15
+ cpy_t("index.html", "#{name}/templates/index.html")
16
+ cpy_t("episode.html", "#{name}/templates/episode.html")
17
+
18
+ cdir_p("#{name}/templates/assets")
19
+ cpy_t("stylesheet.css", "#{name}/templates/assets/stylesheet.css")
20
+
21
+ cdir_p("#{name}/content")
22
+ cpy_t("metadata.yml", "#{name}/content/metadata.yml")
23
+ cpy_t("iTunes.png", "#{name}/content/iTunes.png")
24
+
25
+ cdir_p("#{name}/output")
26
+ cdir_p("#{name}/output/assets")
27
+ cdir_p("#{name}/output/assets/mp3")
28
+ cdir_p("#{name}/output/episode")
29
+
30
+ puts "Done!"
31
+ puts "Now, do `cd #{name}` then edit the config file, woody-config.yml."
32
+ end
33
+
34
+ def self.update_templates
35
+ puts "Updating templates..."
36
+ cpy_t("layout.html", "templates/layout.html")
37
+ cpy_t("index.html", "templates/index.html")
38
+ cpy_t("episode.html", "templates/episode.html")
39
+ cpy_t("stylesheet.css", "templates/assets/stylesheet.css")
40
+ puts "Done! Thanks for updating :)"
41
+ end
42
+
43
+ private
44
+
45
+ def self.cdir_p(dir)
46
+ puts "Creating directory '#{dir}'"
47
+ FileUtils.mkdir_p(dir)
48
+ end
49
+ def self.cpy_t(source, destination)
50
+ puts "Creating file '#{destination}'"
51
+ FileUtils.cp File.join($source_root, source), destination
52
+ end
53
+ end
54
+ end
data/lib/woody/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Woody
2
- VERSION = "0.0.11"
2
+ VERSION = "0.0.12"
3
3
  end
data/lib/woody.rb CHANGED
@@ -1,4 +1,8 @@
1
1
  require "woody/version"
2
+ require "woody/episode"
3
+ require "woody/compiler"
4
+ require "woody/deployer"
5
+ require "woody/generator"
2
6
 
3
7
  require 'yaml'
4
8
  require 'erubis'
@@ -14,7 +18,6 @@ $VERBOSE = oldverbosity
14
18
 
15
19
  module Woody
16
20
  $source_root = File.expand_path("../../templates", __FILE__)
17
-
18
21
  # Load configuration
19
22
  def self.init
20
23
  begin
@@ -43,284 +46,6 @@ module Woody
43
46
  AWS::S3::DEFAULT_HOST.replace $config['s3']['hostname']
44
47
  $bucketname = $config['s3']['bucket']
45
48
  end
46
-
47
- def self.new_site(name)
48
- puts "Creating new site '#{name}'..."
49
- if File.directory?(name)
50
- puts "Error: directory '#{name}' already exists!"
51
- return false
52
- end
53
-
54
- cdir_p(name)
55
- cpy_t("woody-config.yml", "#{name}/woody-config.yml")
56
-
57
- cdir_p("#{name}/templates")
58
- cpy_t("layout.html", "#{name}/templates/layout.html")
59
- cpy_t("index.html", "#{name}/templates/index.html")
60
- cpy_t("episode.html", "#{name}/templates/episode.html")
61
-
62
- cdir_p("#{name}/templates/assets")
63
- cpy_t("stylesheet.css", "#{name}/templates/assets/stylesheet.css")
64
-
65
- cdir_p("#{name}/content")
66
- cpy_t("metadata.yml", "#{name}/content/metadata.yml")
67
- cpy_t("iTunes.png", "#{name}/content/iTunes.png")
68
-
69
- cdir_p("#{name}/output")
70
- cdir_p("#{name}/output/assets")
71
- cdir_p("#{name}/output/assets/mp3")
72
- cdir_p("#{name}/output/episode")
73
-
74
- puts "Done!"
75
- puts "Now, do `cd #{name}` then edit the config file, woody-config.yml."
76
- end
77
-
78
- def self.update_templates
79
- puts "Updating templates..."
80
- cpy_t("layout.html", "templates/layout.html")
81
- cpy_t("index.html", "templates/index.html")
82
- cpy_t("episode.html", "templates/episode.html")
83
- cpy_t("stylesheet.css", "templates/assets/stylesheet.css")
84
- puts "Done! Thanks for updating :)"
85
- end
86
-
87
- def self.cdir_p(dir)
88
- puts "Creating directory '#{dir}'"
89
- FileUtils.mkdir_p(dir)
90
- end
91
- def self.cpy_t(source, destination)
92
- puts "Creating file '#{destination}'"
93
- FileUtils.cp File.join($source_root, source), destination
94
- end
95
-
96
- class Episode
97
- def self.new_from_meta(filename, meta)
98
- return Episode.new(filename, meta['title'], Date.parse(meta['date']), meta['synopsis'], meta['subtitle'], meta['tags'])
99
- end
100
- def initialize(filename, title, date, synopsis, subtitle = nil, tags = [], compiledname = nil)
101
- @filename = filename
102
- @title = title
103
- @date = date
104
- @synopsis = synopsis
105
- @subtitle = subtitle
106
- @tags = tags
107
- @compiledname = compiledname
108
-
109
- if @compiledname.nil? or @compiledname.empty?
110
- @compiledname = @filename.gsub(/[^0-9A-Za-z .]/, '').gsub(' ','_')
111
- end
112
- end
113
- attr_accessor :filename, :title, :date, :synopsis, :tags, :subtitle, :compiledname
114
- def duration
115
- return @duration unless @duration.nil?
116
- length = 0
117
- Mp3Info.open("content/#{@filename}") do |mp3|
118
- length = mp3.length
119
- end
120
- length = length.to_i
121
- seconds = length % 60
122
- minutes = (length / 60).to_i
123
- @duration = "#{minutes}:#{seconds}"
124
- end
125
- def size
126
- File.size "content/#{filename}"
127
- end
128
- def keywords
129
- @tags.join ', ' unless @tags.nil? or @tags.empty?
130
- end
131
- def file_path(leader=true)
132
- return "#{leader ? "/" : ""}assets/mp3/#{@compiledname}" unless @compiledname.nil?
133
- return false
134
- end
135
- def file_url
136
- return "#{$config['urlbase']}#{file_path}" unless file_path.nil?
137
- return false
138
- end
139
- def path(leader=true)
140
- return "#{leader ? "/" : ""}episode/#{@compiledname[0..-5]}.html" unless @compiledname.nil?
141
- return false
142
- end
143
- def url
144
- return "#{$config['urlbase']}#{path}" unless path.nil?
145
- return false
146
- end
147
- end
148
-
149
- def self.compile()
150
- puts "Compiling..."
151
- meta = YAML.load_file("content/metadata.yml")
152
-
153
- episodes = Array.new
154
- filesfound = Array.new
155
- touchedfiles = Array.new
156
- Dir.glob('content/*.mp3') do |file|
157
- filename = file[8..-1]
158
- unless meta == false or meta[filename].nil?
159
- # Episode metadata already stored
160
- episodes << Episode.new_from_meta(filename, meta[filename])
161
- filesfound << filename
162
- else
163
- # No episode metadata stored for this yet
164
-
165
- puts "Warning: no metadata found for file #{filename}"
166
- end
167
- end
168
-
169
- # Check for files in meta but not found
170
- unless meta == false
171
- meta.each do |file|
172
- next if filesfound.include? file[0]
173
- puts "Warning: found metadata for file #{file[0]}, but file itself is missing. Will not be published."
174
- end
175
- end
176
-
177
- # Make sure necessary directories exist
178
- FileUtils.mkdir_p('output/assets') unless File.directory?('output/assets')
179
- FileUtils.mkdir_p('output/assets/mp3') unless File.directory?('output/assets/mp3')
180
- FileUtils.mkdir_p('output/episode') unless File.directory?('output/episode')
181
-
182
- # Copy over (TODO: and process) MP3 files
183
- episodes.each do |episode|
184
- FileUtils.copy "content/#{episode.filename}", "output/assets/mp3/#{episode.compiledname}"
185
- touchedfiles << "assets/mp3/#{episode.compiledname}"
186
- end
187
-
188
- # Copy over assets
189
- Dir.foreach("templates/assets") do |item|
190
- next if item == '.' or item == '..'
191
- begin
192
- FileUtils.copy "templates/assets/#{item}", "output/assets/#{item}"
193
- touchedfiles << "assets/#{item}"
194
- rescue Errno::EISDIR
195
- puts "Warning: subdirectories in templates/assets are ignored!"
196
- end
197
- end
198
-
199
- # Update index.html
200
- layout = File.read('templates/layout.html')
201
- layout = Erubis::Eruby.new(layout)
202
-
203
- index_compiled = layout.result(config: $config, episodes: episodes) do
204
- index = Erubis::Eruby.new(File.read('templates/index.html'))
205
- index.result(config: $config, episodes: episodes, test: "hello, world") do |episode|
206
- ep = Erubis::Eruby.new(File.read('templates/episode.html'))
207
- ep.result(config: $config, episodes: episodes, episode: episode)
208
- end
209
- end
210
- File.open('output/index.html', 'w') {|f| f.write(index_compiled) }
211
- touchedfiles << 'index.html'
212
-
213
- # Update episode pages
214
- episodes.each do |episode|
215
- layout = File.read('templates/layout.html')
216
- layout = Erubis::Eruby.new(layout)
217
- episode_compiled = layout.result(config: $config, episodes: episodes) do
218
- ep = Erubis::Eruby.new(File.read('templates/episode.html'))
219
- ep.result(config: $config, episodes: episodes, episode: episode)
220
- end
221
- File.open("output/#{episode.path(false)}", 'w') {|f| f.write(episode_compiled) }
222
- touchedfiles << episode.path(false)
223
- end
224
-
225
- # Copy over iTunes.png
226
- if File.exist? "content/iTunes.png"
227
- FileUtils.copy "content/iTunes.png", "output/assets/iTunes.png"
228
- touchedfiles << "assets/iTunes.png"
229
- else
230
- puts "Warning: content/iTunes.png missing!"
231
- end
232
-
233
- # Update iTunes RSS
234
- itunes = File.read "#{$source_root}/itunes.xml" # Use itunes.xml template in gem, not in site's template folder.
235
- itunes = Erubis::Eruby.new(itunes)
236
- itunes_compiled = itunes.result(config: $config, episodes: episodes)
237
- File.open("output/itunes.xml", 'w') {|f| f.write(itunes_compiled) }
238
- touchedfiles << "itunes.xml"
239
-
240
-
241
- # Update General RSS
242
-
243
-
244
- # Purge left over files
245
- purge_output(touchedfiles)
246
- end
247
-
248
- def self.purge_output(touchedfiles, subdir = "")
249
- Dir.foreach("output/#{subdir}") do |item|
250
- next if item == '.' or item == '..'
251
- p = "#{subdir}#{item}"
252
- begin
253
- File.delete "output/#{subdir}#{item}" unless touchedfiles.include? p
254
- rescue Errno::EISDIR, Errno::EPERM # Rescuing EPERM seems to be necessary on macs, hmm :/
255
- purge_output touchedfiles, "#{p}/"
256
- end
257
- end
258
- end
259
-
260
- def self.deploy
261
- touchedfiles = Array.new
262
- deploy_r touchedfiles
263
-
264
- # Purge left over files
265
- purge_bucket touchedfiles
266
- end
267
-
268
- def self.deploy_r(touchedfiles, subdir = "")
269
- puts "Deploying... " if subdir == ""
270
- Dir.foreach("output/#{subdir}") do |item|
271
- next if item == '.' or item == '..'
272
- begin
273
- touchedfiles << "#{subdir}#{item}"
274
- upload("#{subdir}#{item}", "output/#{subdir}#{item}")
275
- rescue Errno::EISDIR
276
- deploy_r touchedfiles, "#{subdir}#{item}/"
277
- end
278
- end
279
- end
280
-
281
- def self.purge_bucket(touchedfiles)
282
- bucket = AWS::S3::Bucket.find $bucketname
283
- bucket.objects.each do |object|
284
- object.delete unless touchedfiles.include? object.key
285
- end
286
- end
287
-
288
- def self.filehash(filepath)
289
- sha1 = Digest::SHA1.new
290
- File.open(filepath) do|file|
291
- buffer = ''
292
- # Read the file 512 bytes at a time
293
- while not file.eof
294
- file.read(512, buffer)
295
- sha1.update(buffer)
296
- end
297
- end
298
- return sha1.to_s
299
- end
300
-
301
- def self.upload(objectname, filepath)
302
- # Generate hash of file
303
- hash = filehash filepath
304
-
305
- # Get hash of version already uploaded, if available.
306
- begin
307
- object = AWS::S3::S3Object.find objectname, $bucketname
308
- oldhash = object.metadata['hash']
309
- rescue AWS::S3::NoSuchKey
310
- # File not uploaded yet
311
- oldhash = nil
312
- end
313
- unless hash == oldhash
314
- # Don't reupload if file hasn't changed
315
- puts "#{objectname}: Uploading"
316
- AWS::S3::S3Object.store(objectname, open(filepath), $bucketname, access: :public_read, 'x-amz-meta-hash' => hash)
317
- else
318
- puts "#{objectname}: Not uploading, hasn't changed since last time."
319
- end
320
- end
321
-
322
-
323
-
324
49
 
325
50
  end
326
51
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: woody
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.0.12
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -90,6 +90,10 @@ files:
90
90
  - Rakefile
91
91
  - bin/woody
92
92
  - lib/woody.rb
93
+ - lib/woody/compiler.rb
94
+ - lib/woody/deployer.rb
95
+ - lib/woody/episode.rb
96
+ - lib/woody/generator.rb
93
97
  - lib/woody/version.rb
94
98
  - templates/episode.html
95
99
  - templates/iTunes.png