scene-toolkit 0.2.6 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,24 +1,27 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- scene-toolkit (0.2.4)
5
- activesupport (~> 3.0.0)
4
+ scene-toolkit (0.2.6)
5
+ active_support (>= 3.0.0)
6
6
  colored
7
7
  i18n
8
8
  nestful
9
+ nokogiri
9
10
  optitron
10
11
 
11
12
  GEM
12
13
  remote: http://rubygems.org/
13
14
  specs:
14
- activesupport (3.0.9)
15
- callsite (0.0.5)
16
- bundler (~> 1.0.0)
15
+ active_support (3.0.0)
16
+ activesupport (= 3.0.0)
17
+ activesupport (3.0.0)
18
+ callsite (0.0.11)
17
19
  colored (1.2)
18
20
  i18n (0.6.0)
19
- nestful (0.0.6)
21
+ nestful (0.0.8)
20
22
  activesupport (>= 3.0.0.beta)
21
- optitron (0.3.2)
23
+ nokogiri (1.5.0)
24
+ optitron (0.3.3)
22
25
  callsite (~> 0.0.4)
23
26
  parameters_extra (~> 0.2.0)
24
27
  parameters_extra (0.2.0)
@@ -28,9 +31,9 @@ GEM
28
31
  ruby2ruby (1.2.5)
29
32
  ruby_parser (~> 2.0)
30
33
  sexp_processor (~> 3.0)
31
- ruby_parser (2.0.6)
34
+ ruby_parser (2.3.1)
32
35
  sexp_processor (~> 3.0)
33
- sexp_processor (3.0.5)
36
+ sexp_processor (3.0.10)
34
37
 
35
38
  PLATFORMS
36
39
  ruby
data/bin/scene-toolkit CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby -rubygems
2
2
 
3
- require "bundler/setup"
3
+ $: << File.expand_path("../../lib", __FILE__)
4
4
  require 'scene_toolkit/cli'
5
5
 
6
6
  SceneToolkit::CLI.dispatch
@@ -1,23 +1,26 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'nestful'
4
+ require 'nokogiri'
4
5
  require 'scene_toolkit/ext'
5
6
 
6
7
  module SceneToolkit
7
8
  class CLI < Optitron::CLI
8
9
  class GoogleMatcher
9
10
  def self.match(name)
10
- regex = Regexp.new(Regexp.escape(name), Regexp::IGNORECASE)
11
- response = Nestful.get("http://www.google.com/search", :params => { :q => name, :num => 100 })
12
- response.scan(regex).uniq.reject(&:downcase?)
13
- end
14
- end
11
+ response = Nestful.get("http://www.google.com/search", :params => {:q => name, :num => 100})
12
+ response = Nokogiri::HTML(response).search(".g").text.encode("utf-8", "utf-8", :invalid => :replace)
15
13
 
16
- class OrlyDbMatcher
17
- def self.match(name)
18
- regex = Regexp.new(Regexp.escape(name), Regexp::IGNORECASE)
19
- response = Nestful.get("http://orlydb.com", :params => { :q => name.to_search_string })
20
- response.scan(regex).uniq.reject(&:downcase?)
14
+ if name =~ /[\d+]$/ # artist-ablum-2012
15
+ regex = /#{Regexp.escape(name)}(?:-[A-Za-z0-9]+)*/i
16
+ matches = response.scan(regex).reject(&:downcase?).reject { |m| m.size == name.size }.uniq
17
+
18
+ else # artist-ablum-2012-group
19
+ regex = /#{Regexp.escape(name)}/i
20
+ matches = response.scan(regex).reject(&:downcase?).select { |m| m.size == name.size }.uniq
21
+ end
22
+
23
+ matches.reject { |m| m == name }.select { |m| m =~ Release::Validations::Name::REGEXP }
21
24
  end
22
25
  end
23
26
 
