dropcaster 0.0.6 → 1.2.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.
- checksums.yaml +5 -5
- data/.gemnasium.yml +1 -0
- data/.gitignore +12 -14
- data/.rubocop.yml +34 -0
- data/.ruby-version +1 -0
- data/.travis.yml +20 -5
- data/CONTRIBUTING.md +18 -0
- data/Dockerfile +4 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +309 -65
- data/Guardfile +8 -6
- data/LICENSE.txt +1 -1
- data/README.markdown +43 -37
- data/Rakefile +46 -2
- data/{TODO → TODO.markdown} +0 -0
- data/VISION.markdown +52 -18
- data/Vagrantfile +10 -0
- data/bin/dropcaster +57 -53
- data/bin/lstags +29 -28
- data/dropcaster.gemspec +31 -20
- data/lib/dropcaster.rb +2 -15
- data/lib/dropcaster/channel.rb +54 -43
- data/lib/dropcaster/channel_file_locator.rb +8 -5
- data/lib/dropcaster/contributors.rb +39 -0
- data/lib/dropcaster/errors.rb +6 -4
- data/lib/dropcaster/item.rb +20 -14
- data/lib/dropcaster/log_formatter.rb +10 -0
- data/lib/dropcaster/logging.rb +13 -0
- data/lib/dropcaster/version.rb +3 -1
- data/templates/channel.html.erb +3 -6
- data/templates/channel.rss.erb +6 -5
- data/test/Vagrantfile +3 -1
- data/test/bin/vagrant-status +37 -31
- data/test/extensions/windows.rb +3 -1
- data/test/fixtures/extension.MP3 +0 -0
- data/test/fixtures/special &.mp3 +0 -0
- data/test/fixtures/test_template.json.erb +3 -4
- data/test/helper.rb +4 -1
- data/test/unit/test_app.rb +29 -24
- data/test/unit/test_channel.rb +9 -5
- data/test/unit/test_channel_locator.rb +8 -5
- data/test/unit/test_channel_xml.rb +29 -9
- data/test/unit/{test_item.rb → test_itunes_item.rb} +5 -6
- data/website/.gitignore +2 -0
- data/website/README.markdown +8 -0
- data/website/_config.yml +14 -0
- data/website/_front_matter/contributing.yaml +5 -0
- data/website/_front_matter/index.yaml +3 -0
- data/website/_front_matter/vision.yaml +5 -0
- data/website/_includes/footer.html +55 -0
- data/website/_includes/head.html +11 -0
- data/website/_includes/header.html +27 -0
- data/website/_layouts/default.html +20 -0
- data/website/_layouts/page.html +14 -0
- data/website/_layouts/post.html +15 -0
- data/website/_sass/_base.scss +204 -0
- data/website/_sass/_layout.scss +236 -0
- data/website/_sass/_syntax-highlighting.scss +67 -0
- data/website/css/main.scss +49 -0
- data/website/deploy.sh +23 -0
- data/website/feed.xml +30 -0
- metadata +150 -23
data/lib/dropcaster/errors.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dropcaster
|
2
4
|
class ConfigurationError < StandardError
|
3
5
|
def initialize(msg)
|
@@ -6,14 +8,14 @@ module Dropcaster
|
|
6
8
|
end
|
7
9
|
|
8
10
|
class MissingAttributeError < ConfigurationError
|
9
|
-
def initialize(
|
10
|
-
super("#{
|
11
|
+
def initialize(missing_attribute)
|
12
|
+
super("#{missing_attribute} is a mandatory channel attribute, but it is missing.")
|
11
13
|
end
|
12
14
|
end
|
13
15
|
|
14
16
|
class AmbiguousSourcesError < ConfigurationError
|
15
|
-
def initialize(
|
16
|
-
super("The list of sources is ambiguous. Can't derive common directory from these: #{
|
17
|
+
def initialize(ambiguous_sources)
|
18
|
+
super("The list of sources is ambiguous. Can't derive common directory from these: #{ambiguous_sources.inspect}")
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
data/lib/dropcaster/item.rb
CHANGED
@@ -1,31 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pathname'
|
1
4
|
require 'mp3info'
|
2
5
|
require 'digest/sha1'
|
6
|
+
require 'dropcaster/logging'
|
3
7
|
|
4
8
|
module Dropcaster
|
5
9
|
class Item
|
6
|
-
|
7
|
-
|
10
|
+
include Logging
|
11
|
+
|
12
|
+
attr_reader :file_path, :tag, :tag2, :duration, :file_size, :uuid, :pub_date, :lyrics
|
13
|
+
attr_accessor :image_url, :url, :keywords
|
8
14
|
|
9
|
-
def initialize(file_path, options
|
10
|
-
Mp3Info.open(file_path){|mp3info|
|
11
|
-
@
|
15
|
+
def initialize(file_path, options=nil)
|
16
|
+
Mp3Info.open(file_path) { |mp3info|
|
17
|
+
@file_path = Pathname.new(File.expand_path(file_path)).relative_path_from(Pathname.new(Dir.pwd)).cleanpath
|
12
18
|
@tag = mp3info.tag
|
13
19
|
@tag2 = mp3info.tag2
|
14
20
|
@duration = mp3info.length
|
15
|
-
if @tag2[
|
16
|
-
@lyrics = {}
|
17
|
-
@tag2[
|
21
|
+
if @tag2['ULT']
|
22
|
+
@lyrics = {}
|
23
|
+
@tag2['ULT'].split(/\x00/).drop(1).each_slice(2) { |k, v| @lyrics[k] = v }
|
18
24
|
end
|
19
25
|
}
|
20
26
|
|
21
|
-
@file_size = File.new(
|
22
|
-
@uuid = Digest::SHA1.hexdigest(File.read(
|
27
|
+
@file_size = File.new(file_path).stat.size
|
28
|
+
@uuid = Digest::SHA1.hexdigest(File.read(file_path))
|
23
29
|
|
24
|
-
|
25
|
-
|
30
|
+
if tag2.TRDA.blank?
|
31
|
+
logger.info("#{file_path} has no pub date set, using the file's modification time")
|
32
|
+
@pub_date = Time.parse(File.new(file_path).mtime.to_s)
|
26
33
|
else
|
27
|
-
|
28
|
-
@pub_date = DateTime.parse(File.new(file_name).mtime.to_s)
|
34
|
+
@pub_date = Time.parse(tag2.TRDA)
|
29
35
|
end
|
30
36
|
end
|
31
37
|
end
|
@@ -1,6 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'logger'
|
2
4
|
|
3
5
|
module Dropcaster
|
6
|
+
module Logging
|
7
|
+
attr_writer :logger
|
8
|
+
|
9
|
+
def logger
|
10
|
+
@logger ||= NullLogger.new
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
4
14
|
class LogFormatter < Logger::Formatter
|
5
15
|
def call(severity, time, program_name, message)
|
6
16
|
"#{severity}: #{message}\n"
|
data/lib/dropcaster/version.rb
CHANGED
data/templates/channel.html.erb
CHANGED
@@ -26,12 +26,9 @@
|
|
26
26
|
<h1>Episodes</h1>
|
27
27
|
<% items.each{|item| %>
|
28
28
|
<div class="item" id="<%= h(item.uuid) %>">
|
29
|
-
<h1><%= item.tag.title || item.
|
30
|
-
<% unless item.tag2.
|
31
|
-
<
|
32
|
-
<% end %>
|
33
|
-
<% unless item.tag2.TT3.blank? %>
|
34
|
-
<p><%= h(item.tag2.TT3) %></p>
|
29
|
+
<h1><%= h(item.tag.title || item.file_path.to_s) %></h1>
|
30
|
+
<% unless item.tag2.TT3.blank? && item.tag2.TIT3.blank? %>
|
31
|
+
<p><%= h(item.tag2.TT3 || item.tag2.TIT3) %></p>
|
35
32
|
<% end %>
|
36
33
|
<img src="<%= item.image_url %>"/>
|
37
34
|
<p>Download: <a href="<%= item.url %>">MP3</a> (<%= humanize_time(item.duration.to_i) %>, <%= humanize_size(item.file_size) %>)</p>
|
data/templates/channel.rss.erb
CHANGED
@@ -45,14 +45,15 @@
|
|
45
45
|
<% end %>
|
46
46
|
<% items.each{|item| %>
|
47
47
|
<item>
|
48
|
-
<title><%= item.tag.title || item.
|
49
|
-
<itunes:author><%= h(item.
|
50
|
-
<% unless item.tag2.TT3.blank? %>
|
51
|
-
<itunes:subtitle><%= h(truncate(item.tag2.TT3, 50)) %></itunes:subtitle>
|
52
|
-
<itunes:summary><%= h(item.tag2.TT3) %></itunes:summary>
|
48
|
+
<title><%= h(item.tag.title || item.file_path.to_s) %></title>
|
49
|
+
<itunes:author><%= h(item.tag.artist) %></itunes:author>
|
50
|
+
<% unless item.tag2.TT3.blank? && item.tag2.TIT3.blank? %>
|
51
|
+
<itunes:subtitle><%= h(truncate(item.tag2.TT3 || item.tag2.TIT3, 50)) %></itunes:subtitle>
|
52
|
+
<itunes:summary><%= h(item.tag2.TT3 || item.tag2.TIT3) %></itunes:summary>
|
53
53
|
<% end %>
|
54
54
|
<itunes:image href="<%= item.image_url %>"/>
|
55
55
|
<enclosure url="<%= item.url %>" length="<%= item.file_size %>" type="audio/mp3"/>
|
56
|
+
<link><%= item.url %></link>
|
56
57
|
<guid isPermaLink="false"><%= h(item.uuid) %></guid>
|
57
58
|
<pubDate><%= h(item.pub_date.to_formatted_s(:rfc822)) %></pubDate>
|
58
59
|
<itunes:duration><%= item.duration.to_i %></itunes:duration>
|
data/test/Vagrantfile
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# -*- mode: ruby -*-
|
2
4
|
# vi: set ft=ruby :
|
3
5
|
|
@@ -9,7 +11,7 @@ Vagrant.configure(2) do |config|
|
|
9
11
|
vb.memory = '256'
|
10
12
|
end
|
11
13
|
|
12
|
-
%w
|
14
|
+
%w[1.9.1 2.0 2.1 2.2].each do |version|
|
13
15
|
ruby = "ruby#{version}"
|
14
16
|
name = "ruby-#{version.tr('.', '-')}"
|
15
17
|
|
data/test/bin/vagrant-status
CHANGED
@@ -1,15 +1,22 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
3
4
|
require 'csv'
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
'
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
HEADERS = [
|
7
|
+
# Unix timestamp in UTC of when the message was printed.
|
8
|
+
'timestamp',
|
9
|
+
# is the target of the following output. This is empty if the message is related to Vagrant globally. Otherwise, this is generally a machine name so you can relate output to a
|
10
|
+
# specific machine when multi-VM is in use.
|
11
|
+
'target',
|
12
|
+
# is the type of machine-readable message being outputted. There are a set of standard types which are covered later.
|
13
|
+
'type',
|
14
|
+
# is zero or more comma-separated values associated with the prior type. The exact amount and meaning of this data is
|
15
|
+
# type-dependent, so you must read the documentation associated with the type to understand fully.
|
16
|
+
'data'
|
17
|
+
].freeze
|
11
18
|
|
12
|
-
|
19
|
+
TYPES = [
|
13
20
|
'box-name', # Name of a box installed into Vagrant.
|
14
21
|
'box-provider', # Provider for an installed box.
|
15
22
|
'cli-command', # A subcommand of vagrant that is available.
|
@@ -17,8 +24,8 @@ types = [
|
|
17
24
|
'provider-name', # The provider name of the target machine. targeted
|
18
25
|
'state', # The state ID of the target machine. targeted
|
19
26
|
'state-human-long', # Human-readable description of the state of the machine. This is the long version, and may be a paragraph or longer. targeted
|
20
|
-
'state-human-short'
|
21
|
-
]
|
27
|
+
'state-human-short' # Human-readable description of the state of the machine. This is the short version, limited to at most a sentence. targeted
|
28
|
+
].freeze
|
22
29
|
|
23
30
|
module Vagrant
|
24
31
|
Box = Struct.new(:name, :provider)
|
@@ -40,31 +47,30 @@ virtual_machines = Hash.new do |vms, target|
|
|
40
47
|
vms[target] = Vagrant::VM.new(target)
|
41
48
|
end
|
42
49
|
|
43
|
-
CSV.new(ARGF, headers:
|
50
|
+
CSV.new(ARGF, headers: HEADERS).each do |message|
|
44
51
|
vm = virtual_machines[message['target']]
|
45
52
|
data = message['data'].split('%!(VAGRANT_COMMA)')
|
46
53
|
|
47
54
|
case message['type']
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
55
|
+
when 'box-name'
|
56
|
+
vm.box.name = data
|
57
|
+
when 'box-provider'
|
58
|
+
vm.box.provider = data
|
59
|
+
when 'state'
|
60
|
+
vm.state.id = data
|
61
|
+
when 'state-human-long'
|
62
|
+
vm.state.long = data
|
63
|
+
when 'state-human-short'
|
64
|
+
vm.state.short = data
|
65
|
+
when 'cli-command'
|
66
|
+
vm.command = data
|
67
|
+
when 'error-exit'
|
68
|
+
vm.error = Vagrant::Error.new(data[0], data[1])
|
69
|
+
when 'provider-name'
|
70
|
+
vm.provider = data
|
71
|
+
else
|
72
|
+
raise "Unknown type: #{message['type']}"
|
66
73
|
end
|
67
74
|
end
|
68
75
|
|
69
|
-
puts
|
70
|
-
#puts virtual_machines.map{|name, vm| "#{name}: #{vm.state.short}"}
|
76
|
+
puts(virtual_machines.map { |name, _| name })
|
data/test/extensions/windows.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Returns true if we run on a windows platform
|
2
4
|
#
|
3
5
|
# Sample:
|
@@ -7,6 +9,6 @@
|
|
7
9
|
# http://snippets.dzone.com/posts/show/2112
|
8
10
|
#
|
9
11
|
def Kernel.is_windows?
|
10
|
-
|
12
|
+
_, platform, _ = RUBY_PLATFORM.split('-')
|
11
13
|
platform == 'mingw32'
|
12
14
|
end
|
Binary file
|
Binary file
|
@@ -19,10 +19,9 @@
|
|
19
19
|
"categories": ["<% categories.join('\",\"') %>"],
|
20
20
|
"explicit" : "<%= explicit %>",
|
21
21
|
"items" : [<% items.collect{|item| %>{
|
22
|
-
"title" : "<%= item.tag.title
|
23
|
-
"author" : "<%= item.
|
24
|
-
"
|
25
|
-
"summary" : "<%= item.tag2.TT3 %>",
|
22
|
+
"title" : "<%= item.tag.title %>",
|
23
|
+
"author" : "<%= item.tag.artist %>",
|
24
|
+
"summary" : "<%= item.tag2.TT3 || item.tag2.TIT3 %>",
|
26
25
|
"image" : "<%= item.image_url %>",
|
27
26
|
"enclosure" : {
|
28
27
|
"url" : "<%= item.url %>",
|
data/test/helper.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
gem 'minitest'
|
2
4
|
require 'minitest/autorun'
|
3
5
|
require 'dropcaster'
|
@@ -7,5 +9,6 @@ require_relative 'extensions/windows'
|
|
7
9
|
module DropcasterTest
|
8
10
|
FIXTURES_DIR = File.join(File.dirname(__FILE__), 'fixtures')
|
9
11
|
FIXTURE_ITUNES_MP3 = File.join(FIXTURES_DIR, 'iTunes.mp3')
|
10
|
-
|
12
|
+
NUMBER_OF_MP3_FILES = 3
|
13
|
+
NS_ITUNES = 'itunes:http://www.itunes.com/dtds/podcast-1.0.dtd'
|
11
14
|
end
|
data/test/unit/test_app.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'helper'
|
2
4
|
require 'open3'
|
3
5
|
require 'uri'
|
@@ -14,24 +16,24 @@ class TestApp < TestChannelXML
|
|
14
16
|
APP_SCRIPT = 'ruby bin/dropcaster'
|
15
17
|
|
16
18
|
def channel_rss
|
17
|
-
|
19
|
+
`#{APP_SCRIPT} #{FIXTURES_DIR}`
|
18
20
|
end
|
19
21
|
|
20
22
|
def test_overwrite_title
|
21
23
|
test_title = 'Alice and Bob in Wonderland'
|
22
|
-
channel = channel_node(
|
24
|
+
channel = channel_node(`#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --title '#{test_title}'`)
|
23
25
|
assert_equal(test_title, channel.find('title').first.content)
|
24
26
|
end
|
25
27
|
|
26
28
|
def test_overwrite_subtitle
|
27
29
|
test_subtitle = 'Tales from another world that is upside down'
|
28
|
-
channel = channel_node(
|
30
|
+
channel = channel_node(`#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --subtitle '#{test_subtitle}'`)
|
29
31
|
assert_equal(test_subtitle, channel.find('itunes:subtitle').first.content)
|
30
32
|
end
|
31
33
|
|
32
34
|
def test_overwrite_link
|
33
35
|
test_link = 'http://www.example.com/foo/bar'
|
34
|
-
channel = channel_node(
|
36
|
+
channel = channel_node(`#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --url '#{test_link}'`)
|
35
37
|
assert_equal(test_link, channel.find('link').first.content)
|
36
38
|
end
|
37
39
|
|
@@ -39,14 +41,14 @@ class TestApp < TestChannelXML
|
|
39
41
|
test_link_base = 'http://www.dropbox.com/foo/bar/'
|
40
42
|
test_link_file = 'index.html'
|
41
43
|
test_link = "#{test_link_base}#{test_link_file}"
|
42
|
-
channel = channel_node(
|
44
|
+
channel = channel_node(`#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --url '#{test_link}'`)
|
43
45
|
assert_equal(test_link, channel.find('link').first.content)
|
44
46
|
|
45
47
|
options = YAML.load_file(File.join(FIXTURES_DIR, Dropcaster::CHANNEL_YML))
|
46
48
|
assert_equal(URI.join(test_link_base, options[:image_url]).to_s, channel.find('itunes:image').first['href'])
|
47
49
|
|
48
50
|
# check that the item URLs are correct, too
|
49
|
-
item = channel.find(
|
51
|
+
item = channel.find('item').first
|
50
52
|
assert(item)
|
51
53
|
|
52
54
|
# enclosure
|
@@ -59,42 +61,43 @@ class TestApp < TestChannelXML
|
|
59
61
|
end
|
60
62
|
|
61
63
|
def test_dir_only
|
62
|
-
channel
|
63
|
-
assert_equal(1, channel.find('item').size)
|
64
|
+
assert_equal(NUMBER_OF_MP3_FILES, @channel.find('item').size)
|
64
65
|
end
|
65
66
|
|
66
67
|
def test_overwrite_enclosures_url
|
67
68
|
test_enclosures_url = 'http://www.example.com/foo/bar/episodes/'
|
68
|
-
channel = channel_node(
|
69
|
-
item = channel.find(
|
69
|
+
channel = channel_node(`#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --enclosures '#{test_enclosures_url}'`)
|
70
|
+
item = channel.find('item').first
|
70
71
|
assert(item)
|
71
72
|
enclosure = item.find('enclosure').first
|
72
73
|
assert(enclosure)
|
73
|
-
assert_equal(URI.join(test_enclosures_url,'test/fixtures/iTunes.mp3').to_s, enclosure['url'])
|
74
|
+
assert_equal(URI.join(test_enclosures_url, 'test/fixtures/iTunes.mp3').to_s, enclosure['url'])
|
74
75
|
end
|
75
76
|
|
76
77
|
def test_overwrite_image_url
|
77
78
|
test_image_url = 'http://www.example.com/foo/bar/override.gif'
|
78
|
-
channel = channel_node(
|
79
|
+
channel = channel_node(`#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --image '#{test_image_url}'`)
|
79
80
|
assert_equal(test_image_url, channel.find('itunes:image').first['href'])
|
80
81
|
|
81
82
|
# Make sure the items pick up this URL, too
|
82
|
-
item = channel.find(
|
83
|
+
item = channel.find('item').first
|
83
84
|
assert(item)
|
84
85
|
assert_equal(test_image_url, item.find('itunes:image').first['href'])
|
85
86
|
end
|
86
87
|
|
87
88
|
def test_overwrite_description
|
88
89
|
test_description = 'Testing commandline apps is not that hard.'
|
89
|
-
channel = channel_node(
|
90
|
+
channel = channel_node(`#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --description '#{test_description}'`)
|
90
91
|
assert_equal(test_description, channel.find('description').first.content)
|
91
92
|
assert_equal(test_description, channel.find('itunes:summary', NS_ITUNES).first.content)
|
92
93
|
end
|
93
94
|
|
94
95
|
def test_no_channel_file
|
95
|
-
|
96
|
-
|
97
|
-
|
96
|
+
unless Kernel.is_windows?
|
97
|
+
Open3.popen3(APP_SCRIPT) { |stdin, stdout, stderr|
|
98
|
+
assert_match(/ERROR: No channel file found/, stderr.read)
|
99
|
+
}
|
100
|
+
end
|
98
101
|
end
|
99
102
|
|
100
103
|
def test_overwrite_all
|
@@ -102,7 +105,7 @@ class TestApp < TestChannelXML
|
|
102
105
|
test_link = 'http://www.example.com/bar/foot'
|
103
106
|
test_description = 'Testing commandline apps is really not that hard.'
|
104
107
|
|
105
|
-
channel = channel_node(
|
108
|
+
channel = channel_node(`#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --title '#{test_title}' --url '#{test_link}' --description '#{test_description}'`)
|
106
109
|
|
107
110
|
assert_equal(test_title, channel.find('title').first.content)
|
108
111
|
assert_equal(test_link, channel.find('link').first.content)
|
@@ -111,9 +114,11 @@ class TestApp < TestChannelXML
|
|
111
114
|
end
|
112
115
|
|
113
116
|
def test_channel_template_not_found
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
+
unless Kernel.is_windows?
|
118
|
+
Open3.popen3("#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --channel-template foo/bar/42") { |stdin, stdout, stderr|
|
119
|
+
assert_match(/Unable to load template file/, stderr.read)
|
120
|
+
}
|
121
|
+
end
|
117
122
|
end
|
118
123
|
|
119
124
|
#
|
@@ -121,9 +126,9 @@ class TestApp < TestChannelXML
|
|
121
126
|
#
|
122
127
|
def test_overwrite_channel_template
|
123
128
|
channel_template = File.join(FIXTURES_DIR, 'test_template.json.erb')
|
124
|
-
channel = JSON.parse(
|
125
|
-
assert_equal(
|
129
|
+
channel = JSON.parse(`#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --channel-template #{channel_template}`)
|
130
|
+
assert_equal('All About Everything', channel['channel']['title'])
|
126
131
|
end
|
127
132
|
|
128
|
-
# TODO --channel
|
133
|
+
# TODO: --channel
|
129
134
|
end
|