rss-opds 0.0.2 → 0.0.3

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: '09d755c74c4f44e54bd8a8c4edb7109f2afde6cb15678dc4d5150e24209def54'
4
+ data.tar.gz: aa8f11cc5bdb0f6146c2f77af3197f0bdde028f0b8fbae9cb5b17be43d0e9dd9
5
+ SHA512:
6
+ metadata.gz: 82345f798acbb3e5baa066c3c48db0679ce8ff40fffbd51423aa80d6949e1729aee996f6be058beadc53278209d32f234ed15c035672374330e9e0c56021da58
7
+ data.tar.gz: df102e1fa2609affe6c4be21209785fc739f6c8772bb896ef32d42f072d65c382ff8c3d50c81808bcb7500748d405b39c048ed87e9b02e56b9fb153edff702ed
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012 KITAITI Makoto
1
+ Copyright (c) 2012, 2013 KITAITI Makoto
2
2
 
3
3
  MIT License
4
4
 
@@ -94,6 +94,18 @@ And now, this library provides utility methods which help you make OPDS navigati
94
94
  }
95
95
  puts root # => output XML including entry with 'new' sorting relation
96
96
 
97
+ Examples
98
+ --------
99
+ For more examples, see files in `examples` directory.
100
+
101
+ Changelog
102
+ ---------
103
+ ### 0.0.3
104
+ * Add sample script 'examples/build-catalog-from-epub.rb' which build OPDS catalog feed using specified EPUB files
105
+ * Add sample server 'examples/opds_server.ru' for Rack
106
+ * Remove Money from dependencies
107
+ * [BUG FIX]Add element component to XPath
108
+
97
109
  Contributing
98
110
  ------------
99
111
 
@@ -0,0 +1,62 @@
1
+ # This is an example that aggregates info from EPUB files and build OPDS catalog feed using them
2
+ #
3
+ # Usage:
4
+ # ruby examples/build-catalog-from-epub.rb EPUBFILE
5
+ # ruby examples/build-catalog-from-epub.rb ~/Documents/Books/*.epub
6
+
7
+ require 'rss'
8
+ require 'rss/opds'
9
+ require 'rss/maker/opds'
10
+ require 'epub/parser' # You need to exec 'gem install epub-parser' if you don't have it
11
+
12
+ def main
13
+ if ARGV.empty?
14
+ puts "Usage: ruby #{File.basename($0)} EPUBFILE [EPUBFILE ...]"
15
+ exit 1
16
+ end
17
+
18
+ puts make_catalog(ARGV)
19
+ end
20
+
21
+ def make_catalog(files)
22
+ RSS::Maker.make 'atom' do |maker|
23
+ maker.channel.about = 'http://example.net/'
24
+ maker.channel.title = 'My EPUB books'
25
+ maker.channel.description = 'This is an example to make OPDS catalog using RSS::OPDS library'
26
+ maker.channel.links.new_link do |link|
27
+ link.href = 'http://example.net/'
28
+ link.rel = RSS::OPDS::RELATIONS['self']
29
+ link.type = RSS::OPDS::TYPES['navigation']
30
+ end
31
+ maker.channel.links.new_link do |link|
32
+ link.href = 'http://example.net/'
33
+ link.rel = RSS::OPDS::RELATIONS['start']
34
+ link.type = RSS::OPDS::TYPES['navigation']
35
+ end
36
+ maker.channel.author = `whoami`.chomp
37
+ maker.channel.generator = 'RSS OPDS the Ruby OPDS library'
38
+ maker.channel.updated = Time.now
39
+
40
+ files.sort.each do |file|
41
+ begin
42
+ make_entry(file, maker)
43
+ rescue => error
44
+ $stderr.puts error
45
+ $stderr.puts "skip: #{file}"
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ def make_entry(file, maker)
52
+ book = EPUB::Parser.parse(file)
53
+ maker.items.new_item do |entry|
54
+ entry.id = book.metadata.unique_identifier.content
55
+ entry.title = book.title
56
+ entry.summary = book.metadata.description
57
+ updated = book.metadata.date
58
+ entry.updated = updated ? updated.content : File.mtime(file)
59
+ end
60
+ end
61
+
62
+ main
@@ -0,0 +1,81 @@
1
+ # Usage
2
+ # $ DOCUMENT_ROOT=path/to/doc/root rackup examples/opds_server.ru
3
+ #
4
+ # If required gems are not installed, you need exec:
5
+ # $ gem install rack epub-parser
6
+ require 'pathname'
7
+ require 'rack'
8
+ require 'epub/parser'
9
+ require 'rss/maker/opds'
10
+
11
+ class OPDSServer
12
+ OPTIONS = {
13
+ :title => 'My EPUB Books',
14
+ :description => 'This is an example server that serves OPDS includeing information of EPUB files in a directory.',
15
+ :author => `whoami`.chomp,
16
+ :generator => self.to_s
17
+ }
18
+
19
+ def initialize(dir='.', options={})
20
+ raise "Document root not given. Usage: DOCUMENT_ROOT=path/to/docroot rackup #{__FILE__}" unless dir
21
+ @dir = Pathname(dir)
22
+ raise "Not a directory: #{dir}" unless @dir.directory?
23
+ @options = OPTIONS.merge(options)
24
+ $stderr.puts "Providing OPDS for EPUB files in #{@dir}"
25
+ end
26
+
27
+ def call(env)
28
+ @files = Pathname.glob("#{@dir}/**/*.epub")
29
+ @last_modified = @files.collect(&:mtime).max
30
+
31
+ @request = Rack::Request.new(env)
32
+ response = Rack::Response.new
33
+
34
+ if_modifed_since = env['HTTP_IF_MODIFIED_SINCE']
35
+ if if_modifed_since and @last_modified.to_s <= Time.httpdate(if_modifed_since).to_s
36
+ response.status = Rack::Utils.status_code(:not_modified)
37
+ elsif !@request.head?
38
+ response.body << make_feed.to_s
39
+ end
40
+
41
+ response['Content-Type'] = RSS::OPDS::TYPES['navigation']
42
+ response['Last-Modified'] = @last_modified.httpdate
43
+ response.finish
44
+ end
45
+
46
+ def make_feed
47
+ RSS::Maker.make('atom') {|maker|
48
+ maker.channel.about = @options[:about] || @request.url
49
+ OPTIONS.keys.each do |attr|
50
+ maker.channel.send "#{attr}=", @options[attr]
51
+ end
52
+ maker.channel.updated = @last_modified
53
+ @files.each do |path|
54
+ begin
55
+ book = EPUB::Parser.parse(path)
56
+ maker.items.new_item do |entry|
57
+ entry.id = book.unique_identifier.content
58
+ entry.title = book.title
59
+ entry.summary = book.description
60
+ uri_path = path.relative_path_from(@dir)
61
+ entry.links.new_link do |link|
62
+ link.rel = RSS::OPDS::RELATIONS['acquisition']
63
+ link.href = @request.base_url + '/' + ERB::Util.url_encode(uri_path.to_path)
64
+ link.type = 'application/epub+zip'
65
+ end
66
+ updated = Time.parse(book.date.content) rescue nil
67
+ entry.updated = updated || path.mtime
68
+ end
69
+ rescue => error
70
+ $stderr.puts error
71
+ $stderr.puts "Skip: #{path}"
72
+ end
73
+ end
74
+ }
75
+ end
76
+ end
77
+
78
+ docroot = ENV['DOCUMENT_ROOT']
79
+ run Rack::Cascade.new(
80
+ [Rack::File.new(docroot),
81
+ OPDSServer.new(docroot)])
@@ -3,51 +3,63 @@ require 'rss/opds'
3
3
 
4
4
  module RSS
5
5
  module Maker
6
- module Atom
7
- class Feed < RSSBase
8
- class Items < ItemsBase
9
- class Item < ItemBase
10
- class Links < LinksBase
11
- class Link < LinkBase
12
- %w[facetGroup activeFacet].each do |attr|
13
- def_other_element attr
14
- end
15
- def_classed_elements 'opds_price', 'value', 'Prices'
6
+ module OPDS
7
+ module LinkBase
8
+ class << self
9
+ def included(base)
10
+ super
11
+ base.class_eval(<<-EOC, __FILE__, __LINE__ + 1)
12
+ %w[facetGroup activeFacet].each do |attr|
13
+ def_other_element attr
14
+ end
15
+ def_classed_elements 'opds_price', 'value', 'Prices'
16
16
 
17
- # @note Defined to prevent NoMethodError
18
- def setup_opds_prices(feed, current)
19
- end
17
+ # @note Defined to prevent NoMethodError
18
+ def setup_opds_prices(feed, current)
19
+ end
20
20
 
21
- # @note Should provide this method as the one of a module
22
- def to_feed(feed, current)
23
- super # AtomLink#to_feed
24
- opds_prices.to_feed(feed, current.links.last)
25
- end
21
+ def to_feed(feed, current)
22
+ super # AtomLink#to_feed
23
+ opds_prices.to_feed(feed, current.links.last)
24
+ end
25
+ EOC
26
+ end
27
+ end
26
28
 
27
- class Prices < Base
28
- def_array_element 'opds_price', nil, 'Price'
29
+ class Prices < Base
30
+ def_array_element 'opds_price', nil, 'Price'
29
31
 
30
- class Price < Base
31
- %w[value currencycode].each do |attr|
32
- attr_accessor attr
33
- end
32
+ class Price < Base
33
+ %w[value currencycode].each do |attr|
34
+ attr_accessor attr
35
+ end
34
36
 
35
- def to_feed(feed, current)
36
- price = ::RSS::OPDS::Price.new
37
- price.value = value
38
- price.currencycode = currencycode
39
- current.opds_prices << price
40
- set_parent price, current
41
- setup_other_elements(feed)
42
- end
37
+ def to_feed(feed, current)
38
+ price = ::RSS::OPDS::Price.new
39
+ price.value = value
40
+ price.currencycode = currencycode
41
+ current.opds_prices << price
42
+ set_parent price, current
43
+ setup_other_elements(feed)
44
+ end
43
45
 
44
- private
46
+ private
45
47
 
46
- def required_variable_names
47
- %w[currencycode]
48
- end
49
- end
50
- end
48
+ def required_variable_names
49
+ %w[currencycode]
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ module Atom
57
+ class Feed < RSSBase
58
+ class Items < ItemsBase
59
+ class Item < ItemBase
60
+ class Links < LinksBase
61
+ class Link < LinkBase
62
+ include OPDS::LinkBase
51
63
  end
52
64
  end
53
65
  end
@@ -58,16 +70,42 @@ module RSS
58
70
  raise TypeError, 'Only navigatfion feed can accept feed' unless is_navigation_feed
59
71
  raise ArgumentError, 'Only acquisition feed can be accepted' unless feed.acquisition_feed?
60
72
  new_item do |entry|
61
- [:id, :title, :dc_description, :updated].each do |attr|
73
+ [:id, :title, :dc_description, :updated, :rights].each do |attr|
62
74
  val = feed.__send__(attr)
63
75
  entry.__send__("#{attr}=", val.content) if val
64
76
  end
77
+ [:author, :contributor].each do |attr_name|
78
+ plural ||= "#{attr_name}s"
79
+ feed.__send__(plural).each do |val|
80
+ entry.__send__(plural).__send__("new_#{attr_name}") do |attr_maker|
81
+ [:name, :uri, :email].each do |elem|
82
+ attr_val = val.__send__(elem)
83
+ attr_maker.__send__("#{elem}=", attr_val)
84
+ end
85
+ end
86
+ end
87
+ end
88
+ feed.categories.each do |cat|
89
+ entry.categories.new_category do |cat_maker|
90
+ [:term, :scheme, :label].each do |xml_attr|
91
+ val = cat.__send__(xml_attr)
92
+ cat_maker.__send__("#{xml_attr}=", val)
93
+ end
94
+ end
95
+ end
96
+ entry.content.content ||= feed.dc_description || feed.title.content
97
+
65
98
  entry.links.new_link do |link|
66
99
  href = feed.links.find {|ln| ln.rel == RSS::OPDS::RELATIONS['self']}.href unless href
67
100
  link.href = href
68
101
  link.rel = relation
69
102
  link.type = RSS::OPDS::TYPES['acquisition']
103
+ link.title = feed.title.content
104
+ link.hreflang = feed.lang || feed.dc_language
105
+ # Skip "length" attribute because it is for "enclosure" relation and maybe feed here doesn't have it.
70
106
  end
107
+
108
+ entry
71
109
  end
72
110
  end
73
111
 
@@ -158,10 +158,7 @@ module RSS
158
158
  'image' => 'http://opds-spec.org/image',
159
159
  'thumbnail' => 'http://opds-spec.org/image/thumbnail'
160
160
  }