@@ -36,7 +39,8 @@ module SceneToolkit
36
39
  next if release_name.blank?
37
40
 
38
41
  match = nil
39
- [OrlyDbMatcher, GoogleMatcher].each do |matcher|
42
+ matches = []
43
+ [GoogleMatcher].each do |matcher|
40
44
  matches = matcher.match(release_name)
41
45
  if matches.one?
42
46
  match = matches.first
@@ -47,8 +51,10 @@ module SceneToolkit
47
51
  if match.present?
48
52
  heading(release, :green) { info "Renamed #{release.name} => #{match}" }
49
53
  release.rename!(match)
54
+ elsif matches.any?
55
+ heading(release, :red) { error (["Multiple matches found for #{release_name}:"] + matches).join("\r\n * ") }
50
56
  else
51
- heading(release, :red) { error "No matches found for #{release.name}" }
57
+ heading(release, :red) { error "No matches found for #{release_name}" }
52
58
  end
53
59
  end
54
60
  end
@@ -26,18 +26,14 @@ module SceneToolkit
26
26
  end
27
27
 
28
28
  def print_errors(release)
29
- release.errors.each do |validation, errors|
30
- errors.each do |error|
31
- warn "[#{validation.to_s.humanize}] #{error}"
32
- end
29
+ release.errors.uniq.each do |message|
30
+ error(message)
33
31
  end
34
32
  end
35
33
 
36
34
  def print_warnings(release)
37
- release.warnings.each do |validation, warnings|
38
- warnings.each do |warning|
39
- warn "[#{validation.to_s.humanize}] #{warning}"
40
- end
35
+ release.warnings.each do |message|
36
+ warn(message)
41
37
  end
42
38
  end
43
39
 
@@ -15,15 +15,9 @@ module SceneToolkit
15
15
  heading(release, :green) do
16
16
  print_errors(release)
17
17
 
18
- candidates = release.files.select { |f| %w(.nfo .m3u .sfv).include?(File.extname(f).downcase) }.group_by { |f| File.basename(f, '.*') }
19
- if candidates.none?
20
- error "Unable to guess playlist filename"
21
- next
22
- end
23
-
24
- playlist_filename = [candidates.max { |k, v| v.size }.first, ".m3u"].join
25
-
18
+ playlist_filename = release.heuristic_filename("m3u")
26
19
  playlist_path = File.join(release.path, playlist_filename)
20
+
27
21
  if File.exist?(playlist_path) and not params["force"]
28
22
  error "Playlist #{playlist_filename} already exists. Use --force to replace it."
29
23
  else
@@ -10,25 +10,26 @@ module SceneToolkit
10
10
  opt "ignore-filename-case", "Ignore case when validating SFV/M3U filenames"
11
11
  opt "move-invalid-to", "Move INVALID releases to specified folder", :type => :string
12
12
  opt "move-valid-to", "Move VALID releases to specified folder", :type => :string
13
+ opt "repository", "Directory to look up in order to resolve missing files", :type => :string
13
14
 
14
15
  def verify(directory_string)
15
16
  validations_to_exec = []
16
- SceneToolkit::Release.available_validations.keys.each do |name|
17
+ SceneToolkit::Release.available_validations.each do |name|
17
18
  validations_to_exec << name if params.delete(name).eql?(true)
18
19
  end
19
20
 
20
21
  if validations_to_exec.none?
21
- validations_to_exec = SceneToolkit::Release::available_validations.keys
22
+ validations_to_exec = SceneToolkit::Release::available_validations
22
23
  end
23
24
 
24
25
  invalid_target_directory = params.delete("move-invalid-to")
25
26
  unless invalid_target_directory.nil?
26
- raise ArgumentError.new("#{invalid_target_directory} does not exist") unless File.directory?(invalid_target_directory)
27
+ raise ArgumentError.new("#{invalid_target_directory.inspect} does not exist") unless File.directory?(invalid_target_directory)
27
28
  end
28
29
 
29
30
  valid_target_directory = params.delete("move-valid-to")
30
31
  unless valid_target_directory.nil?
31
- raise ArgumentError.new("#{invalid_target_directory} does not exist") unless File.directory?(valid_target_directory)
32
+ raise ArgumentError.new("#{valid_target_directory.inspect} does not exist") unless File.directory?(valid_target_directory)
32
33
  end
33
34
 
34
35
  release_count = 0
@@ -37,7 +38,7 @@ module SceneToolkit
37
38
 
38
39
  each_release(directory_string) do |release|
39
40
  release_count += 1
40
- if release.valid?(validations_to_exec, :case_sensitive => !params["ignore-filename-case"])
41
+ if release.valid?(validations_to_exec, params)
41
42
  valid_releases += 1
42
43
  if not params["hide-valid"] or not valid_target_directory.nil?
43
44
  heading(release, :green) do
@@ -9,54 +9,63 @@ module SceneToolkit
9
9
  end
10
10
 
11
11
  def valid_checksum?(params = {})
12
- @errors[:checksum], @warnings[:checksum] = [], []
12
+ recover_file!(self.heuristic_filename("sfv"), params["repository"]) if params["repository"] and sfv_files.none?
13
+
13
14
  if sfv_files.any?
14
15
  sfv_files.each do |sfv|
15
16
  begin
16
- validate_checksum(sfv)
17
+ validate_checksum(sfv, params)
17
18
  rescue => e
18
- @errors[:checksum] << e.message
19
+ @errors << e.message
19
20
  end
20
21
  end
21
22
  else
22
- @errors[:checksum] << "No *.sfv files found"
23
+ file_not_found!(self.heuristic_filename("sfv"))
23
24
  end
24
- @errors[:checksum].empty?
25
+
26
+ @errors.none?
25
27
  end
26
28
 
27
29
  protected
28
30
 
29
- def validate_checksum(sfv)
30
- files_to_check = files.inject({ }) do |collection, file|
31
+ def validate_checksum(sfv, params)
32
+ filenames = files.each_with_object({}) do |file, collection|
31
33
  collection[File.basename(file).downcase] = File.expand_path(file)
32
- collection
33
34
  end
34
35
 
35
- matched_something = false
36
+ filename_match = false
36
37
  File.read(sfv, :mode => "rb").split(/[\r\n]+/).each do |line|
37
38
  line.strip!
38
39
 
39
40
  if (/(generated|raped)/i =~ line and not /MorGoTH/i =~ line)
40
- @warnings[:checksum] << "Possibly tampered SFV: #{line.strip}"
41
+ @warnings << "Possibly tampered SFV: #{line.strip}"
41
42
  end
42
43
 
43
44
  if match = /^(.+?)\s+([\dA-Fa-f]{8})$/.match(line)
44
- matched_something = true
45
+ filename_match = true
45
46
  filename, checksum = match.captures
46
47
  filename.strip!
47
48
  next if filename.blank? or filename.start_with?("#") or filename.start_with?(";")
48
49
  filename.downcase!
49
50
 
50
- if files_to_check.has_key?(filename)
51
- unless Zlib.crc32(File.read(files_to_check[filename])).eql?(checksum.hex)
52
- @errors[:checksum] << "File #{filename} is corrupted"
51
+ if params["repository"] and not filenames.has_key?(filename)
52
+ recover_file!(filename, params["repository"])
53
+ filenames = files.each_with_object({}) do |file, collection|
54
+ collection[File.basename(file).downcase] = File.expand_path(file)
55
+ end
56
+ end
57
+
58
+ if filenames.has_key?(filename)
59
+ unless Zlib.crc32(File.read(filenames[filename])).eql?(checksum.hex)
60
+ recover_file!(File.basename(filenames[filename]), params["repository"], false) if params["repository"]
61
+ unless Zlib.crc32(File.read(filenames[filename])).eql?(checksum.hex)
62
+ @errors << "File #{filename.inspect} is corrupted. (#{filename.to_search_string})"
63
+ end
53
64
  end
