dropcaster 0.0.2 → 0.0.3
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.
- data/.document +5 -5
- data/Gemfile +11 -11
- data/Gemfile.lock +26 -26
- data/LICENSE.txt +20 -20
- data/README.md +155 -147
- data/Rakefile +47 -47
- data/TODO +14 -13
- data/VERSION +1 -1
- data/bin/dropcaster +117 -111
- data/bin/lstags +45 -45
- data/doc/sample-channel.yml +79 -77
- data/doc/sample-sidecar.yml +19 -19
- data/dropcaster.gemspec +88 -87
- data/lib/dropcaster/channel.rb +96 -86
- data/lib/dropcaster/channel_file_locator.rb +48 -48
- data/lib/dropcaster/errors.rb +25 -19
- data/lib/dropcaster/hashkeys.rb +12 -12
- data/lib/dropcaster/item.rb +43 -43
- data/lib/dropcaster.rb +18 -18
- data/templates/{channel.rss.erb → iTunes.rss.erb} +57 -57
- data/test/extensions/windows.rb +12 -0
- data/test/fixtures/channel.yml +13 -14
- data/test/helper.rb +14 -10
- data/test/unit/test_app.rb +84 -59
- data/test/unit/test_channel.rb +32 -32
- data/test/unit/test_channel_locator.rb +91 -91
- data/test/unit/test_channel_xml.rb +87 -69
- data/test/unit/test_item.rb +63 -61
- metadata +24 -19
@@ -1,69 +1,87 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'xml/libxml'
|
3
|
-
|
4
|
-
class TestChannelXML < Test::Unit::TestCase
|
5
|
-
include DropcasterTest
|
6
|
-
|
7
|
-
def setup
|
8
|
-
@options = YAML.load_file(File.join(FIXTURES_DIR, Dropcaster::CHANNEL_YML))
|
9
|
-
@channel =
|
10
|
-
end
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
assert_equal('
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
assert_equal('
|
48
|
-
|
49
|
-
assert_equal('
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
assert_equal(
|
54
|
-
assert_equal(
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
assert_equal(
|
66
|
-
|
67
|
-
assert_equal(
|
68
|
-
end
|
69
|
-
|
1
|
+
require 'helper'
|
2
|
+
require 'xml/libxml'
|
3
|
+
|
4
|
+
class TestChannelXML < Test::Unit::TestCase
|
5
|
+
include DropcasterTest
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@options = YAML.load_file(File.join(FIXTURES_DIR, Dropcaster::CHANNEL_YML))
|
9
|
+
@channel = channel_node(channel_rss)
|
10
|
+
end
|
11
|
+
|
12
|
+
#
|
13
|
+
# Returnes the XML node for the channel passed as XML string
|
14
|
+
#
|
15
|
+
def channel_node(rss)
|
16
|
+
XML::Document.string(rss).find("//rss/channel").first
|
17
|
+
end
|
18
|
+
|
19
|
+
#
|
20
|
+
# Returnes the channel under test as XML string
|
21
|
+
#
|
22
|
+
# Subclasses may overwrite this method in order to re-use the tests in this class, while
|
23
|
+
# constructing the XML string in a different way
|
24
|
+
#
|
25
|
+
def channel_rss
|
26
|
+
Dropcaster::Channel.new(FIXTURES_DIR, @options).to_rss
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_item
|
30
|
+
item = @channel.find("item").first
|
31
|
+
assert(item)
|
32
|
+
|
33
|
+
assert_equal('iTunes Name', item.find('title').first.content)
|
34
|
+
assert_equal('iTunes Artist', item.find('itunes:author', NS_ITUNES).first.content)
|
35
|
+
assert_equal('iTunes Description (Video Pane)', item.find('itunes:summary', NS_ITUNES).first.content)
|
36
|
+
assert_equal('http://www.example.com/podcasts/everything/AllAboutEverything.jpg', item.find('itunes:image', NS_ITUNES).first['href'])
|
37
|
+
|
38
|
+
enclosure = item.find('enclosure').first
|
39
|
+
assert(enclosure)
|
40
|
+
assert_equal('http://www.example.com/podcasts/everything/test/fixtures/iTunes.mp3', enclosure['url'])
|
41
|
+
assert_equal('58119', enclosure['length'])
|
42
|
+
assert_equal('audio/mp3', enclosure['type'])
|
43
|
+
|
44
|
+
guid = item.find('guid').first
|
45
|
+
assert(guid)
|
46
|
+
assert_equal('false', guid['isPermaLink'])
|
47
|
+
assert_equal('77bf84447c0f69ce4a33a18b0ae1e030b82010de', guid.content)
|
48
|
+
|
49
|
+
assert_equal('Sat, 01 Oct 2011 14:08:20 +0200', item.find('pubDate').first.content)
|
50
|
+
assert_equal('3', item.find('itunes:duration', NS_ITUNES).first.content)
|
51
|
+
|
52
|
+
# Not used in our fixture yet
|
53
|
+
# assert_equal('', item.find('itunes:subtitle', NS_ITUNES).first.content)
|
54
|
+
# assert_equal('', item.find('itunes:keywords', NS_ITUNES).first.content)
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_attributes_mandatory
|
58
|
+
options = {:title => 'Test Channel',
|
59
|
+
:url => 'http://www.example.com/',
|
60
|
+
:description => 'A test channel',
|
61
|
+
:enclosures_url => 'http://www.example.com/foo/bar',
|
62
|
+
}
|
63
|
+
|
64
|
+
channel = channel_node(Dropcaster::Channel.new(FIXTURES_DIR, options).to_rss)
|
65
|
+
assert_equal('Test Channel', channel.find('title').first.content)
|
66
|
+
assert_equal('http://www.example.com/', channel.find('link').first.content)
|
67
|
+
assert_equal('A test channel', channel.find('description').first.content)
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_attributes_complete
|
71
|
+
assert_equal(@options[:title], @channel.find('title').first.content)
|
72
|
+
assert_equal(@options[:url], @channel.find('link').first.content)
|
73
|
+
assert_equal(@options[:description], @channel.find('description').first.content)
|
74
|
+
assert_equal(@options[:subtitle], @channel.find('itunes:subtitle', NS_ITUNES).first.content)
|
75
|
+
assert_equal(@options[:language], @channel.find('language').first.content)
|
76
|
+
assert_equal(@options[:copyright], @channel.find('copyright').first.content)
|
77
|
+
assert_equal(@options[:author], @channel.find('itunes:author', NS_ITUNES).first.content)
|
78
|
+
|
79
|
+
owner = @channel.find('itunes:owner', NS_ITUNES).first
|
80
|
+
assert_equal(@options[:owner][:name], owner.find('itunes:name', NS_ITUNES).first.content)
|
81
|
+
assert_equal(@options[:owner][:email], owner.find('itunes:email', NS_ITUNES).first.content)
|
82
|
+
assert_equal(URI.join(@options[:url], @options[:image_url]).to_s, @channel.find('itunes:image', NS_ITUNES).first['href'])
|
83
|
+
|
84
|
+
# TODO :categories: ['Technology', 'Gadgets']
|
85
|
+
assert_equal(@options[:explicit], @channel.find('itunes:explicit', NS_ITUNES).first.content)
|
86
|
+
end
|
87
|
+
end
|
data/test/unit/test_item.rb
CHANGED
@@ -1,61 +1,63 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
class TestItem < Test::Unit::TestCase
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
assert_equal(
|
13
|
-
assert_equal('
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
assert_equal('iTunes
|
20
|
-
assert_equal('
|
21
|
-
assert_equal('iTunes
|
22
|
-
assert_equal(
|
23
|
-
assert_equal(
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
assert_equal('iTunes
|
30
|
-
assert_equal('iTunes
|
31
|
-
assert_equal('
|
32
|
-
assert_equal('iTunes Album
|
33
|
-
assert_equal('
|
34
|
-
assert_equal('
|
35
|
-
assert_equal('
|
36
|
-
assert_equal('
|
37
|
-
assert_equal('
|
38
|
-
assert_equal('iTunes
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestItem < Test::Unit::TestCase
|
4
|
+
include DropcasterTest
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@item = Dropcaster::Item.new(FIXTURE_ITUNES_MP3)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_basics
|
11
|
+
assert_in_delta(3, @item.duration, 0.005)
|
12
|
+
assert_equal(58119, @item.file_size)
|
13
|
+
assert_equal('77bf84447c0f69ce4a33a18b0ae1e030b82010de', @item.uuid)
|
14
|
+
assert_equal(1317470900, @item.pub_date.to_i)
|
15
|
+
assert_equal('test/fixtures/iTunes.mp3', @item.file_name)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_tag
|
19
|
+
assert_equal('iTunes Artist', @item.tag.artist)
|
20
|
+
assert_equal('iTunes Genre', @item.tag.genre_s)
|
21
|
+
assert_equal('iTunes Name', @item.tag.title)
|
22
|
+
assert_equal(' 00007032 00006EA2 0000A049 00009735 00000559 0000096E 00008000 00008000 00000017 00000017', @item.tag.comments)
|
23
|
+
assert_equal('iTunes Album', @item.tag.album)
|
24
|
+
assert_equal(1970, @item.tag.year)
|
25
|
+
assert_equal(42, @item.tag.tracknum)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_tag2
|
29
|
+
assert_equal('iTunes Artist', @item.tag2.TP1)
|
30
|
+
assert_equal('iTunes Genre', @item.tag2.TCO)
|
31
|
+
assert_equal('iTunes Name', @item.tag2.TT2)
|
32
|
+
assert_equal('iTunes Album', @item.tag2.TAL)
|
33
|
+
assert_equal('1970', @item.tag2.TYE)
|
34
|
+
assert_equal('iTunes Album Artist', @item.tag2.TP2)
|
35
|
+
assert_equal('111', @item.tag2.TBP)
|
36
|
+
assert_equal('42/99', @item.tag2.TRK)
|
37
|
+
assert_equal('11', @item.tag2.TPA)
|
38
|
+
assert_equal('iTunes Grouping', @item.tag2.TT1)
|
39
|
+
assert_equal('iTunes Description (Video Pane)', @item.tag2.TT3)
|
40
|
+
assert_equal('iTunes Composer', @item.tag2.TCM)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_lyrics
|
44
|
+
assert_equal(1, @item.lyrics.size)
|
45
|
+
assert_equal("iTunes Lyrics Line 1\niTunes Lyrics Line 2", @item.lyrics['eng'])
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_comment_remove_itunes_crap
|
49
|
+
item = Dropcaster::Item.new(FIXTURE_ITUNES_MP3, {:strip_itunes_private => true})
|
50
|
+
assert_equal('iTunes Comments (Info Pane)', item.tag2.COM[0])
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_comment_leave_itunes_crap
|
54
|
+
item = Dropcaster::Item.new(FIXTURE_ITUNES_MP3, {:strip_itunes_private => false})
|
55
|
+
assert_equal(' 00007032 00006EA2 0000A049 00009735 00000559 0000096E 00008000 00008000 00000017 00000017', item.tag2.COM[0])
|
56
|
+
assert_equal('iTunes Comments (Info Pane)', item.tag2.COM[1])
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_tag2_comment
|
60
|
+
assert_equal(' 00007032 00006EA2 0000A049 00009735 00000559 0000096E 00008000 00008000 00000017 00000017', @item.tag2.COM[0])
|
61
|
+
assert_equal('iTunes Comments (Info Pane)', @item.tag2.COM[1])
|
62
|
+
end
|
63
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dropcaster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- nerab
|
@@ -15,9 +15,11 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-10-
|
18
|
+
date: 2011-10-13 00:00:00 +02:00
|
19
|
+
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
22
|
+
type: :runtime
|
21
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
22
24
|
none: false
|
23
25
|
requirements:
|
@@ -27,11 +29,11 @@ dependencies:
|
|
27
29
|
segments:
|
28
30
|
- 0
|
29
31
|
version: "0"
|
30
|
-
version_requirements: *id001
|
31
32
|
name: ruby-mp3info
|
33
|
+
version_requirements: *id001
|
32
34
|
prerelease: false
|
33
|
-
type: :runtime
|
34
35
|
- !ruby/object:Gem::Dependency
|
36
|
+
type: :runtime
|
35
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
36
38
|
none: false
|
37
39
|
requirements:
|
@@ -41,11 +43,11 @@ dependencies:
|
|
41
43
|
segments:
|
42
44
|
- 0
|
43
45
|
version: "0"
|
44
|
-
version_requirements: *id002
|
45
46
|
name: activesupport
|
47
|
+
version_requirements: *id002
|
46
48
|
prerelease: false
|
47
|
-
type: :runtime
|
48
49
|
- !ruby/object:Gem::Dependency
|
50
|
+
type: :development
|
49
51
|
requirement: &id003 !ruby/object:Gem::Requirement
|
50
52
|
none: false
|
51
53
|
requirements:
|
@@ -57,11 +59,11 @@ dependencies:
|
|
57
59
|
- 0
|
58
60
|
- 0
|
59
61
|
version: 1.0.0
|
60
|
-
version_requirements: *id003
|
61
62
|
name: bundler
|
63
|
+
version_requirements: *id003
|
62
64
|
prerelease: false
|
63
|
-
type: :development
|
64
65
|
- !ruby/object:Gem::Dependency
|
66
|
+
type: :development
|
65
67
|
requirement: &id004 !ruby/object:Gem::Requirement
|
66
68
|
none: false
|
67
69
|
requirements:
|
@@ -73,11 +75,11 @@ dependencies:
|
|
73
75
|
- 6
|
74
76
|
- 4
|
75
77
|
version: 1.6.4
|
76
|
-
version_requirements: *id004
|
77
78
|
name: jeweler
|
79
|
+
version_requirements: *id004
|
78
80
|
prerelease: false
|
79
|
-
type: :development
|
80
81
|
- !ruby/object:Gem::Dependency
|
82
|
+
type: :development
|
81
83
|
requirement: &id005 !ruby/object:Gem::Requirement
|
82
84
|
none: false
|
83
85
|
requirements:
|
@@ -87,11 +89,11 @@ dependencies:
|
|
87
89
|
segments:
|
88
90
|
- 0
|
89
91
|
version: "0"
|
90
|
-
version_requirements: *id005
|
91
92
|
name: libxml-ruby
|
93
|
+
version_requirements: *id005
|
92
94
|
prerelease: false
|
93
|
-
type: :development
|
94
95
|
- !ruby/object:Gem::Dependency
|
96
|
+
type: :development
|
95
97
|
requirement: &id006 !ruby/object:Gem::Requirement
|
96
98
|
none: false
|
97
99
|
requirements:
|
@@ -101,15 +103,16 @@ dependencies:
|
|
101
103
|
segments:
|
102
104
|
- 0
|
103
105
|
version: "0"
|
104
|
-
version_requirements: *id006
|
105
106
|
name: rdoc
|
107
|
+
version_requirements: *id006
|
106
108
|
prerelease: false
|
107
|
-
type: :development
|
108
109
|
description: Dropcaster is a podcast feed generator for the command line. It is most simple to use with Dropbox, but works equally well with any other hoster.
|
109
110
|
email: nerab@gmx.at
|
110
111
|
executables:
|
111
112
|
- lstags
|
112
113
|
- dropcaster
|
114
|
+
- dropcaster
|
115
|
+
- lstags
|
113
116
|
extensions: []
|
114
117
|
|
115
118
|
extra_rdoc_files:
|
@@ -139,7 +142,8 @@ files:
|
|
139
142
|
- lib/dropcaster/errors.rb
|
140
143
|
- lib/dropcaster/hashkeys.rb
|
141
144
|
- lib/dropcaster/item.rb
|
142
|
-
- templates/
|
145
|
+
- templates/iTunes.rss.erb
|
146
|
+
- test/extensions/windows.rb
|
143
147
|
- test/fixtures/channel.yml
|
144
148
|
- test/fixtures/iTunes.mp3
|
145
149
|
- test/helper.rb
|
@@ -148,7 +152,8 @@ files:
|
|
148
152
|
- test/unit/test_channel_locator.rb
|
149
153
|
- test/unit/test_channel_xml.rb
|
150
154
|
- test/unit/test_item.rb
|
151
|
-
|
155
|
+
has_rdoc: true
|
156
|
+
homepage: http://nerab.github.com/dropcaster
|
152
157
|
licenses:
|
153
158
|
- MIT
|
154
159
|
post_install_message:
|
@@ -177,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
177
182
|
requirements: []
|
178
183
|
|
179
184
|
rubyforge_project:
|
180
|
-
rubygems_version: 1.
|
185
|
+
rubygems_version: 1.6.1
|
181
186
|
signing_key:
|
182
187
|
specification_version: 3
|
183
188
|
summary: Simple Podcast Publishing with Dropbox
|