scene-toolkit 0.2.6 → 0.3.0

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/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: