scene-toolkit 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -10,9 +10,9 @@ begin
10
10
  gem.email = "knoopx@gmail.com"
11
11
  gem.homepage = "http://github.com/knoopx/scene-toolkit"
12
12
  gem.authors = ["Víctor Martínez"]
13
- gem.add_dependency "optitron", ">= 0.0.7"
14
- gem.add_dependency "activesupport", ">= 2.3.5"
15
- gem.add_dependency "rainbow", ">= 1.1"
13
+ gem.add_dependency "optitron", "~> 0.0.9"
14
+ gem.add_dependency "activesupport", "~> 2.3.5"
15
+ gem.add_dependency "rainbow", "~> 1.1"
16
16
  end
17
17
  Jeweler::GemcutterTasks.new
18
18
  rescue LoadError
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.1.4
data/bin/scene-toolkit CHANGED
@@ -1,20 +1,17 @@
1
- #!/usr/bin/env ruby
1
+ #!/usr/bin/env ruby -rubygems
2
2
 
3
3
  $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib')))
4
4
 
5
- require 'rubygems'
6
- require 'optitron'
7
5
  require 'scene_toolkit'
8
6
 
9
-
10
7
  Optitron.dispatch(SceneToolkit::CLI.new) do
11
-
12
8
  cmd "verify", "Verify library or release. Executes all validations if none specified" do
13
9
  arg "directory", "The root directory to verify"
14
10
  opt "name", "Validate release name"
15
11
  opt "required-files", "Validate inclusion of required files"
12
+ opt "playlist", "Validate playlist against existing files"
16
13
  opt "checksum", "Validate release CRC-32 checksum"
17
- opt "display-valid", "Display valid releases too"
14
+ opt "hide-valid", "Do not display valid releases"
18
15
  opt "flush-cache", "Flush file modification cache"
19
16
  opt "move-invalid-to", "Move INVALID releases to specified folder", :type => :string
20
17
  opt "move-valid-to", "Move VALID releases to specified folder", :type => :string
@@ -27,7 +27,17 @@ class SceneToolkit::Cache::Releases
27
27
  def errors(release, validations = SceneToolkit::Release::VALIDATIONS)
28
28
  @cache.transaction(true) do
29
29
  if @cache[@cache_key].has_key?(release.path)
30
- @cache[@cache_key][release.path][:errors].reject{ |validation, errors| not validations.include?(validation) }
30
+ @cache[@cache_key][release.path][:errors].reject { |validation, errors| not validations.include?(validation) }
31
+ else
32
+ raise RuntimeError.new("Release not catched")
33
+ end
34
+ end
35
+ end
36
+
37
+ def warnings(release, validations = SceneToolkit::Release::VALIDATIONS)
38
+ @cache.transaction(true) do
39
+ if @cache[@cache_key].has_key?(release.path)
40
+ @cache[@cache_key][release.path][:warnings].reject { |validation, warnings| not validations.include?(validation) }
31
41
  else
32
42
  raise RuntimeError.new("Release not catched")
33
43
  end
@@ -56,6 +66,7 @@ class SceneToolkit::Cache::Releases
56
66
  @cache.transaction do
57
67
  @cache[@cache_key][release.path] = {}
58
68
  @cache[@cache_key][release.path][:errors] = release.errors
69
+ @cache[@cache_key][release.path][:warnings] = release.warnings
59
70
  @cache[@cache_key][release.path][:files] = Dir.glob(File.join(release.path, "*")).inject({}) do |collection, f|
60
71
  collection[File.basename(f)] = File.stat(f).mtime
61
72
  collection
@@ -1,4 +1,9 @@
1
1
  require 'fileutils'
2
+
3
+ gem 'rainbow', "~> 1.1"
4
+ gem "optitron", "~> 0.0.9"
5
+
6
+ require 'optitron'
2
7
  require 'rainbow'
3
8
 
4
9
  class SceneToolkit::CLI
@@ -43,33 +48,31 @@ class SceneToolkit::CLI
43
48
 