161
- RELATIONS = Hash.new {|h, k|
162
- ENTRY_RELATIONS[k] or CATALOG_RELATIONS[k] or REGISTERED_RELATIONS[k] or
163
- raise KeyError, "Unsupported relation type: #{k.inspect}"
164
- }
161
+ RELATIONS = [REGISTERED_RELATIONS, CATALOG_RELATIONS, ENTRY_RELATIONS].reduce({}) {|merged, relations| merged.merge(relations)}
165
162
 
166
163
  class Price < Element
167
164
  include Atom::CommonModel
@@ -1,5 +1,5 @@
1
1
  module RSS
2
2
  module OPDS
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  end
@@ -18,8 +18,8 @@ Gem::Specification.new do |gem|
18
18
 
19
19
  gem.add_runtime_dependency 'rss-dcterms'
20
20
  gem.add_runtime_dependency 'rss-atom-feed_history'
21
- gem.add_runtime_dependency 'money'
22
21
 
22
+ gem.add_development_dependency 'rake'
23
23
  gem.add_development_dependency 'test-unit'
24
24
  gem.add_development_dependency 'simplecov'
25
25
  gem.add_development_dependency 'yard'
@@ -0,0 +1,41 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <feed xmlns="http://www.w3.org/2005/Atom"
3
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
4
+ xmlns:dcterms="http://purl.org/dc/terms/"
5
+ xmlns:opds="http://opds-spec.org/2010/catalog">
6
+ <author>
7
+ <name>KITAITI Makoto</name>
8
+ </author>
9
+ <id>http://example.net/</id>
10
+ <link href="http://example.net/root.opds"
11
+ rel="self"
12
+ type="application/atom+xml;profile=opds-catalog;kind=navigation"/>
13
+ <link href="http://example.net/root.opds"
14
+ rel="start"
15
+ type="application/atom+xml;profile=opds-catalog;kind=navigation"/>
16
+ <subtitle>Sample OPDS</subtitle>
17
+ <title>Example Catalog Root</title>
18
+ <updated>2012-08-14T04:23:00+09:00</updated>
19
+ <entry>
20
+ <id>http://example.net/popular.opds</id>
21
+ <link href="http://example.net/popular.opds"
22
+ type="application/atom+xml;profile=opds-catalog;kind=acquisition"/>
23
+ <summary>Popular books in this site</summary>
24
+ <title>Example Popular Books</title>
25
+ <updated>2012-07-31T00:00:00+09:00</updated>
26
+ <dc:date>2012-07-31T00:00:00+09:00</dc:date>
27
+ <dcterms:date>2012-07-31T00:00:00+09:00</dcterms:date>
28
+ </entry>
29
+ <entry>
30
+ <id>http://example.net/new.opds</id>
31
+ <link href="http://example.net/new.opds"
32
+ type="application/atom+xml;profile=opds-catalog;kind=acquisition"/>
33
+ <summary>New books in this site</summary>
34
+ <title>Example New Books</title>
35
+ <updated>2012-08-14T04:23:00+09:00</updated>
36
+ <dc:date>2012-08-14T04:23:00+09:00</dc:date>
37
+ <dcterms:date>2012-08-14T04:23:00+09:00</dcterms:date>
38
+ </entry>
39
+ <dc:date>2012-08-14T04:23:00+09:00</dc:date>
40
+ <dcterms:date>2012-08-14T04:23:00+09:00</dcterms:date>
41
+ </feed>
@@ -48,7 +48,7 @@ class TestMaker < TestOPDS
48
48
  end
49
49
  }
50
50
  doc = REXML::Document.new(feed.to_s)
51
- links = REXML::XPath.match(doc, "//[@opds:activeFacet]")
51
+ links = REXML::XPath.match(doc, "//*[@opds:activeFacet]")
52
52
  assert_not_empty links
53
53
  assert_equal 'true', links.first.attributes['opds:activeFacet']
54
54
  end
@@ -73,7 +73,7 @@ class TestMaker < TestOPDS
73
73
  end
74
74
  }
75
75
  doc = REXML::Document.new(feed.to_s)
76
- assert_empty REXML::XPath.match(doc, "//[@opds:activeFacet]")
76
+ assert_empty REXML::XPath.match(doc, "//*[@opds:activeFacet]")
77
77
  end
78
78
 
79
79
  def test_navigation_feed_accepts_aqcuisition_feed_as_item
@@ -106,6 +106,35 @@ class TestMaker < TestOPDS
106
106
  assert_equal 'http://opds-spec.org/sort/popular', links[1].attributes['rel']
107
107
  end
108
108
 
109
+ def test_add_relation_returns_item
110
+ catalog_root = nil
111
+ assert_nothing_raised do
112
+ catalog_root = RSS::Maker.make('atom') {|maker|
113
+ maker.channel.about = 'http://example.net/'
114
+ maker.channel.title = 'Example Catalog Root'
115
+ maker.channel.description = 'Sample OPDS'
116
+ maker.channel.links.new_link do |link|
117
+ link.href = 'http://example.net/root.opds'
118
+ link.rel = RSS::OPDS::RELATIONS['self']
119
+ link.type = RSS::OPDS::TYPES['navigation']
120
+ end
121
+ maker.channel.links.new_link do |link|
122
+ link.href = 'http://example.net/root.opds'
123
+ link.rel = RSS::OPDS::RELATIONS['start']
124
+ link.type = RSS::OPDS::TYPES['navigation']
125
+ end
126
+ maker.channel.updated = '2012-08-14T05:30:00'
127
+ maker.channel.author = 'KITAITI Makoto'
128
+
129
+ entry = maker.items.add_relation recent, RSS::OPDS::RELATIONS['new']
130
+ entry.content.content = 'Overwritten entry content'
131
+ }
132
+ end
133
+ doc = REXML::Document.new(catalog_root.to_s)
134
+ links = REXML::XPath.match(doc, "/feed/entry/content")
135
+ assert_equal 'Overwritten entry content', links.first.text
136
+ end
137
+
109
138
  def test_utility_to_add_entry_relations
110
139
  pend
111
140
  end
@@ -183,6 +212,7 @@ class TestMaker < TestOPDS
183
212
  def recent
184
213
  RSS::Maker.make('atom') do |maker|
185
214
  maker.channel.about = 'http://example.net/'
215
+ maker.channel.language = 'en'
186
216
  maker.channel.title = 'Example New Catalog'
187
217
  maker.channel.description = 'New books in this site'
188
218
  maker.channel.links.new_link do |link|
@@ -197,6 +227,7 @@ class TestMaker < TestOPDS
197
227
  end
198
228
  maker.channel.updated = '2012-08-14T04:23:00'
199
229
  maker.channel.author = 'KITAITI Makoto'
230
+ maker.channel.rights = 'Copyright (c) 2012, KITAITI Makoto'
200
231
 
201
232
  new_books.each do |book|
202
233
  maker.items.new_item do |entry|
metadata CHANGED
@@ -1,115 +1,141 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rss-opds
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
5
- prerelease:
4
+ version: 0.0.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - KITAITI Makoto
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-10-20 00:00:00.000000000 Z
11
+ date: 2019-03-23 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rss-dcterms
16
- requirement: &11264540 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *11264540
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: rss-atom-feed_history
27
- requirement: &11264060 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
- - - ! '>='
31
+ - - ">="
31
32
  - !ruby/object:Gem::Version
32
33
  version: '0'
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *11264060
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
36
41
  - !ruby/object:Gem::Dependency
37
- name: money
38
- requirement: &11263600 !ruby/object:Gem::Requirement
39
- none: false
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
40
44
  requirements:
41
- - - ! '>='
45
+ - - ">="
42
46
  - !ruby/object:Gem::Version
43
47
  version: '0'
44
- type: :runtime
48
+ type: :development
45
49
  prerelease: false
46
- version_requirements: *11263600
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
47
55
  - !ruby/object:Gem::Dependency
48
56
  name: test-unit
49
- requirement: &11263060 !ruby/object:Gem::Requirement
50
- none: false
57
+ requirement: !ruby/object:Gem::Requirement
51
58
  requirements:
52
- - - ! '>='
59
+ - - ">="
53
60
  - !ruby/object:Gem::Version
54
61
  version: '0'
55
62
  type: :development
56
63
  prerelease: false
57
- version_requirements: *11263060
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: simplecov
60
- requirement: &11262540 !ruby/object:Gem::Requirement
61
- none: false
71
+ requirement: !ruby/object:Gem::Requirement
62
72
  requirements:
63
- - - ! '>='
73
+ - - ">="
64
74
  - !ruby/object:Gem::Version