54
- else
55
- @errors[:checksum] << "File #{filename} not found"
56
65
  end
57
66
  end
58
67
  end
59
- @warnings[:checksum] << "No files to verify found" unless matched_something
68
+ @errors << "No files to verify found" unless filename_match
60
69
  end
61
70
  end
62
71
  end
@@ -2,20 +2,25 @@ module SceneToolkit
2
2
  class Release
3
3
  module Validations
4
4
  module Files
5
- REQUIRED_FILES = [:sfv, :nfo, :m3u]
5
+ REQUIRED_FILES_EXT = [:sfv, :nfo, :m3u]
6
6
 
7
7
  def self.included(base)
8
8
  base.register_validation(:files, "Validate inclusion of required files")
9
9
  end
10
10
 
11
11
  def valid_files?(params = {})
12
- @errors[:files], @warnings[:files] = [], []
13
- REQUIRED_FILES.each do |ext|
14
- file_count = send("#{ext}_files")
15
- @errors[:files] << "No *.#{ext} files found." if file_count.none?
16
- @warnings[:files] << "Multiple *.#{ext} files found." if file_count.size > 1
12
+ REQUIRED_FILES_EXT.each do |ext|
13
+ if params["repository"] and not File.exists?(File.join(self.path, self.heuristic_filename(ext)))
14
+ recover_file!(self.heuristic_filename(ext), params["repository"])
15
+ end
16
+
17
+ required_files = send("#{ext}_files")
18
+
19
+ file_not_found!(self.heuristic_filename(ext)) if required_files.none?
20
+
21
+ @warnings << "Multiple *.#{ext} files found." if required_files.size > 1
17
22
  end
18
- @warnings[:files].empty?
23
+ @errors.none?
19
24
  end
20
25
  end
21
26
  end
@@ -2,19 +2,17 @@ module SceneToolkit
2
2
  class Release
3
3
  module Validations
4
4
  module Name
5
- REGEXP = /^([A-Z0-9\-_.()&]+)\-(\d{4}|\d{3}x|\d{2}xx)\-([A-Z0-9_]+)$/i
5
+ REGEXP = /^([A-Z0-9\-\_\.\(\)\&]+)\-(\d{4}|\d{3}x|\d{2}xx)\-([A-Z0-9\_\-]+)$/i
6
6
 
7
7
  def self.included(base)
8
8
  base.register_validation(:name, "Validate release name")
9
9
  end
10
10
 
11
11
  def valid_name?(params = {})
12
- @errors[:name], @warnings[:name] = [], []
12
+ @errors << "#{@name.inspect} is not a valid scene release name" unless @name =~ REGEXP
13
+ @errors << "#{@name.inspect} is lowercased" if @name.eql?(@name.downcase)
13
14
 
14
- @errors[:name] << "Release name is not a valid scene release name" unless @name =~ REGEXP
15
- @errors[:name] << "Release name is lowercased" if @name.eql?(@name.downcase)
16
- @errors[:name] << "Release name is uppercased" if @name.eql?(@name.upcase)
17
- @errors[:name].empty?
15
+ @errors.none?
18
16
  end
19
17
  end
20
18
  end
@@ -7,21 +7,22 @@ module SceneToolkit
7
7
  end
8
8
 
9
9
  def valid_playlist?(params = {})
10
- @errors[:playlist], @warnings[:playlist] = [], []
10
+ recover_file!(self.heuristic_filename("m3u"), params["repository"]) if params["repository"] and m3u_files.none?
11
+
11
12
  if m3u_files.any?
12
13
  m3u_files.each do |playlist|
13
14
  begin
14
- validate_playlist(playlist, params[:case_sensitive])
15
+ validate_playlist(playlist, params["case-sensitive"])
15
16
  rescue => e
