cdb-crawlr 0.3.0 → 0.3.1

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.
Files changed (6) hide show
  1. checksums.yaml +7 -0
  2. data/bin/cdb +106 -106
  3. data/lib/cdb-crawlr.rb +52 -52
  4. data/lib/cdb/cli.rb +84 -84
  5. data/lib/cdb/renamer.rb +122 -117
  6. metadata +11 -15
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: dc1a671da9a5b09c242d1a25906519e69bcce90b
4
+ data.tar.gz: f05ee45348e7e6434bd79dd7d6dee7944f2c54ac
5
+ SHA512:
6
+ metadata.gz: 6f58717c2a4ec8eb7e6189b3322a8c13d32aa2531335e24c011a9f951400372d4f0d3cecb9ae7b7635e10fae6628680908bb7fec4539b7e9147a498c5541e0b2
7
+ data.tar.gz: 6e4ffe3aa423706155968da23df50af18d2f3f76a49a592b941a9961a10d905bbb347e92203fccaa987adc4b1aba7e08e7197b92150b84b447e1329cbd5bdad2
data/bin/cdb CHANGED
@@ -1,106 +1,106 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'cdb-crawlr'
4
- # load 'lib/cdb-crawlr.rb'
5
- require 'optparse'
6
-
7
- $cli = CDB::CLI.new
8
-
9
- def print_help(opt = @global, error=nil)
10
- puts "cdb: #{error}\n" if error && !error.to_s.empty?
11
- puts opt
12
- exit 1
13
- end
14
-
15
- @global = OptionParser.new do |opts|
16
- opts.banner = "Usage: cdb [-v|--version] <COMMAND> [<ARGS>]"
17
-
18
- opts.on("-h", "--help", "Display this screen"){ print_help }
19
- opts.on("-v", "--version", "Show version information") do
20
- puts "cdb #{CDB::VERSION}"; exit
21
- end
22
-
23
- opts.separator "\nCOMMANDS:"
24
- opts.separator " rename Rename a directory of comics according to series data"
25
- opts.separator " search Search for entries of a given TYPE matching QUERY"
26
- opts.separator " show Show details of an entry using a CDB_ID obtained from search"
27
- end
28
-
29
- @search = OptionParser.new do |opts|
30
- opts.banner = "Usage: cdb search <TYPE> <QUERY>"
31
-
32
- opts.on("-h", "--help", "Display this screen"){ print_help opts }
33
-
34
- opts.separator "\nTYPES:"
35
- opts.separator " issue Search comic issue names for given QUERY"
36
- opts.separator " series Search comic series names for given QUERY"
37
- end
38
-
39
- @show = OptionParser.new do |opts|
40
- opts.banner = "Usage: cdb show <TYPE> <CDB_ID>"
41
-
42
- opts.on("-h", "--help", "Display this screen"){ print_help opts }
43
-
44
- opts.separator "\nTYPES:"
45
- opts.separator " series Get all available details of a comic series"
46
- end
47
-
48
- @rename = OptionParser.new do |opts|
49
- opts.banner = "Usage: cdb rename [-f|--force] <PATH> <CDB_ID>"
50
-
51
- opts.on("-h", "--help", "Display this screen"){ print_help opts }
52
- opts.on("-f", "--force", "Perform the rename without any confirmations"){ $cli[:force] = true }
53
- opts.on("-i", "--ignore", "Ignore warnings about unknown and misformatted issue numbers"){ $cli[:ignore] = true }
54
- end
55
-
56
- @command_opts = {
57
- 'search' => @search,
58
- 'show' => @show,
59
- 'rename' => @rename
60
- }
61
-
62
- # Parse global flags
63
- begin
64
- @global.order!
65
- rescue OptionParser::InvalidOption => e
66
- puts e; print_help
67
- end
68
-
69
- # Pop and verify command
70
- begin
71
- command = ARGV.shift
72
- $cli[:command] = command
73
- command_opt = @command_opts[$cli[:command]]
74
- rescue
75
- error = "invalid COMMAND: #{command}" unless command.to_s.empty?
76
- print_help @global, error
77
- end
78
-
79
- # Parse command flags
80
- begin
81
- command_opt.order!
82
- rescue OptionParser::InvalidOption, OptionParser::MissingArgument => e
83
- print_help command_opt, e
84
- end
85
-
86
- # Pop and verify third argument
87
- begin
88
- next_arg = ARGV.shift
89
- case $cli[:command]
90
- when 'search, show'
91
- $cli[:type] = next_arg
92
- when 'rename'
93
- $cli[:path] = next_arg
94
- end
95
- rescue => e
96
- print_help command_opt, e
97
- end
98
-
99
- # Verify args
100
- begin
101
- $cli[:args] = ARGV.join(' ')
102
- rescue => e
103
- print_help command_opt, e
104
- end
105
-
106
- $cli.execute
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'cdb-crawlr'
4
+ # load 'lib/cdb-crawlr.rb'
5
+ require 'optparse'
6
+
7
+ $cli = CDB::CLI.new
8
+
9
+ def print_help(opt = @global, error=nil)
10
+ puts "cdb: #{error}\n" if error && !error.to_s.empty?
11
+ puts opt
12
+ exit 1
13
+ end
14
+
15
+ @global = OptionParser.new do |opts|
16
+ opts.banner = "Usage: cdb [-v|--version] <COMMAND> [<ARGS>]"
17
+
18
+ opts.on("-h", "--help", "Display this screen"){ print_help }
19
+ opts.on("-v", "--version", "Show version information") do
20
+ puts "cdb #{CDB::VERSION}"; exit
21
+ end
22
+
23
+ opts.separator "\nCOMMANDS:"
24
+ opts.separator " rename Rename a directory of comics according to series data"
25
+ opts.separator " search Search for entries of a given TYPE matching QUERY"
26
+ opts.separator " show Show details of an entry using a CDB_ID obtained from search"
27
+ end
28
+
29
+ @search = OptionParser.new do |opts|
30
+ opts.banner = "Usage: cdb search <TYPE> <QUERY>"
31
+
32
+ opts.on("-h", "--help", "Display this screen"){ print_help opts }
33
+
34
+ opts.separator "\nTYPES:"
35
+ opts.separator " issue Search comic issue names for given QUERY"
36
+ opts.separator " series Search comic series names for given QUERY"
37
+ end
38
+
39
+ @show = OptionParser.new do |opts|
40
+ opts.banner = "Usage: cdb show <TYPE> <CDB_ID>"
41
+
42
+ opts.on("-h", "--help", "Display this screen"){ print_help opts }
43
+
44
+ opts.separator "\nTYPES:"
45
+ opts.separator " series Get all available details of a comic series"
46
+ end
47
+
48
+ @rename = OptionParser.new do |opts|
49
+ opts.banner = "Usage: cdb rename [-f|--force] <PATH> <CDB_ID>"
50
+
51
+ opts.on("-h", "--help", "Display this screen"){ print_help opts }
52
+ opts.on("-f", "--force", "Perform the rename without any confirmations"){ $cli[:force] = true }
53
+ opts.on("-i", "--ignore", "Ignore warnings about unknown and misformatted issue numbers"){ $cli[:ignore] = true }
54
+ end
55
+
56
+ @command_opts = {
57
+ 'search' => @search,
58
+ 'show' => @show,
59
+ 'rename' => @rename
60
+ }
61
+
62
+ # Parse global flags
63
+ begin
64
+ @global.order!
65
+ rescue OptionParser::InvalidOption => e
66
+ puts e; print_help
67
+ end
68
+
69
+ # Pop and verify command
70
+ begin
71
+ command = ARGV.shift
72
+ $cli[:command] = command
73
+ command_opt = @command_opts[$cli[:command]]
74
+ rescue
75
+ error = "invalid COMMAND: #{command}" unless command.to_s.empty?
76
+ print_help @global, error
77
+ end
78
+
79
+ # Parse command flags
80
+ begin
81
+ command_opt.order!
82
+ rescue OptionParser::InvalidOption, OptionParser::MissingArgument => e
83
+ print_help command_opt, e
84
+ end
85
+
86
+ # Pop and verify third argument
87
+ begin
88
+ next_arg = ARGV.shift
89
+ case $cli[:command]
90
+ when 'search', 'show'
91
+ $cli[:type] = next_arg
92
+ when 'rename'
93
+ $cli[:path] = next_arg
94
+ end
95
+ rescue => e
96
+ print_help command_opt, e
97
+ end
98
+
99
+ # Verify args
100
+ begin
101
+ $cli[:args] = ARGV.join(' ')
102
+ rescue => e
103
+ print_help command_opt, e
104
+ end
105
+
106
+ $cli.execute
@@ -1,52 +1,52 @@
1
- require 'json'
2
- require 'nokogiri'
3
- require 'open-uri'
4
-
5
- $:.unshift(File.dirname(__FILE__))
6
-
7
- require 'cdb/cli'
8
- require 'cdb/renamer'
9
- require 'cdb/struct'
10
- require 'cdb/issue'
11
- require 'cdb/series'
12
-
13
- module CDB
14
- VERSION = '0.3.0'
15
-
16
- BASE_URL = 'http://www.comicbookdb.com'
17
- REQUEST_HEADERS = {'Connection' => 'keep-alive'}
18
- SEARCH_PATH = 'search.php'
19
-
20
- class << self; attr
21
-
22
- def search(query, type='FullSite')
23
- data = URI.encode_www_form(
24
- form_searchtype: type,
25
- form_search: query
26
- )
27
- url = "#{BASE_URL}/#{SEARCH_PATH}?#{data}"
28
- doc = read_page(url)
29
- node = doc.css('h2:contains("Search Results")').first.parent
30
- {
31
- :series => CDB::Series.parse_results(node),
32
- :issues => CDB::Issue.parse_results(node)
33
- }
34
- end
35
-
36
- def show(id, type)
37
- data = URI.encode_www_form('ID' => id)
38
- url = "#{BASE_URL}/#{type::WEB_PATH}?#{data}"
39
- page = read_page(url)
40
- type.parse_data(id, page)
41
- end
42
-
43
- private
44
-
45
- def read_page(url)
46
- content = open(url, REQUEST_HEADERS).read
47
- content.force_encoding('ISO-8859-1').encode!('UTF-8')
48
- Nokogiri::HTML(content)
49
- end
50
-
51
- end
52
- end
1
+ require 'json'
2
+ require 'nokogiri'
3
+ require 'open-uri'
4
+
5
+ $:.unshift(File.dirname(__FILE__))
6
+
7
+ require 'cdb/cli'
8
+ require 'cdb/renamer'
9
+ require 'cdb/struct'
10
+ require 'cdb/issue'
11
+ require 'cdb/series'
12
+
13
+ module CDB
14
+ VERSION = '0.3.1'
15
+
16
+ BASE_URL = 'http://www.comicbookdb.com'
17
+ REQUEST_HEADERS = {'Connection' => 'keep-alive'}
18
+ SEARCH_PATH = 'search.php'
19
+
20
+ class << self; attr
21
+
22
+ def search(query, type='FullSite')
23
+ data = URI.encode_www_form(
24
+ form_searchtype: type,
25
+ form_search: query
26
+ )
27
+ url = "#{BASE_URL}/#{SEARCH_PATH}?#{data}"
28
+ doc = read_page(url)
29
+ node = doc.css('h2:contains("Search Results")').first.parent
30
+ {
31
+ :series => CDB::Series.parse_results(node),
32
+ :issues => CDB::Issue.parse_results(node)
33
+ }
34
+ end
35
+
36
+ def show(id, type)
37
+ data = URI.encode_www_form('ID' => id)
38
+ url = "#{BASE_URL}/#{type::WEB_PATH}?#{data}"
39
+ page = read_page(url)
40
+ type.parse_data(id, page)
41
+ end
42
+
43
+ private
44
+
45
+ def read_page(url)
46
+ content = open(url, REQUEST_HEADERS).read
47
+ content.force_encoding('ISO-8859-1').encode!('UTF-8')
48
+ Nokogiri::HTML(content)
49
+ end
50
+
51
+ end
52
+ end
@@ -1,84 +1,84 @@
1
- require 'pp'
2
-
3
- module CDB
4
- class CLI
5
- COMMANDS = %w[search show rename]
6
- TYPES = %w[series issue issues]
7
-
8
- def initialize(options={})
9
- @options = options
10
- end
11
-
12
- def [](k)
13
- @options[k]
14
- end
15
-
16
- def []=(k, v)
17
- v = v.to_s.strip
18
- begin
19
- send("#{k}=", v)
20
- rescue NoMethodError
21
- @options[k] = v
22
- end
23
- end
24
-
25
- def execute
26
- send self[:command]
27
- end
28
-
29
- private
30
-
31
- def search
32
- case self[:type]
33
- when 'series'
34
- CDB::Series.search(self[:args]).each{|r| puts r.to_json}
35
- when 'issue', 'issues'
36
- CDB::Issue.search(self[:args]).each{|r| puts r.to_json}
37
- end
38
- end
39
-
40
- def show
41
- case self[:type]
42
- when 'series'
43
- res = CDB::Series.show(self[:args])
44
- res.issues.each{|i| i.series=nil}
45
- puts res.to_json(array_nl:"\n", object_nl:"\n", indent:' ')
46
- end
47
- end
48
-
49
- def rename
50
- renamer = CDB::Renamer.new(@options)
51
- renamer.execute
52
- end
53
-
54
- def args=(v)
55
- raise "invalid args" if v.empty?
56
- @options[:args] = v
57
- end
58
-
59
- def command=(v)
60
- v = v.downcase
61
- raise unless COMMANDS.include?(v)
62
- @options[:command] = v
63
- end
64
-
65
- def type=(v)
66
- v = v.downcase
67
- error = "invalid TYPE: #{v}" unless v.empty?
68
- if @options[:command] == 'show'
69
- # remove when "show issue" is supported
70
- raise error.to_s unless v == 'series'
71
- else
72
- raise error.to_s unless TYPES.include?(v)
73
- end
74
- @options[:type] = v
75
- end
76
-
77
- def path=(v)
78
- error = "#{v}: No such directory" unless v.empty?
79
- raise error.to_s unless File.directory?(v)
80
- @options[:path] = v
81
- end
82
-
83
- end
84
- end
1
+ require 'pp'
2
+
3
+ module CDB
4
+ class CLI
5
+ COMMANDS = %w[search show rename]
6
+ TYPES = %w[series issue issues]
7
+
8
+ def initialize(options={})
9
+ @options = options
10
+ end
11
+
12
+ def [](k)
13
+ @options[k]
14
+ end
15
+
16
+ def []=(k, v)
17
+ v = v.to_s.strip
18
+ begin
19
+ send("#{k}=", v)
20
+ rescue NoMethodError
21
+ @options[k] = v
22
+ end
23
+ end
24
+
25
+ def execute
26
+ send self[:command]
27
+ end
28
+
29
+ private
30
+
31
+ def search
32
+ case self[:type]
33
+ when 'series'
34
+ CDB::Series.search(self[:args]).each{|r| puts r.to_json}
35
+ when 'issue', 'issues'
36
+ CDB::Issue.search(self[:args]).each{|r| puts r.to_json}
37
+ end
38
+ end
39
+
40
+ def show
41
+ case self[:type]
42
+ when 'series'
43
+ res = CDB::Series.show(self[:args])
44
+ res.issues.each{|i| i.series=nil}
45
+ puts res.to_json(array_nl:"\n", object_nl:"\n", indent:' ')
46
+ end
47
+ end
48
+
49
+ def rename
50
+ renamer = CDB::Renamer.new(@options)
51
+ renamer.execute
52
+ end
53
+
54
+ def args=(v)
55
+ raise "invalid args" if v.empty?
56
+ @options[:args] = v
57
+ end
58
+
59
+ def command=(v)
60
+ v = v.downcase
61
+ raise unless COMMANDS.include?(v)
62
+ @options[:command] = v
63
+ end
64
+
65
+ def type=(v)
66
+ v = v.downcase
67
+ error = "invalid TYPE: #{v}" unless v.empty?
68
+ if @options[:command] == 'show'
69
+ # remove when "show issue" is supported
70
+ raise error.to_s unless v == 'series'
71
+ else
72
+ raise error.to_s unless TYPES.include?(v)
73
+ end
74
+ @options[:type] = v
75
+ end
76
+
77
+ def path=(v)
78
+ error = "#{v}: No such directory" unless v.empty?
79
+ raise error.to_s unless File.directory?(v)
80
+ @options[:path] = v
81
+ end
82
+
83
+ end
84
+ end
@@ -1,117 +1,122 @@
1
- module CDB
2
- class Renamer
3
- EXTENSIONS = %w[cbz cbr]
4
- ISSUE_NUM = '[\d\.]+\w?'
5
- INPUT_FORMAT = /#(#{ISSUE_NUM})/
6
- OUTPUT_FORMAT = "%{series} #%{padded_num} (%{cover_date})"
7
-
8
- def initialize(options)
9
- @path = options[:path]
10
- @cdb_id = options[:args]
11
- @force = options[:force]
12
- @ignore = options[:ignore]
13
- end
14
-
15
- def execute
16
- @rename_map =
17
- files.each_with_object({}) do |filename, map|
18
- map[filename]= transform(filename)
19
- end.select{|k,v| v}
20
-
21
- do_rename if verify_map
22
- end
23
-
24
- private
25
-
26
- def do_rename
27
- Dir.chdir(@path) do
28
- @rename_map.each do |source, destination|
29
- next if source == destination
30
- puts "#{pad(source)} => #{destination}"
31
- if @force
32
- %x[ mv "#{source}" "#{destination}" ]
33
- end
34
- end
35
- end
36
- end
37
-
38
- def verify_map
39
- dups = @rename_map.select do |k,v|
40
- @rename_map.values.count(v) > 1
41
- end
42
- dups.keys.uniq.each do |k|
43
- padded = pad(k, dups.keys.map(&:length).max)
44
- puts "ERROR: output name clash: #{padded} => #{dups[k]}"
45
- end
46
- dups.empty?
47
- end
48
-
49
- def transform(filename)
50
- return unless num = parse_issue_num(filename)
51
- if issue = issues[num]
52
- generate_output(filename, issue)
53
- else
54
- puts "WARNING: #{filename}: unknown issue: #{num}"
55
- end
56
- end
57
-
58
- def parse_issue_num(filename)
59
- if match = filename.match(INPUT_FORMAT)
60
- num = match[1].gsub(/^0+|\.$/,'')
61
- num = '0' if num == ''
62
- num
63
- else
64
- puts "WARNING: #{filename}: invalid input format" unless @ignore
65
- end
66
- end
67
-
68
- def generate_output(filename, issue)
69
- json = issue.as_json
70
- json[:series] = issue.series.name
71
- json[:padded_num] = pad_num(issue.num)
72
- output = OUTPUT_FORMAT % json
73
- sanitize(output + File.extname(filename))
74
- end
75
-
76
- def sanitize(filename)
77
- filename.gsub(/[:]/, ' -')
78
- .gsub(/[\/\\<>]/, '-')
79
- .gsub(/[\?\*|"]/, '_')
80
- end
81
-
82
- def pad(file, max=nil)
83
- max ||= files.map(&:length).max
84
- file + (' '*(max-file.length))
85
- end
86
-
87
- def pad_num(num, max=nil)
88
- max ||= max_num_length
89
- '0'*(max-num.to_s.length)+num.to_s
90
- end
91
-
92
- def files
93
- Dir.chdir(@path) do
94
- @files ||= EXTENSIONS
95
- .map{|e| Dir["*.#{e}"]}.flatten
96
- .select{|f| File.file?(f)}.sort
97
- end
98
- @files
99
- end
100
-
101
- def max_num_length
102
- @max_num ||= files.map{|f| parse_issue_num(f).length}.max
103
- end
104
-
105
- def series
106
- @series ||= CDB::Series.show(@cdb_id)
107
- end
108
-
109
- def issues
110
- # Only act on issues - not TPB, HC, or anything else
111
- @issues ||= Hash[series.issues
112
- .select{|i| i.num.match(/^#{ISSUE_NUM}$/)}
113
- .map{|i| [i.num.to_s, i]}]
114
- end
115
-
116
- end
117
- end
1
+ module CDB
2
+ class Renamer
3
+ EXTENSIONS = %w[cbz cbr]
4
+ ISSUE_NUM = '[\d\.]+[a-z]?'
5
+ INPUT_FORMAT = /#(#{ISSUE_NUM})/
6
+ OUTPUT_FORMAT = "%{series} #%{padded_num} %{name} (%{cover_date})"
7
+
8
+ def initialize(options)
9
+ @path = options[:path]
10
+ @cdb_id = options[:args]
11
+ @force = options[:force]
12
+ @ignore = options[:ignore]
13
+ end
14
+
15
+ def execute
16
+ @rename_map =
17
+ files.each_with_object({}) do |filename, map|
18
+ map[filename]= transform(filename)
19
+ end.select{|k,v| v}
20
+
21
+ do_rename if verify_map
22
+ end
23
+
24
+ private
25
+
26
+ def do_rename
27
+ Dir.chdir(@path) do
28
+ @rename_map.each do |source, destination|
29
+ next if source == destination
30
+ puts "#{pad(source)} => #{destination}"
31
+ if @force
32
+ %x[ mv "#{source}" "#{destination}" ]
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ def verify_map
39
+ dups = @rename_map.select do |k,v|
40
+ @rename_map.values.count(v) > 1
41
+ end
42
+ dups.keys.uniq.each do |k|
43
+ padded = pad(k, dups.keys.map(&:length).max)
44
+ puts "ERROR: output name clash: #{padded} => #{dups[k]}"
45
+ end
46
+ dups.empty?
47
+ end
48
+
49
+ def transform(filename)
50
+ return unless num = parse_issue_num(filename)
51
+ if issue = issues[num]
52
+ generate_output(filename, issue)
53
+ else
54
+ puts "WARNING: #{filename}: unknown issue: #{num}"
55
+ end
56
+ end
57
+
58
+ def parse_issue_num(filename)
59
+ base = filename.chomp(File.extname(filename))
60
+ if match = base.match(INPUT_FORMAT)
61
+ num = match[1].gsub(/^0+|\.$/,'')
62
+ num = '0' if num.empty?
63
+ num
64
+ else
65
+ puts "WARNING: #{filename}: invalid input format" unless @ignore
66
+ end
67
+ end
68
+
69
+ def generate_output(filename, issue)
70
+ json = issue.as_json
71
+ json[:series] = issue.series.name
72
+ json[:padded_num] = pad_num(issue.num)
73
+ json[:name] = "- #{json[:name]}" if !json[:name].empty?
74
+ output = OUTPUT_FORMAT % json
75
+ sanitize(output + File.extname(filename))
76
+ end
77
+
78
+ def sanitize(filename)
79
+ filename.gsub(/[:]/, ' -')
80
+ .gsub(/[\/\\<>]/, '-')
81
+ .gsub(/[\?\*|"]/, '_')
82
+ .gsub(/\s+/, ' ')
83
+ end
84
+
85
+ def pad(file, max=nil)
86
+ max ||= files.map(&:length).max
87
+ file + (' '*(max-file.length))
88
+ end
89
+
90
+ def pad_num(num, max=nil)
91
+ max ||= max_num_length
92
+ '0'*(max-num.to_s.split(/[\.\-]/)[0].length)+num.to_s
93
+ end
94
+
95
+ def files
96
+ Dir.chdir(@path) do
97
+ @files ||= EXTENSIONS
98
+ .map{|e| Dir["*.#{e}"]}.flatten
99
+ .select{|f| File.file?(f)}.sort
100
+ end
101
+ @files
102
+ end
103
+
104
+ def max_num_length
105
+ @max_num ||= files.map{|f|
106
+ parse_issue_num(f).to_s.split(/[\.\-]/)[0].length
107
+ }.max
108
+ end
109
+
110
+ def series
111
+ @series ||= CDB::Series.show(@cdb_id)
112
+ end
113
+
114
+ def issues
115
+ # Only act on issues - not TPB, HC, or anything else
116
+ @issues ||= Hash[series.issues
117
+ .select{|i| i.num.match(/^#{ISSUE_NUM}$/i)}
118
+ .map{|i| [i.num.to_s, i]}]
119
+ end
120
+
121
+ end
122
+ end
metadata CHANGED
@@ -1,30 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cdb-crawlr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
5
- prerelease:
4
+ version: 0.3.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Gabe Smith
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-11-15 00:00:00.000000000 Z
11
+ date: 2015-07-14 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: nokogiri
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  description: cdb-crawlr is a Ruby gem and command-line tool for querying ComicBookDB.com
@@ -35,35 +32,34 @@ executables:
35
32
  extensions: []
36
33
  extra_rdoc_files: []
37
34
  files:
35
+ - bin/cdb
36
+ - lib/cdb-crawlr.rb
38
37
  - lib/cdb/cli.rb
39
38
  - lib/cdb/issue.rb
40
39
  - lib/cdb/renamer.rb
41
40
  - lib/cdb/series.rb
42
41
  - lib/cdb/struct.rb
43
- - lib/cdb-crawlr.rb
44
- - bin/cdb
45
42
  homepage: https://github.com/sgtFloyd/cdb-crawlr
46
43
  licenses: []
44
+ metadata: {}
47
45
  post_install_message:
48
46
  rdoc_options: []
49
47
  require_paths:
50
48
  - lib
51
49
  required_ruby_version: !ruby/object:Gem::Requirement
52
- none: false
53
50
  requirements:
54
- - - ! '>='
51
+ - - ">="
55
52
  - !ruby/object:Gem::Version
56
53
  version: '0'
57
54
  required_rubygems_version: !ruby/object:Gem::Requirement
58
- none: false
59
55
  requirements:
60
- - - ! '>='
56
+ - - ">="
61
57
  - !ruby/object:Gem::Version
62
58
  version: '0'
63
59
  requirements: []
64
60
  rubyforge_project:
65
- rubygems_version: 1.8.24
61
+ rubygems_version: 2.2.2
66
62
  signing_key:
67
- specification_version: 3
63
+ specification_version: 4
68
64
  summary: Ruby gem and command-line tool for querying ComicBookDB.com
69
65
  test_files: []