65
75
  version: '0'
66
76
  type: :development
67
77
  prerelease: false
68
- version_requirements: *11262540
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: yard
71
- requirement: &11262100 !ruby/object:Gem::Requirement
72
- none: false
85
+ requirement: !ruby/object:Gem::Requirement
73
86
  requirements:
74
- - - ! '>='
87
+ - - ">="
75
88
  - !ruby/object:Gem::Version
76
89
  version: '0'
77
90
  type: :development
78
91
  prerelease: false
79
- version_requirements: *11262100
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
80
97
  - !ruby/object:Gem::Dependency
81
98
  name: redcarpet
82
- requirement: &11261600 !ruby/object:Gem::Requirement
83
- none: false
99
+ requirement: !ruby/object:Gem::Requirement
84
100
  requirements:
85
- - - ! '>='
101
+ - - ">="
86
102
  - !ruby/object:Gem::Version
87
103
  version: '0'
88
104
  type: :development
89
105
  prerelease: false
90
- version_requirements: *11261600
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
91
111
  - !ruby/object:Gem::Dependency
92
112
  name: pry
93
- requirement: &11261140 !ruby/object:Gem::Requirement
94
- none: false
113
+ requirement: !ruby/object:Gem::Requirement
95
114
  requirements:
96
- - - ! '>='
115
+ - - ">="
97
116
  - !ruby/object:Gem::Version
98
117
  version: '0'
99
118
  type: :development
100
119
  prerelease: false
101
- version_requirements: *11261140
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
102
125
  - !ruby/object:Gem::Dependency
103
126
  name: pry-doc
104
- requirement: &11260700 !ruby/object:Gem::Requirement
105
- none: false
127
+ requirement: !ruby/object:Gem::Requirement
106
128
  requirements:
107
- - - ! '>='
129
+ - - ">="
108
130
  - !ruby/object:Gem::Version
109
131
  version: '0'
110
132
  type: :development
111
133
  prerelease: false
112
- version_requirements: *11260700
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
113
139
  description: OPDS parser and maker
114
140
  email:
115
141
  - KitaitiMakoto@gmail.com
@@ -117,48 +143,45 @@ executables: []
117
143
  extensions: []
118
144
  extra_rdoc_files: []
119
145
  files:
120
- - .gitignore
146
+ - ".gitignore"
121
147
  - Gemfile
122
148
  - LICENSE
123
149
  - README.markdown
124
150
  - Rakefile
151
+ - examples/build-catalog-from-epub.rb
125
152
  - examples/make-catalog.rb
153
+ - examples/opds_server.ru
126
154
  - lib/rss/maker/opds.rb
127
155
  - lib/rss/opds.rb
128
156
  - lib/rss/opds/version.rb
129
157
  - rss-opds.gemspec
130
158
  - setup.rb
159
+ - test/fixtures/root.opds
131
160
  - test/helper.rb
132
161
  - test/test_maker.rb
133
162
  homepage: http://rss-ext.rubyforge.org/
134
163
  licenses: []
164
+ metadata: {}
135
165
  post_install_message:
136
166
  rdoc_options: []
137
167
  require_paths:
138
168
  - lib
139
169
  required_ruby_version: !ruby/object:Gem::Requirement
140
- none: false
141
170
  requirements:
142
- - - ! '>='
171
+ - - ">="
143
172
  - !ruby/object:Gem::Version
144
173
  version: '0'
145
- segments:
146
- - 0
147
- hash: -1275098366759959895
148
174
  required_rubygems_version: !ruby/object:Gem::Requirement
149
- none: false
150
175
  requirements:
151
- - - ! '>='
176
+ - - ">="
152
177
  - !ruby/object:Gem::Version
153
178
  version: '0'
154
- segments:
155
- - 0
156
- hash: -1275098366759959895
157
179
  requirements: []
158
- rubyforge_project: http://rss-ext.rubyforge.org/
159
- rubygems_version: 1.8.8
180
+ rubygems_version: 3.0.3
160
181
  signing_key:
161
- specification_version: 3
182
+ specification_version: 4
162
183
  summary: This gem extends Ruby bundled RSS library to parse and make OPDS catalogs
163
- test_files: []
164
- has_rdoc:
184
+ test_files:
185
+ - test/fixtures/root.opds
186
+ - test/helper.rb
187
+ - test/test_maker.rb