16
- @errors[:playlist] << e.message
17
+ @errors << e.message
17
18
  end
18
19
  end
19
20
  else
20
- @errors[:playlist] << "No *.m3u files found"
21
+ file_not_found!(self.heuristic_filename("m3u"))
21
22
  end
22
- @errors[:playlist].empty?
23
- end
24
23
 
24
+ @errors.none?
25
+ end
25
26
 
26
27
  protected
27
28
 
@@ -30,16 +31,12 @@ module SceneToolkit
30
31
  filename.strip!
31
32
  next if filename.blank? or filename.start_with?("#") or filename.start_with?(";")
32
33
  if case_sensitive
33
- file_not_found(filename) unless File.exist?(File.join(@path, filename))
34
+ file_not_found!(filename) unless File.exist?(File.join(@path, filename))
34
35
  else
35
- file_not_found(filename) unless files.select { |file| file.downcase == File.join(@path, filename).downcase }.any?
36
+ file_not_found!(filename) unless files.select { |file| file.downcase == File.join(@path, filename).downcase }.any?
36
37
  end
37
38
  end
38
39
  end
39
-
40
- def file_not_found(filename)
41
- @errors[:playlist] << "File #{filename} not found"
42
- end
43
40
  end
44
41
  end
45
42
  end
@@ -1,25 +1,48 @@
1
- require 'active_support/concern'
2
- require "active_support/core_ext/class/attribute_accessors"
1
+ require 'active_support/all'
3
2
 
4
3
  module SceneToolkit
5
4
  class Release
6
5
  module Validations
7
6
  extend ActiveSupport::Concern
8
7
 
9
- def valid?(validations_to_exec = @available_validations, params = { })
10
- @errors, @warnings = { }, { }
8
+ def valid?(validations_to_exec = @available_validations, params = {})
11
9
  validations_to_exec.each do |name|
12
10
  send("valid_#{name}?", params)
13
11
  end
14
- @errors.values.sum { |errors| errors.size }.zero?
12
+ @errors.none?
13
+ end
14
+
15
+ protected
16
+
17
+ def recover_file!(filename, repository, warn = true)
18
+ if repository_file = lookup_file(filename, repository)
19
+ target_file = File.join(self.path, filename)
20
+
21
+ unless File.expand_path(target_file) == File.expand_path(repository_file)
22
+ @warnings << " * File #{filename.inspect} recovered from #{File.dirname(repository_file).inspect}"
23
+
24
+ File.delete(target_file) if File.exists?(target_file)
25
+ FileUtils.mv(repository_file, target_file)
26
+ end
27
+ else
28
+ file_not_found!(filename)
29
+ end
30
+ end
31
+
32
+ def lookup_file(filename, repository)
33
+ Dir.glob(File.join(Shellwords.shellescape(repository), "**", Shellwords.shellescape(filename))).first
34
+ end
35
+
36
+ def file_not_found!(filename)
37
+ @errors << "File #{filename.inspect} not found. (#{filename.to_search_string})"
15
38
  end
16
39
 
17
40
  included do
18
41
  cattr_accessor :available_validations
19
- @@available_validations = { }
42
+ @@available_validations = []
20
43
 
21
44
  def self.register_validation(name, description)
22
- @@available_validations[name] = description
45
+ @@available_validations << name
23
46
  end
24
47
  end
25
48
  end
@@ -1,10 +1,10 @@
1
1
  require 'scene_toolkit/release/helpers'
2
2
  require 'scene_toolkit/release/auto_rename'
3
3
  require 'scene_toolkit/release/validations'
4
- require 'scene_toolkit/release/validations/checksum'
5
4
  require 'scene_toolkit/release/validations/name'
6
- require 'scene_toolkit/release/validations/playlist'
7
5
  require 'scene_toolkit/release/validations/files'
6
+ require 'scene_toolkit/release/validations/playlist'
7
+ require 'scene_toolkit/release/validations/checksum'
8
8
 
9
9
  module SceneToolkit
10
10
  class Release
@@ -15,23 +15,38 @@ module SceneToolkit
15
15
  include AutoRename
16
16
  include Helpers
17
17
 
18
- include Validations::Checksum
19
18
  include Validations::Name
20
- include Validations::Playlist
21
19
  include Validations::Files
20
+ include Validations::Playlist
21
+ include Validations::Checksum
22
22
 
23
23
  def initialize(path)
24
24
  @path = File.expand_path(path)
25
25
  @name = File.basename(path)
26
- @errors, @warnings = { }, { }
26
+ @errors, @warnings = [], []
27
27
  end
28
28
 
29
29
  def heuristic_name
30
- files = (m3u_files + nfo_files + sfv_files).map { |f| File.basename(f, ".*") }
31
- candidates = files.group_by { |name| name }.max { |a, b| a.last.size <=> b.last.size }
32
- if candidates
30
+ if candidates = common_filenames
33
31
  candidates.first.gsub(/^\d+[-_]/, "")
32
+ else
33
+ self.name
34
+ end
35
+ end
36
+
37
+ def heuristic_filename(ext)
38
+ if candidates = common_filenames
39
+ "#{candidates.first}.#{ext}"
40
+ else
41
+ "00-#{self.name.downcase}.#{ext}"
34
42
  end
35
43
  end
44
+
45
+ protected
46
+
47
+ def common_filenames
48
+ files = (m3u_files + nfo_files + sfv_files).map { |f| File.basename(f, ".*") }
49
+ files.group_by { |name| name }.max { |a, b| a.last.size <=> b.last.size }
50
+ end
36
51
  end
37
52
  end
data/lib/scene_toolkit.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module SceneToolkit
2
- VERSION = "0.2.6"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -14,10 +14,11 @@ Gem::Specification.new do |s|
14
14
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
15
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
16
16
 
17
- s.add_dependency("activesupport", ["~> 3.0.0"])
17
+ s.add_dependency("active_support", [">= 3.0.0"])
18
18
  s.add_dependency("i18n")
19
19
  s.add_dependency("colored")
20
20
  s.add_dependency("optitron")
21
21
  s.add_dependency("nestful")
22
+ s.add_dependency("nokogiri")
22
23
  end
23
24
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scene-toolkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,27 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-08-16 00:00:00.000000000 Z
12
+ date: 2012-09-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: activesupport
16
- requirement: &70191468494620 !ruby/object:Gem::Requirement
15
+ name: active_support
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ~>
19
+ - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
21
  version: 3.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70191468494620
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 3.0.0
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: i18n
27
- requirement: &70191468510280 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: '0'
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *70191468510280
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: colored
38
- requirement: &70191468509620 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: '0'
44
54
  type: :runtime
45
55
  prerelease: false
46
- version_requirements: *70191468509620
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: optitron
49
- requirement: &70191468509160 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: '0'
55
70
  type: :runtime
56
71
  prerelease: false
57
- version_requirements: *70191468509160
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: nestful
60
- requirement: &70191468508700 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,7 +85,28 @@ dependencies:
65
85
  version: '0'
66
86
  type: :runtime
67
87
  prerelease: false
68
- version_requirements: *70191468508700
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: nokogiri
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
69
110
  description: Tool to assist scene MP3 library maintenance
70
111
  email:
71
112
  - knoopx@gmail.com
@@ -118,8 +159,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
118
159
  version: '0'
119
160
  requirements: []
120
161
  rubyforge_project:
121
- rubygems_version: 1.8.6
162
+ rubygems_version: 1.8.24
122
163
  signing_key:
123
164
  specification_version: 3
124
165
  summary: Tool to assist scene MP3 library maintenance
125
166
  test_files: []
167
+ has_rdoc: