dropcaster 0.0.8 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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(missingAttribute)
10
- super("#{missingAttribute} is a mandatory channel attribute, but it is missing.")
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(ambiguousSources)
16
- super("The list of sources is ambiguous. Can't derive common directory from these: #{ambiguousSources.inspect}")
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
 
@@ -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
- attr_reader :file_name, :tag, :tag2, :duration, :file_size, :uuid, :pub_date, :pub_date, :lyrics
10
+ include Logging
11
+
12
+ attr_reader :file_path, :tag, :tag2, :duration, :file_size, :uuid, :pub_date, :lyrics
7
13
  attr_accessor :artist, :image_url, :url, :keywords
8
14
 
9
- def initialize(file_path, options = nil)
10
- Mp3Info.open(file_path){|mp3info|
11
- @file_name = Pathname.new(File.expand_path(file_path)).relative_path_from(Pathname.new(Dir.pwd)).cleanpath.to_s
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["ULT"]
16
- @lyrics = {};
17
- @tag2["ULT"].split(/\x00/).drop(1).each_slice(2) { |k, v| @lyrics[k] = v }
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(@file_name).stat.size
22
- @uuid = Digest::SHA1.hexdigest(File.read(file_name))
27
+ @file_size = File.new(file_path).stat.size
28
+ @uuid = Digest::SHA1.hexdigest(File.read(file_path))
23
29
 
24
- unless tag2.TDR.blank?
25
- @pub_date = DateTime.parse(tag2.TDR)
30
+ if tag2.TDR.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
- Dropcaster.logger.info("#{file_path} has no pub date set, using the file's modification time")
28
- @pub_date = DateTime.parse(File.new(file_name).mtime.to_s)
34
+ @pub_date = Time.parse(tag2.TDR)
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"
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'null_logger'
4
+
5
+ module Dropcaster
6
+ module Logging
7
+ attr_writer :logger
8
+
9
+ def logger
10
+ @logger ||= NullLogger.new
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dropcaster
2
- VERSION = '0.0.8'
4
+ VERSION = '1.0.0'
3
5
  end
data/lib/dropcaster.rb CHANGED
@@ -1,17 +1,12 @@
1
- $:.unshift File.dirname(__FILE__)
1
+ # frozen_string_literal: true
2
2
 
3
- require 'rubygems'
4
- require 'bundler/setup'
3
+ $LOAD_PATH.unshift File.dirname(__FILE__)
5
4
 
6
5
  require 'yaml'
7
6
  require 'active_support/core_ext/date_time/conversions'
8
7
  require 'active_support/core_ext/object/blank'
9
- require 'active_support/core_ext/module/attribute_accessors'
10
-
11
- require 'logger'
12
8
 
13
9
  require 'dropcaster/errors'
14
- require 'dropcaster/log_formatter'
15
10
  require 'dropcaster/channel'
16
11
  require 'dropcaster/item'
17
12
  require 'dropcaster/channel_file_locator'
@@ -19,12 +14,4 @@ require 'dropcaster/version'
19
14
 
20
15
  module Dropcaster
21
16
  CHANNEL_YML = 'channel.yml'
22
-
23
- mattr_accessor :logger
24
-
25
- unless @@logger
26
- @@logger = Logger.new(STDERR)
27
- @@logger.level = Logger::WARN
28
- @@logger.formatter = LogFormatter.new
29
- end
30
17
  end
@@ -26,7 +26,7 @@
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.tag2.TIT2%></h1>
29
+ <h1><%= h(item.tag.title || item.tag2.TIT2 || item.file_path.to_s) %></h1>
30
30
  <% unless item.tag2.SUBTITLE.blank? %>
31
31
  <h2><%= h(item.tag2.SUBTITLE) %></h2>
32
32
  <% end %>
@@ -45,7 +45,7 @@
45
45
  <% end %>
46
46
  <% items.each{|item| %>
47
47
  <item>
48
- <title><%= item.tag.title || item.tag2.TIT2 || item.file_name%></title>
48
+ <title><%= h(item.tag.title || item.tag2.TIT2 || item.file_path.to_s) %></title>
49
49
  <itunes:author><%= h(item.tag2.TP1 || item.tag2.TPE1) %></itunes:author>
50
50
  <% unless item.tag2.TT3.blank? %>
51
51
  <itunes:subtitle><%= h(truncate(item.tag2.TT3, 50)) %></itunes:subtitle>
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(1.9.1 2.0 2.1 2.2).each do |version|
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
 
@@ -1,15 +1,22 @@
1
1
  #!/usr/bin/env ruby
2
- #
2
+ # frozen_string_literal: true
3
+
3
4
  require 'csv'
4
5
 
5
- headers = [
6
- 'timestamp', # is a Unix timestamp in UTC of when the message was printed.
7
- 'target', # 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 specific machine when multi-VM is in use.
8
- 'type', # is the type of machine-readable message being outputted. There are a set of standard types which are covered later.
9
- 'data', # is zero or more comma-separated values associated with the prior type. The exact amount and meaning of this data is type-dependent, so you must read the documentation associated with the type to understand fully.
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
- types = [
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.
@@ -18,7 +25,7 @@ types = [
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
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
21
- ]
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: headers).each do |message|
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
- when 'box-name'
49
- vm.box.name = data
50
- when 'box-provider'
51
- vm.box.provider = data
52
- when 'state'
53
- vm.state.id = data
54
- when 'state-human-long'
55
- vm.state.long = data
56
- when 'state-human-short'
57
- vm.state.short = data
58
- when 'cli-command'
59
- vm.command = data
60
- when 'error-exit'
61
- vm.error = Vagrant::Error.new(data[0], data[1])
62
- when 'provider-name'
63
- vm.provider = data
64
- else
65
- raise "Unknown type: #{message['type']}"
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 virtual_machines.map{|name, vm| name}
70
- #puts virtual_machines.map{|name, vm| "#{name}: #{vm.state.short}"}
76
+ puts(virtual_machines.map { |name, _| name })
@@ -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
- processor, platform, *rest = RUBY_PLATFORM.split("-")
12
+ _, platform, _ = RUBY_PLATFORM.split('-')
11
13
  platform == 'mingw32'
12
14
  end
Binary file
Binary file
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
- NS_ITUNES = "itunes:http://www.itunes.com/dtds/podcast-1.0.dtd"
12
+ NUMBER_OF_MP3_FILES = 3
13
+ NS_ITUNES = 'itunes:http://www.itunes.com/dtds/podcast-1.0.dtd'
11
14
  end
@@ -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
- %x[#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3}]
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(%x[#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --title '#{test_title}'])
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(%x[#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --subtitle '#{test_subtitle}'])
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(%x[#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --url '#{test_link}'])
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(%x[#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --url '#{test_link}'])
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("item").first
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 = channel_node(%x[#{APP_SCRIPT} #{FIXTURES_DIR}])
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(%x[#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --enclosures '#{test_enclosures_url}'])
69
- item = channel.find("item").first
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(%x[#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --image '#{test_image_url}'])
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("item").first
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(%x[#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --description '#{test_description}'])
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
- Open3.popen3(APP_SCRIPT){|stdin, stdout, stderr|
96
- assert_match(/ERROR: No channel file found/, stderr.read)
97
- } unless Kernel.is_windows?
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(%x[#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --title '#{test_title}' --url '#{test_link}' --description '#{test_description}'])
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
- Open3.popen3("#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --channel-template foo/bar/42"){|stdin, stdout, stderr|
115
- assert_match(/Unable to load template file/, stderr.read)
116
- } unless Kernel.is_windows?
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(%x[#{APP_SCRIPT} #{FIXTURE_ITUNES_MP3} --channel-template #{channel_template}])
125
- assert_equal("All About Everything", channel['channel']['title'])
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'helper'
2
4
 
3
5
  class TestChannel < MiniTest::Test
@@ -9,7 +11,7 @@ class TestChannel < MiniTest::Test
9
11
  end
10
12
 
11
13
  def test_item_count
12
- assert_equal(1, @channel.items.size)
14
+ assert_equal(NUMBER_OF_MP3_FILES, @channel.items.size)
13
15
  end
14
16
 
15
17
  def test_channel
@@ -47,7 +49,9 @@ class TestChannel < MiniTest::Test
47
49
  end
48
50
 
49
51
  def test_channel_explicit_nil
50
- assert_channel_explicit(nil, nil)
52
+ @options[:explicit] = nil
53
+ channel = Dropcaster::Channel.new(FIXTURES_DIR, @options)
54
+ assert_nil(channel.explicit)
51
55
  end
52
56
 
53
57
  def test_channel_explicit_clean
@@ -62,19 +66,19 @@ class TestChannel < MiniTest::Test
62
66
 
63
67
  def test_raise_on_missing_title
64
68
  assert_raises Dropcaster::MissingAttributeError do
65
- Dropcaster::Channel.new(FIXTURES_DIR, {:url => 'bar', :description => 'foobar'})
69
+ Dropcaster::Channel.new(FIXTURES_DIR, { url: 'bar', description: 'foobar' })
66
70
  end
67
71
  end
68
72
 
69
73
  def test_raise_on_missing_url
70
74
  assert_raises Dropcaster::MissingAttributeError do
71
- Dropcaster::Channel.new(FIXTURES_DIR, {:title => 'foo', :description => 'foobar'})
75
+ Dropcaster::Channel.new(FIXTURES_DIR, { title: 'foo', description: 'foobar' })
72
76
  end
73
77
  end
74
78
 
75
79
  def test_raise_on_missing_description
76
80
  assert_raises Dropcaster::MissingAttributeError do
77
- Dropcaster::Channel.new(FIXTURES_DIR, {:title => 'foo', :url => 'bar'})
81
+ Dropcaster::Channel.new(FIXTURES_DIR, { title: 'foo', url: 'bar' })
78
82
  end
79
83
  end
80
84
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'helper'
2
4
  require 'tmpdir'
3
5
  require 'pry'
@@ -8,6 +10,7 @@ class TestChannelLocator < MiniTest::Test
8
10
  def setup
9
11
  @temp_dir = Dir.mktmpdir
10
12
  end
13
+
11
14
  def teardown
12
15
  FileUtils.remove_entry_secure(@temp_dir)
13
16
  end
@@ -30,7 +33,7 @@ class TestChannelLocator < MiniTest::Test
30
33
  end
31
34
 
32
35
  def test_array_of_files_same_dir
33
- sources = Array.new
36
+ sources = []
34
37
  sources << File.join(@temp_dir, 'file1.mp3')
35
38
  sources << File.join(@temp_dir, 'file2.mp3')
36
39
  sources << File.join(@temp_dir, 'file3.mp3')
@@ -39,7 +42,7 @@ class TestChannelLocator < MiniTest::Test
39
42
  end
40
43
 
41
44
  def test_array_of_files_different_dir
42
- sources = Array.new
45
+ sources = []
43
46
  sources << File.join(@temp_dir, 'foo', 'file1.mp3')
44
47
  sources << File.join(@temp_dir, 'bar', 'file1.mp3')
45
48
  sources << File.join(@temp_dir, 'baz', 'file1.mp3')
@@ -54,9 +57,9 @@ class TestChannelLocator < MiniTest::Test
54
57
  end
55
58
 
56
59
  def test_array_with_more_than_a_single_directory
57
- Dir.mktmpdir{|tmp_dir1|
58
- Dir.mktmpdir{|tmp_dir2|
59
- sources = Array.new
60
+ Dir.mktmpdir { |tmp_dir1|
61
+ Dir.mktmpdir { |tmp_dir2|
62
+ sources = []
60
63
  sources << File.join(tmp_dir1, 'another_dir')
61
64
  sources << File.join(tmp_dir2, 'another_dir')
62
65
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'helper'
2
4
  require 'xml/libxml'
3
5
  require 'pry'
@@ -14,7 +16,7 @@ class TestChannelXML < MiniTest::Test
14
16
  # Returnes the XML node for the channel passed as XML string
15
17
  #
16
18
  def channel_node(rss)
17
- XML::Document.string(rss).find("//rss/channel").first
19
+ XML::Document.string(rss).find('//rss/channel').first
18
20
  end
19
21
 
20
22
  #
@@ -27,11 +29,10 @@ class TestChannelXML < MiniTest::Test
27
29
  Dropcaster::Channel.new(FIXTURES_DIR, @options.dup).to_rss
28
30
  end
29
31
 
30
- def test_item
31
- item = @channel.find("item").first
32
+ def test_itunes_item
33
+ item = @channel.find('item[title = "iTunes Name"]').first
32
34
  assert(item)
33
35
 
34
- assert_equal('iTunes Name', item.find('title').first.content)
35
36
  assert_equal('iTunes Artist', item.find('itunes:author', NS_ITUNES).first.content)
36
37
  assert_equal('iTunes Description (Video Pane)', item.find('itunes:summary', NS_ITUNES).first.content)
37
38
  assert_equal('http://www.example.com/podcasts/everything/AllAboutEverything.jpg', item.find('itunes:image', NS_ITUNES).first['href'])
@@ -51,12 +52,31 @@ class TestChannelXML < MiniTest::Test
51
52
  assert_equal('3', item.find('itunes:duration', NS_ITUNES).first.content)
52
53
  end
53
54
 
55
+ def test_special_ampersand_item
56
+ # in the actual XML, this is "special &amp;.mp3", but it gets interpreted by XML::Document
57
+ # if it was just "special &.mp3", it would be invalid XML and we wouldn't get this far
58
+ item = @channel.find('item[title = "test/fixtures/special &.mp3"]').first
59
+ assert(item)
60
+
61
+ enclosure = item.find('enclosure').first
62
+ assert(enclosure)
63
+ assert_equal('http://www.example.com/podcasts/everything/test/fixtures/special%20%26.mp3', enclosure['url'])
64
+ end
65
+
66
+ def test_uppercase_extension_item
67
+ item = @channel.find('item[title = "test/fixtures/extension.MP3"]').first
68
+ assert(item)
69
+
70
+ enclosure = item.find('enclosure').first
71
+ assert(enclosure)
72
+ assert_equal('http://www.example.com/podcasts/everything/test/fixtures/extension.MP3', enclosure['url'])
73
+ end
74
+
54
75
  def test_attributes_mandatory
55
- options = {:title => 'Test Channel',
56
- :url => 'http://www.example.com/',
57
- :description => 'A test channel',
58
- :enclosures_url => 'http://www.example.com/foo/bar',
59
- }
76
+ options = { title: 'Test Channel',
77
+ url: 'http://www.example.com/',
78
+ description: 'A test channel',
79
+ enclosures_url: 'http://www.example.com/foo/bar' }
60
80
 
61
81
  channel = channel_node(Dropcaster::Channel.new(FIXTURES_DIR, options).to_rss)
62
82
  assert_equal('Test Channel', channel.find('title').first.content)
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'helper'
2
4
 
3
- class TestItem < MiniTest::Test
5
+ class TestItunesItem < MiniTest::Test
4
6
  include DropcasterTest
5
7
 
6
8
  def setup
@@ -12,7 +14,7 @@ class TestItem < MiniTest::Test
12
14
  assert_equal(58119, @item.file_size)
13
15
  assert_equal('77bf84447c0f69ce4a33a18b0ae1e030b82010de', @item.uuid)
14
16
  assert_equal(File.mtime(FIXTURE_ITUNES_MP3).to_i, @item.pub_date.to_i)
15
- assert_equal('test/fixtures/iTunes.mp3', @item.file_name)
17
+ assert_equal('test/fixtures/iTunes.mp3', @item.file_path.to_s)
16
18
  end
17
19
 
18
20
  def test_tag