44
49
  if release.valid?(validations)
45
50
  valid_releases += 1
46
- if opts[:display_valid]
47
- puts release.name.foreground(:green)
48
- puts release.path
49
- puts
50
- end
51
-
52
- unless valid_target_directory.nil?
53
- move_release(release, valid_target_directory)
54
- end
51
+ puts release.name.foreground(:green) unless opts[:hide_valid]
52
+ move_release(release, valid_target_directory) unless valid_target_directory.nil?
55
53
  else
56
54
  invalid_releases += 1
57
55
  puts release.name.foreground(:red)
58
- puts release.path
59
- release.errors.each do |validation, errors|
60
- errors.each do |error|
61
- puts " - #{error}"
62
- end
63
- end
56
+ move_release(release, invalid_target_directory) unless invalid_target_directory.nil?
57
+ end
64
58
 
65
- puts
59
+ puts release.path
66
60
 
67
- unless invalid_target_directory.nil?
68
- move_release(release, invalid_target_directory)
61
+ puts "#{release.errors.values.sum(&:count)} errors"
62
+ release.errors.each do |validation, errors|
63
+ errors.each do |error|
64
+ puts " - #{error}".foreground(:red)
69
65
  end
66
+ end
70
67
 
71
- puts
68
+ puts "#{release.warnings.values.sum(&:count)} warnings"
69
+ release.warnings.each do |validation, warnings|
70
+ warnings.each do |warning|
71
+ puts " - #{warning}".foreground(:yellow)
72
+ end
72
73
  end
74
+
75
+ puts
73
76
  end
74
77
 
75
78
  puts "#{valid_releases} of #{release_count} releases valid".foreground(:yellow)
@@ -3,21 +3,21 @@ require 'zlib'
3
3
 
4
4
  class SceneToolkit::Release
5
5
  REQUIRED_FILES = [:sfv, :nfo, :m3u]
6
- VALIDATIONS = [:name, :required_files, :checksum]
6
+ VALIDATIONS = [:name, :required_files, :playlist, :checksum]
7
7
 
8
8
  attr_accessor :name, :path, :uid
9
- attr_accessor :errors
9
+ attr_accessor :errors, :warnings
10
10
 
11
11
  def initialize(path, cache)
12
12
  @cache = cache
13
13
  @path = path
14
14
  @name = File.basename(path)
15
15
  @uid = Digest::MD5.hexdigest(@name.downcase.gsub(/[^A-Z0-9]/i, ' ').gsub(/\s+/, ' '))
16
- @errors = {}
16
+ @errors, @warnings = {}, {}
17
17
  end
18
18
 
19
19
  def valid?(validations = VALIDATIONS)
20
- @errors = {}
20
+ @errors, @warnings = {}, {}
21
21
 
22
22
  if @cache.releases.modified?(self)
23
23
  # if release was modified, invalidate all cached validations
@@ -34,26 +34,45 @@ class SceneToolkit::Release
34
34
  else
35
35
  @errors.merge!(validation_errors)
36
36
  end
37
+
38
+ validation_warnings = @cache.releases.warnings(self, [validation])
39
+ if validation_warnings.nil?
40
+ # execute validation if release was catched but this particular validation was not executed
41
+ send("valid_#{validation}?")
42
+ else
43
+ @warnings.merge!(validation_warnings)
44
+ end
37
45
  end
38
46
  end
39
-
40
- @cache.releases.store(self)
41
47
 
48
+ @cache.releases.store(self)
42
49
  @errors.sum { |validation, errors| errors.size }.zero?
43
50
  end
44
51
 
45
52
  def valid_required_files?
46
- @errors[:required_files] = []
53
+ @errors[:required_files], @warnings[:required_files] = [], []
47
54
  REQUIRED_FILES.each do |ext|
48
55
  file_count = send("#{ext}_files")
49
56
  @errors[:required_files] << "No #{ext} found." if file_count.none?
50
- @errors[:required_files] << "Multiple #{ext} found." if file_count.size > 1
57
+ @warnings[:required_files] << "Multiple #{ext} found." if file_count.size > 1
58
+ end
59
+ end
60
+
61
+ def valid_playlist?
62
+ @errors[:playlist], @warnings[:playlist] = [], []
63
+ playlist = m3u_files.first
64
+
65
+ unless playlist.nil?
66
+ File.read(m3u_files.first).split(/[\r\n]+/).each do |track|
67
+ next if track.blank? or track.start_with?("#")
68
+ @errors[:playlist] << "File not found #{track}" unless File.exist?(File.join(@path, track))
69
+ end
51
70
  end
52
71
  end
53
72
 
54
73
  def valid_checksum?
55
- @errors[:checksum] = []
56
-
74
+ @errors[:checksum], @warnings[:checksum] = [], []
75
+
57
76
  sfv_file = sfv_files.first
58
77
 
59
78
  return if sfv_file.nil?
@@ -67,9 +86,9 @@ class SceneToolkit::Release
67
86
  matched_something = false
68
87
 
69
88
  File.read(sfv_file).split(/[\r\n]+/).each do |line|
70
- # if (/(generated|raped)/i =~ line and not /MorGoTH/i =~ line)
71
- # @errors << "Possibly tampered SFV: #{line.strip}"
72
- # end
89
+ if (/(generated|raped)/i =~ line and not /MorGoTH/i =~ line)
90
+ @warnings[:checksum] << "Possibly tampered SFV: #{line.strip}"
91
+ end
73
92
 
74
93
  if match = /^(.+?)\s+([\dA-Fa-f]{8})$/.match(line)
75
94
  filename, checksum = match.captures
@@ -86,7 +105,7 @@ class SceneToolkit::Release
86
105
  end
87
106
 
88
107
  def valid_name?
89
- @errors[:name] = []
108
+ @errors[:name], @warnings[:name] = [], []
90
109
  @errors[:name] << "Release name is not a valid scene release name" unless @name =~ /^([A-Z0-9\-_.()&]+)\-(\d{4}|\d{3}x|\d{2}xx)\-([A-Z0-9_]+)$/i
91
110
  @errors[:name] << "Release name is lowercased" if @name.eql?(@name.downcase)
92
111
  @errors[:name] << "Release name is uppercased" if @name.eql?(@name.upcase)
@@ -95,10 +114,10 @@ class SceneToolkit::Release
95
114
  def files
96
115
  Dir.glob(File.join(@path, "*"))
97
116
  end
98
-
117
+
99
118
  class << self
100
119
  protected
101
-
120
+
102
121
  def has_files_with_extension(*exts)
103
122
  exts.each do |ext|
104
123
  define_method "#{ext}_files" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scene-toolkit
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 3
10
- version: 0.1.3
9
+ - 4
10
+ version: 0.1.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - "V\xC3\xADctor Mart\xC3\xADnez"
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-19 00:00:00 +02:00
18
+ date: 2010-08-23 00:00:00 +02:00
19
19
  default_executable: scene-toolkit
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -24,14 +24,14 @@ dependencies:
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ">="
27
+ - - ~>
28
28
  - !ruby/object:Gem::Version
29
- hash: 17
29
+ hash: 13
30
30
  segments:
31
31
  - 0
32
32
  - 0
33
- - 7
34
- version: 0.0.7
33
+ - 9
34
+ version: 0.0.9
35
35
  type: :runtime
36
36
  version_requirements: *id001
37
37
  - !ruby/object:Gem::Dependency
@@ -40,7 +40,7 @@ dependencies:
40
40
  requirement: &id002 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
- - - ">="
43
+ - - ~>
44
44
  - !ruby/object:Gem::Version
45
45
  hash: 9
46
46
  segments:
@@ -56,7 +56,7 @@ dependencies:
56
56
  requirement: &id003 !ruby/object:Gem::Requirement
57
57
  none: false
58
58
  requirements:
59
- - - ">="
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  hash: 13
62
62
  segments: