podcast_feed_gen 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b57dcaf111610700c3e2d37024b86435a466df14201a3d1f9bfc64e20559eb5e
4
+ data.tar.gz: 9f4b6cb1b697dca7506edb46d116b8a9b9769f8ff273cdadd11fdd153f9b7160
5
+ SHA512:
6
+ metadata.gz: de2618063d40afaa6ef06e7939c01b5e893cac6d5fffdc20ae140f2edd71b8b55437a284ee65fc5149c48c98bcde2626d0770c7820ccacde91fd2b8d41269816
7
+ data.tar.gz: 712571aff6db3ec1004c78da983ef6114b546304639dac2eb566c33fa8667b76a2e0d9b07b7044ee82d370bc8d62225ea4c1673d087ac4a71dcdba6a722886b3
@@ -0,0 +1,13 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /spec/support/**/*.yml
9
+ !/spec/support/*.yml
10
+ /tmp/
11
+
12
+ # rspec failure tracking
13
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,8 @@
1
+ builder:
2
+ class: ScriptBuilder
3
+ config:
4
+ command: docker build -t podcast_feed_gen .
5
+ tester:
6
+ class: ScriptTester
7
+ config:
8
+ command: docker run podcast_feed_gen bundle exec rspec
@@ -0,0 +1,37 @@
1
+ FROM alpine:3.8
2
+
3
+ RUN mkdir -p /etc \
4
+ && { \
5
+ echo 'install: --no-document'; \
6
+ echo 'update: --no-document'; \
7
+ } >> /etc/gemrc
8
+
9
+ RUN apk add --no-cache -u \
10
+ ruby \
11
+ tzdata \
12
+ git \
13
+ taglib-dev \
14
+ ruby-dev \
15
+ ruby-etc \
16
+ ruby-irb \
17
+ libxml2-dev \
18
+ build-base \
19
+ libxslt-dev
20
+
21
+ RUN ln -sf /usr/share/zoneinfo/Europe/London /etc/localtime
22
+
23
+ RUN gem install bundler
24
+ RUN bundle config --global silence_root_warning 1
25
+
26
+ WORKDIR /tmp
27
+ ADD Gemfile Gemfile
28
+ ADD Gemfile.lock Gemfile.lock
29
+ ADD podcast_feed_gen.gemspec podcast_feed_gen.gemspec
30
+ ADD lib/podcast_feed_gen/version.rb lib/podcast_feed_gen/version.rb
31
+ RUN bundle install
32
+
33
+ ADD . /podcast_feed_gen
34
+
35
+ WORKDIR /podcast_feed_gen
36
+
37
+ CMD exe/podcast_feed_gen
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in podcast_feed_gen.gemspec
6
+ gemspec
@@ -0,0 +1,99 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ podcast_feed_gen (0.1.0)
5
+ bundler (~> 1.16)
6
+ nokogiri
7
+ taglib-ruby
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ awesome_print (1.8.0)
13
+ byebug (10.0.2)
14
+ coderay (1.1.2)
15
+ diff-lcs (1.3)
16
+ docile (1.3.1)
17
+ ffi (1.9.25)
18
+ formatador (0.2.5)
19
+ guard (2.14.2)
20
+ formatador (>= 0.2.4)
21
+ listen (>= 2.7, < 4.0)
22
+ lumberjack (>= 1.0.12, < 2.0)
23
+ nenv (~> 0.1)
24
+ notiffany (~> 0.0)
25
+ pry (>= 0.9.12)
26
+ shellany (~> 0.0)
27
+ thor (>= 0.18.1)
28
+ guard-compat (1.2.1)
29
+ guard-rspec (4.7.3)
30
+ guard (~> 2.1)
31
+ guard-compat (~> 1.1)
32
+ rspec (>= 2.99.0, < 4.0)
33
+ json (2.1.0)
34
+ listen (3.1.5)
35
+ rb-fsevent (~> 0.9, >= 0.9.4)
36
+ rb-inotify (~> 0.9, >= 0.9.7)
37
+ ruby_dep (~> 1.2)
38
+ lumberjack (1.0.13)
39
+ method_source (0.9.0)
40
+ mini_portile2 (2.3.0)
41
+ nenv (0.3.0)
42
+ nokogiri (1.8.5)
43
+ mini_portile2 (~> 2.3.0)
44
+ notiffany (0.1.1)
45
+ nenv (~> 0.1)
46
+ shellany (~> 0.0)
47
+ pry (0.11.3)
48
+ coderay (~> 1.1.0)
49
+ method_source (~> 0.9.0)
50
+ pry-byebug (3.6.0)
51
+ byebug (~> 10.0)
52
+ pry (~> 0.10)
53
+ pry-doc (0.13.4)
54
+ pry (~> 0.11)
55
+ yard (~> 0.9.11)
56
+ rake (10.5.0)
57
+ rb-fsevent (0.10.3)
58
+ rb-inotify (0.9.10)
59
+ ffi (>= 0.5.0, < 2)
60
+ rspec (3.7.0)
61
+ rspec-core (~> 3.7.0)
62
+ rspec-expectations (~> 3.7.0)
63
+ rspec-mocks (~> 3.7.0)
64
+ rspec-core (3.7.1)
65
+ rspec-support (~> 3.7.0)
66
+ rspec-expectations (3.7.0)
67
+ diff-lcs (>= 1.2.0, < 2.0)
68
+ rspec-support (~> 3.7.0)
69
+ rspec-mocks (3.7.0)
70
+ diff-lcs (>= 1.2.0, < 2.0)
71
+ rspec-support (~> 3.7.0)
72
+ rspec-support (3.7.1)
73
+ ruby_dep (1.5.0)
74
+ shellany (0.0.1)
75
+ simplecov (0.16.1)
76
+ docile (~> 1.1)
77
+ json (>= 1.8, < 3)
78
+ simplecov-html (~> 0.10.0)
79
+ simplecov-html (0.10.2)
80
+ taglib-ruby (0.7.1)
81
+ thor (0.20.0)
82
+ yard (0.9.16)
83
+
84
+ PLATFORMS
85
+ ruby
86
+
87
+ DEPENDENCIES
88
+ awesome_print
89
+ bundler (~> 1.16)
90
+ guard-rspec
91
+ podcast_feed_gen!
92
+ pry-byebug
93
+ pry-doc
94
+ rake (~> 10.0)
95
+ rspec (~> 3.0)
96
+ simplecov
97
+
98
+ BUNDLED WITH
99
+ 1.16.5
@@ -0,0 +1,7 @@
1
+ interactor :off
2
+
3
+ guard :rspec, cmd: "bundle exec rspec", all_after_pass: true, all_on_start: true do
4
+ watch(%r{^lib\/podcast_feed_gen\/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
5
+ watch('spec/spec_helper.rb') { "spec" }
6
+ watch(%r{^spec\/.+_spec\.rb$})
7
+ end
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2018 Jonathan Davies
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,68 @@
1
+ # podcast_feed_gen
2
+
3
+ A simple CLI app for generating podcast RSS feeds from a directory of files. Similar to [dropcaster](https://github.com/nerab/dropcaster) but much simpler, and it supports a wide variety of audio formats instead of just MP3.
4
+
5
+ The idea is to put a directory containing some audio files somewhere publically accessible over http, (dropbox works well) and then run this program to generate an RSS file, which can then be consumed by your podcast playing app of choice.
6
+
7
+ Episode dates are read from the last-modified times of the files, and Title and Description fields are taken from the episode tags.
8
+
9
+ ## Installation
10
+
11
+ Install taglib with your OS's package manager:
12
+
13
+ Ubuntu/Debian:
14
+
15
+ $ apt-get install libtag1-dev
16
+
17
+ Fedora/RHEL:
18
+
19
+ $ yum install taglib-devel
20
+
21
+ MacOS:
22
+
23
+ $ brew install taglib
24
+
25
+ Then install podcast_feed_gen:
26
+
27
+ $ gem install podcast_feed_gen
28
+
29
+ ## Usage
30
+
31
+ Assemble the aformentioned publically accesible directory of episodes, and then place a file called `podcast_feed_gen.yml` in there with content like so:
32
+
33
+ ```
34
+ base_url: http://example.com/podcast/
35
+ title: test feed
36
+ author: John Doe
37
+ description: A cool podcast
38
+ ```
39
+
40
+ The `base_url` value is most important, it's the public facing URL of the directory, and it needs to have a slash at the end.
41
+
42
+ Then just run the script:
43
+
44
+ $ podcast_feed_gen
45
+
46
+ This will output the rss to stdout. Verify that it's as you expected, and then write it to an rss file:
47
+
48
+ $ podcast_feed_gen > index.rss
49
+
50
+ Then add the public URL of this file to your podcast player, and off you go. To update the feed, just put some more files into the directory and run the script again.
51
+
52
+ ## TODO
53
+
54
+ 1. Support for artwork, arbitrarily defined in the case of the channel and extracted from tag metadata for the episodes.
55
+ 2. Better configurability, eg. support for reading the configuration file from a path specified on the command line.
56
+ 3. Overriding the episode metadata with values taken from the config file.
57
+
58
+ ## Development
59
+
60
+ podcast_feed_gen is written in ruby. We've got some rspec tests, we've got a `Dockerfile`, and we've got a [TinyCI](https://github.com/JonnieCache/tinyci) config.
61
+
62
+ ## Contributing
63
+
64
+ Bug reports and pull requests are welcome on GitHub at https://github.com/JonnieCache/podcast_feed_gen
65
+
66
+ ## License
67
+
68
+ Open Source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "podcast_feed_gen"
5
+
6
+ require "pry"
7
+ Pry.start
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib = File.expand_path('../../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'podcast_feed_gen/generator'
7
+
8
+ gen = PodcastFeedGen::Generator.new
9
+
10
+ rss = gen.gen!
11
+
12
+ print rss
@@ -0,0 +1,49 @@
1
+ require "podcast_feed_gen/generator"
2
+ require 'digest'
3
+ require 'taglib'
4
+
5
+ module PodcastFeedGen
6
+ class Episode
7
+ attr_reader :values
8
+
9
+ def initialize(path, config)
10
+ @config = config
11
+
12
+ filename = File.basename path
13
+ ext = File.extname path
14
+
15
+ TagLib::FileRef.open(path) do |fileref|
16
+ t = fileref.tag
17
+ p = fileref.audio_properties
18
+
19
+ nilify = ->(s){ s == "" ? nil : s }
20
+
21
+ @values = {
22
+ filename: filename,
23
+ title: nilify[t.title] || filename,
24
+ author: nilify[t.artist],
25
+ description: nilify[t.comment] || filename,
26
+ duration: duration(p.length),
27
+ date: File.mtime(path),
28
+ size: File.size(path),
29
+ mime_type: Generator::FILETYPES[ext],
30
+ sha256: Digest::SHA256.hexdigest(File.read(path)),
31
+ url: @config[:base_url] + filename
32
+ }.freeze
33
+ end
34
+ end
35
+
36
+ def [](key)
37
+ @values[key]
38
+ end
39
+
40
+ private
41
+
42
+ def duration(seconds)
43
+ return nil if seconds.nil?
44
+
45
+ "%02d:%02d:%02d" % [seconds/3600%24, seconds/60%60, seconds%60]
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,103 @@
1
+ require "podcast_feed_gen/version"
2
+ require "podcast_feed_gen/episode"
3
+ require "symbolize"
4
+ require 'time'
5
+ require 'nokogiri'
6
+ require 'yaml'
7
+
8
+ module PodcastFeedGen
9
+ class Generator
10
+ include Symbolize
11
+
12
+ FILETYPES = {
13
+ '.mp3' => 'audio/mpeg',
14
+ '.m4a' => 'audio/m4a',
15
+ '.ogg' => 'audio/ogg',
16
+ '.oga' => 'audio/ogg',
17
+ '.flac' => 'audio/flac'
18
+ }
19
+
20
+ def initialize(working_dir: '.', config: nil)
21
+ @working_dir = File.expand_path working_dir
22
+ @config = config || load_config
23
+ end
24
+
25
+ def gen!
26
+ builder = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
27
+ xml.rss :version => "2.0", "xmlns:itunes" => "http://www.itunes.com/dtds/podcast-1.0.dtd", "xmlns:media" => "http://search.yahoo.com/mrss/", "xmlns:atom" => "http://www.w3.org/2005/Atom" do
28
+ xml.channel do
29
+ xml.tag!("atom:link", "href" => feed_url, "rel"=>"self", "type"=>"application/rss+xml")
30
+ xml.title @config[:title]
31
+ xml.link feed_url
32
+ xml.description @config[:description]
33
+ xml.language 'en'
34
+ xml.pubDate episodes.first[:date].rfc822
35
+ xml.lastBuildDate episodes.first[:date].rfc822
36
+ xml['itunes'].author @config[:author]
37
+ xml['itunes'].keywords @config[:keywords] if @config[:keywords]
38
+ xml['itunes'].explicit @config[:explicit] if @config[:explicit]
39
+ # xml['itunes'].image :href => @config[:image_url]
40
+ xml['itunes'].owner do
41
+ xml['itunes'].name @config[:author] if @config[:author]
42
+ xml['itunes'].email @config[:email] if @config[:email]
43
+ end if @config[:author]
44
+
45
+ xml['itunes'].block 'no'
46
+ # xml['itunes'].category :text => 'Technology' do
47
+ # xml['itunes'].category :text => 'Software How-To'
48
+ # end
49
+ # xml['itunes'].category :text => 'Education' do
50
+ # xml['itunes'].category :text => 'Training'
51
+ # end
52
+
53
+ episodes.each do |episode|
54
+ xml.item do
55
+ xml.title episode[:title]
56
+ xml.description episode[:description]
57
+ xml.pubDate episode[:date].rfc822
58
+ xml.enclosure :url => episode[:url], :length => episode[:size], :type => episode[:mime_type]
59
+ xml.link episode[:url]
60
+ xml.guid({:isPermaLink => "false"}, episode[:sha256])
61
+ xml['itunes'].author episode[:author] || @config[:author]
62
+ xml['itunes'].summary episode[:description]
63
+ xml['itunes'].explicit 'no'
64
+ xml['itunes'].duration episode[:duration] if episode[:duration]
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ builder.to_xml
72
+
73
+ end
74
+
75
+ private
76
+
77
+ def episodes
78
+ files = Dir.entries(@working_dir).select {|e| FILETYPES.keys.any? {|f| e.end_with? f }}
79
+
80
+ files.map do |filename|
81
+ path = File.join @working_dir, filename
82
+ Episode.new(path, @config)
83
+ end.sort_by {|e| e[:date]}
84
+
85
+ end
86
+
87
+ def feed_url
88
+ @config[:base_url] + 'index.rss'
89
+ end
90
+
91
+ def load_config
92
+ config_path = File.join @working_dir, 'podcast_feed_gen.yml'
93
+
94
+ unless File.exist? config_path
95
+ puts "config file '#{config_path}' not found"
96
+
97
+ exit 1
98
+ end
99
+
100
+ symbolize YAML.safe_load(File.read(config_path))
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,3 @@
1
+ module PodcastFeedGen
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,20 @@
1
+ module Symbolize
2
+ # recursively make all keys of `hash` into symbols
3
+ # @param [Hash] hash The hash
4
+ def symbolize(hash)
5
+ {}.tap do |h|
6
+ hash.each { |key, value| h[key.to_sym] = map_value(value) }
7
+ end
8
+ end
9
+
10
+ def map_value(thing)
11
+ case thing
12
+ when Hash
13
+ symbolize thing
14
+ when Array
15
+ thing.map { |v| map_value(v) }
16
+ else
17
+ thing
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,38 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "podcast_feed_gen/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "podcast_feed_gen"
8
+ spec.version = PodcastFeedGen::VERSION
9
+ spec.authors = ["Jonathan Davies"]
10
+ spec.email = ["jonnie@cleverna.me"]
11
+
12
+ spec.summary = %q{Generates a basic podcast RSS feed from a directory of files}
13
+ spec.homepage = "https://github.com/JonnieCache/podcast_feed_gen"
14
+ spec.license = "MIT"
15
+
16
+ # Specify which files should be added to the gem when it is released.
17
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
18
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
19
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
+ end
21
+ spec.bindir = "exe"
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ["lib"]
24
+
25
+ spec.add_dependency "bundler", "~> 1.16"
26
+ spec.add_dependency "nokogiri"
27
+ spec.add_dependency "taglib-ruby"
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.16"
30
+ spec.add_development_dependency "rake", "~> 10.0"
31
+ spec.add_development_dependency "rspec", "~> 3.0"
32
+ spec.add_development_dependency 'awesome_print'
33
+ spec.add_development_dependency 'guard-rspec'
34
+ spec.add_development_dependency 'pry-byebug'
35
+ spec.add_development_dependency 'pry-doc'
36
+ spec.add_development_dependency 'simplecov'
37
+
38
+ end
metadata ADDED
@@ -0,0 +1,217 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: podcast_feed_gen
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jonathan Davies
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-10-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nokogiri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: taglib-ruby
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.16'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.16'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: awesome_print
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: guard-rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry-byebug
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: pry-doc
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: simplecov
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description:
168
+ email:
169
+ - jonnie@cleverna.me
170
+ executables:
171
+ - podcast_feed_gen
172
+ extensions: []
173
+ extra_rdoc_files: []
174
+ files:
175
+ - ".gitignore"
176
+ - ".rspec"
177
+ - ".tinyci.yml"
178
+ - Dockerfile
179
+ - Gemfile
180
+ - Gemfile.lock
181
+ - Guardfile
182
+ - LICENSE.txt
183
+ - README.md
184
+ - Rakefile
185
+ - bin/console
186
+ - bin/setup
187
+ - exe/podcast_feed_gen
188
+ - lib/podcast_feed_gen/episode.rb
189
+ - lib/podcast_feed_gen/generator.rb
190
+ - lib/podcast_feed_gen/version.rb
191
+ - lib/symbolize.rb
192
+ - podcast_feed_gen.gemspec
193
+ homepage: https://github.com/JonnieCache/podcast_feed_gen
194
+ licenses:
195
+ - MIT
196
+ metadata: {}
197
+ post_install_message:
198
+ rdoc_options: []
199
+ require_paths:
200
+ - lib
201
+ required_ruby_version: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ required_rubygems_version: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - ">="
209
+ - !ruby/object:Gem::Version
210
+ version: '0'
211
+ requirements: []
212
+ rubyforge_project:
213
+ rubygems_version: 2.7.6
214
+ signing_key:
215
+ specification_version: 4
216
+ summary: Generates a basic podcast RSS feed from a directory of files
217
+ test_files: []