cinesync 0.9.6 → 1.0.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.
data/Rakefile CHANGED
@@ -16,7 +16,7 @@ begin
16
16
  gem.authors = ["Jonathon Mah", "Rising Sun Research"]
17
17
  gem.add_dependency "activesupport", ">= 2.3"
18
18
  gem.add_dependency "andand", ">= 1.3.1"
19
- gem.add_dependency "builder", ">= 2.1"
19
+ gem.add_development_dependency "bacon", ">= 1.0"
20
20
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
21
21
  end
22
22
  Jeweler::GemcutterTasks.new
@@ -25,18 +25,18 @@ rescue LoadError
25
25
  end
26
26
 
27
27
  require 'rake/testtask'
28
- Rake::TestTask.new(:test) do |test|
29
- test.libs << 'lib' << 'test'
30
- test.pattern = 'test/**/test_*.rb'
31
- test.verbose = true
28
+ Rake::TestTask.new(:spec) do |spec|
29
+ spec.libs << 'lib' << 'spec'
30
+ spec.pattern = 'spec/**/*_spec.rb'
31
+ spec.verbose = true
32
32
  end
33
33
 
34
34
  begin
35
35
  require 'rcov/rcovtask'
36
- Rcov::RcovTask.new do |test|
37
- test.libs << 'test'
38
- test.pattern = 'test/**/test_*.rb'
39
- test.verbose = true
36
+ Rcov::RcovTask.new do |spec|
37
+ spec.libs << 'spec'
38
+ spec.pattern = 'spec/**/*_spec.rb'
39
+ spec.verbose = true
40
40
  end
41
41
  rescue LoadError
42
42
  task :rcov do
@@ -44,9 +44,9 @@ rescue LoadError
44
44
  end
45
45
  end
46
46
 
47
- task :test => :check_dependencies
47
+ task :spec => :check_dependencies
48
48
 
49
- task :default => :test
49
+ task :default => :spec
50
50
 
51
51
  require 'rake/rdoctask'
52
52
  Rake::RDocTask.new do |rdoc|
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.6
1
+ 1.0.1
data/cinesync.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{cinesync}
8
- s.version = "0.9.6"
8
+ s.version = "1.0.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jonathon Mah", "Rising Sun Research"]
12
- s.date = %q{2010-05-08}
12
+ s.date = %q{2010-05-28}
13
13
  s.description = %q{ This gem provides a Ruby interface to the cineSync session file format,
14
14
  which is used by cineSync's scripting system. Use it to integrate
15
15
  cineSync into your workflow.
@@ -25,12 +25,14 @@ Gem::Specification.new do |s|
25
25
  "LICENSE",
26
26
  "README.markdown",
27
27
  "Rakefile",
28
- "Samples/Export Notes to CSV.rb",
29
28
  "VERSION",
30
29
  "cineSync Session v3 Schema.rnc",
31
30
  "cinesync.gemspec",
31
+ "examples/Export Notes to CSV.rb",
32
+ "examples/Start Session.rb",
32
33
  "lib/cinesync.rb",
33
34
  "lib/cinesync/color_grading.rb",
35
+ "lib/cinesync/commands.rb",
34
36
  "lib/cinesync/event_handler.rb",
35
37
  "lib/cinesync/frame_annotation.rb",
36
38
  "lib/cinesync/mask.rb",
@@ -43,7 +45,31 @@ Gem::Specification.new do |s|
43
45
  "lib/cinesync/ui/win32_save_file_dialog.rb",
44
46
  "lib/cinesync/xml.rb",
45
47
  "lib/cinesync/zoom_state.rb",
46
- "test/helper.rb"
48
+ "spec/.bacon",
49
+ "spec/cinesync_spec.rb",
50
+ "spec/event_handler_spec.rb",
51
+ "spec/frame_annotation_spec.rb",
52
+ "spec/media_file_spec.rb",
53
+ "spec/media_locator_spec.rb",
54
+ "spec/session_spec.rb",
55
+ "spec/small.txt",
56
+ "spec/spec_helper.rb",
57
+ "spec/v3 files/corrupt.csc",
58
+ "spec/v3 files/v3-Newer v4.csc",
59
+ "spec/v3 files/v3-Unsupported.csc",
60
+ "spec/v3 files/v3-active first.csc",
61
+ "spec/v3 files/v3-active second.csc",
62
+ "spec/v3 files/v3-active single.csc",
63
+ "spec/v3 files/v3-basic.csc",
64
+ "spec/v3 files/v3-groups.csc",
65
+ "spec/v3 files/v3-pro.csc",
66
+ "spec/v3 files/v3-refmovie.csc",
67
+ "spec/v3 files/v3-stereo-anaglyph-off.csc",
68
+ "spec/v3 files/v3-stereo-anaglyph.csc",
69
+ "spec/v3 files/v3-stereo-interlaced-off.csc",
70
+ "spec/v3 files/v3-stereo.csc",
71
+ "spec/v3 files/v3-url.csc",
72
+ "spec/xml_spec.rb"
47
73
  ]
48
74
  s.homepage = %q{http://github.com/jmah/cinesync}
49
75
  s.rdoc_options = ["--charset=UTF-8"]
@@ -51,7 +77,16 @@ Gem::Specification.new do |s|
51
77
  s.rubygems_version = %q{1.3.6}
52
78
  s.summary = %q{Library for scripting the cineSync collaborative video review tool}
53
79
  s.test_files = [
54
- "test/helper.rb"
80
+ "spec/cinesync_spec.rb",
81
+ "spec/event_handler_spec.rb",
82
+ "spec/frame_annotation_spec.rb",
83
+ "spec/media_file_spec.rb",
84
+ "spec/media_locator_spec.rb",
85
+ "spec/session_spec.rb",
86
+ "spec/spec_helper.rb",
87
+ "spec/xml_spec.rb",
88
+ "examples/Export Notes to CSV.rb",
89
+ "examples/Start Session.rb"
55
90
  ]
56
91
 
57
92
  if s.respond_to? :specification_version then
@@ -61,16 +96,16 @@ Gem::Specification.new do |s|
61
96
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
62
97
  s.add_runtime_dependency(%q<activesupport>, [">= 2.3"])
63
98
  s.add_runtime_dependency(%q<andand>, [">= 1.3.1"])
64
- s.add_runtime_dependency(%q<builder>, [">= 2.1"])
99
+ s.add_development_dependency(%q<bacon>, [">= 1.0"])
65
100
  else
66
101
  s.add_dependency(%q<activesupport>, [">= 2.3"])
67
102
  s.add_dependency(%q<andand>, [">= 1.3.1"])
68
- s.add_dependency(%q<builder>, [">= 2.1"])
103
+ s.add_dependency(%q<bacon>, [">= 1.0"])
69
104
  end
70
105
  else
71
106
  s.add_dependency(%q<activesupport>, [">= 2.3"])
72
107
  s.add_dependency(%q<andand>, [">= 1.3.1"])
73
- s.add_dependency(%q<builder>, [">= 2.1"])
108
+ s.add_dependency(%q<bacon>, [">= 1.0"])
74
109
  end
75
110
  end
76
111
 
File without changes
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'rubygems'
4
+ require 'cinesync'
5
+
6
+ if ARGV.empty?
7
+ $stderr.puts("Usage: #{$0} <file.mov> ...")
8
+ exit 1
9
+ end
10
+
11
+
12
+ # Create the session and add media from command-line arguments
13
+ session = CineSync::Session.new
14
+ session.media = ARGV.map {|path| CineSync::MediaFile.new(path) }
15
+
16
+ # Open the session
17
+ CineSync::Commands.open_session!(session)
@@ -0,0 +1,50 @@
1
+ require 'uri'
2
+ require 'cgi'
3
+ require 'tmpdir'
4
+
5
+ module CineSync
6
+ module Commands
7
+ class <<self
8
+ def opens_url(*syms)
9
+ syms.each do |sym|
10
+ self.class.send(:define_method, :"#{sym}!") {|*args| CineSync::UI.open_url(send(sym, *args)) }
11
+ end
12
+ end
13
+ end
14
+
15
+ opens_url :open_session_file, :create_session, :join_session, :run_script
16
+
17
+ def self.open_session_file(path, merge_with_existing = true)
18
+ op = merge_with_existing ? 'merge' : 'replace'
19
+ "cinesync://file/#{op}?path=#{CGI.escape(path)}"
20
+ end
21
+
22
+ def self.create_session(username = nil, password = nil)
23
+ "cinesync://session/new" + if username
24
+ "?username=#{CGI.escape(username)}" + if password
25
+ "&password=#{CGI.escape(password)}"
26
+ else '' end
27
+ else '' end
28
+ end
29
+
30
+ def self.join_session(session_key)
31
+ "cinesync://session/#{URI.escape(session_key)}"
32
+ end
33
+
34
+ def self.run_script(script_name, query = nil)
35
+ "cinesync://script/#{URI.escape(script_name)}#{query ? "?#{query}" : ''}"
36
+ end
37
+
38
+
39
+ opens_url :open_session
40
+
41
+ IllegalFileChars = /[^\w ~!@#\$%&\(\)_\-\+=\[\]\{\}',\.]/
42
+
43
+ def self.open_session(session, name = nil, merge_with_existing = true)
44
+ name ||= "untitled session"
45
+ path = File.join(Dir.tmpdir, name.gsub(IllegalFileChars, '_') + ".csc")
46
+ File.open(path, "w") {|f| f.puts session.to_xml }
47
+ open_session_file(path, merge_with_existing)
48
+ end
49
+ end
50
+ end
@@ -26,7 +26,6 @@ module CineSync
26
26
  def saved_frame_path(media_file, frame)
27
27
  return nil unless save_parent
28
28
 
29
- # This algorithm is ugly and will be improved before release
30
29
  base = ('%s-%05d' % [media_file.name, frame])
31
30
  i = 1; p2 = nil
32
31
  begin
@@ -13,7 +13,7 @@ module CineSync
13
13
  end
14
14
 
15
15
  def valid?
16
- frame >= 1
16
+ frame >= 1 rescue false
17
17
  end
18
18
  end
19
19
  end
@@ -100,7 +100,7 @@ module CineSync
100
100
  maybe_uri = URI::parse(s) rescue nil
101
101
 
102
102
  if File.exist? s
103
- @path = s
103
+ @path = File.expand_path(s)
104
104
  @short_hash = CineSync::short_hash(@path)
105
105
  elsif maybe_uri and maybe_uri.scheme
106
106
  # The argument could be parsed as a URI (use it as a URL)
@@ -110,7 +110,12 @@ module CineSync
110
110
  @short_hash = s
111
111
  else
112
112
  # Finally, assume it's a file path
113
- @path = s
113
+ if s =~ /^[A-Z]:[\\\/]/
114
+ # Looks like an absolute DOS path; let it through
115
+ @path = s
116
+ else
117
+ @path = File.expand_path(s)
118
+ end
114
119
  end
115
120
  end
116
121
  end
data/lib/cinesync/xml.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require 'active_support'
2
2
  require 'andand'
3
- require 'builder'
4
3
  require 'rexml/document'
5
4
  require 'uri'
6
5
 
@@ -152,7 +151,7 @@ module CineSync
152
151
  m.notes = elem.elements['notes'].andand.text || ''
153
152
 
154
153
  elem.get_elements('annotation').each do |ann_elem|
155
- FrameAnnotation.load(ann_elem, m)
154
+ m.annotations << FrameAnnotation.load(ann_elem)
156
155
  end
157
156
 
158
157
  # Load optional structures
@@ -424,9 +423,9 @@ module CineSync
424
423
  end
425
424
 
426
425
 
427
- def self.load(elem, media)
428
- returning media.annotations[elem.attribute('frame').value.to_i] do |ann|
429
- ann.notes = elem.elements['notes'].andand.text || ann.notes
426
+ def self.load(elem)
427
+ returning self.new(elem.attribute('frame').value.to_i) do |ann|
428
+ ann.notes = elem.elements['notes'].andand.text || ''
430
429
  DrawingObjectElements.each do |obj_name|
431
430
  ann.drawing_objects += elem.get_elements(obj_name)
432
431
  end
data/lib/cinesync.rb CHANGED
@@ -1,7 +1,3 @@
1
- Dir["#{File.dirname(__FILE__)}/vendor/gems/**"].map do |dir|
2
- $: << (File.directory?(lib = "#{dir}/lib") ? lib : dir)
3
- end
4
-
5
1
  require 'cinesync/session'
6
2
  require 'cinesync/media_file'
7
3
  require 'cinesync/play_range'
@@ -11,6 +7,7 @@ require 'cinesync/mask'
11
7
  require 'cinesync/color_grading'
12
8
  require 'cinesync/xml'
13
9
  require 'cinesync/event_handler'
10
+ require 'cinesync/commands'
14
11
  require 'cinesync/ui'
15
12
  require 'digest'
16
13
 
@@ -39,8 +36,8 @@ module CineSync
39
36
  end
40
37
  end
41
38
 
42
- def self.event_handler
43
- session = Session::load($stdin) rescue nil
44
- yield CineSync::EventHandler.new(ARGV, session)
39
+ def self.event_handler(argv = ARGV, stdin = $stdin)
40
+ session = Session::load(stdin) rescue nil
41
+ yield CineSync::EventHandler.new(argv, session)
45
42
  end
46
43
  end
data/spec/.bacon ADDED
File without changes
@@ -0,0 +1,12 @@
1
+ $: << File.expand_path(File.dirname(__FILE__))
2
+ require 'spec_helper'
3
+
4
+ describe "cineSync utilities" do
5
+ it "correctly hashes big file" do
6
+ CineSync.short_hash("/Volumes/Oyama/Streams/cineSync Test Files/movies/nasa_shuttle_m420p.mov").should == "08e5628d51b14278f73f36afebf0506afc2bfcf8"
7
+ end
8
+
9
+ it "correctly hashes small file" do
10
+ CineSync.short_hash("spec/small.txt").should == '1e40efb84050f92618e2c430742f44254771cf6b'
11
+ end
12
+ end
@@ -0,0 +1,66 @@
1
+ $: << File.expand_path(File.dirname(__FILE__))
2
+ require 'spec_helper'
3
+
4
+ describe "event handler" do
5
+ before do
6
+ @example_path = File.join("spec", "v3 files", "v3-basic.csc")
7
+ @online_args = ["--key=ASDF0000", "--save-format=JPEG", "--save-dir=/tmp/cinesync"]
8
+ @offline_args = ["--key=_OFFLINE_", "--save-format=PNG", "--save-dir=/tmp/cinesync"]
9
+ @url_args = ["--key=URL1111", "--save-format=JPEG", "--url=cinesync://script/myscript?q=hi"]
10
+ @handler_run = false
11
+ end
12
+
13
+ it "should load session from stdin" do
14
+ File.open(@example_path, "r") do |f|
15
+ CineSync.event_handler(@online_args, f) do |evt|
16
+ evt.session.user_data.should == "sessionUserData blah bloo blee"
17
+ evt.session.media.length.should == 3
18
+ evt.session.notes.should == "These are my session notes.\nnewline."
19
+ evt.session.should.be.valid?
20
+ @handler_run = true
21
+ end
22
+ end
23
+ @handler_run.should.be.true?
24
+ end
25
+
26
+ it "should parse online arguments" do
27
+ File.open(@example_path, "r") do |f|
28
+ CineSync.event_handler(@online_args, f) do |evt|
29
+ evt.should.not.be.offline?
30
+ evt.session_key.should == "ASDF0000"
31
+ evt.save_format.should == :jpeg
32
+ evt.save_parent.to_s.should == "/tmp/cinesync"
33
+ evt.url.should.be.nil?
34
+ @handler_run = true
35
+ end
36
+ end
37
+ @handler_run.should.be.true?
38
+ end
39
+
40
+ it "should parse offline arguments" do
41
+ File.open(@example_path, "r") do |f|
42
+ CineSync.event_handler(@offline_args, f) do |evt|
43
+ evt.should.be.offline?
44
+ evt.session_key.should.be.nil?
45
+ evt.save_format.should == :png
46
+ evt.save_parent.to_s.should == "/tmp/cinesync"
47
+ evt.url.should.be.nil?
48
+ @handler_run = true
49
+ end
50
+ end
51
+ @handler_run.should.be.true?
52
+ end
53
+
54
+ it "should parse url argument" do
55
+ File.open(@example_path, "r") do |f|
56
+ CineSync.event_handler(@url_args, f) do |evt|
57
+ evt.should.not.be.offline?
58
+ evt.session_key.should == "URL1111"
59
+ evt.save_format.should == :jpeg
60
+ evt.url.should == "cinesync://script/myscript?q=hi"
61
+ @handler_run = true
62
+ end
63
+ end
64
+ @handler_run.should.be.true?
65
+ end
66
+ end
@@ -0,0 +1,33 @@
1
+ $: << File.expand_path(File.dirname(__FILE__))
2
+ require 'spec_helper'
3
+
4
+ describe "frame annotations" do
5
+ before do
6
+ @obj = CineSync::FrameAnnotation.new(5)
7
+ end
8
+
9
+ it "should validate frame number" do
10
+ @obj.frame.should == 5
11
+ @obj.should.be.valid?
12
+ CineSync::FrameAnnotation.new(0).should.not.be.valid? # 1-based, so 0 is invalid
13
+ CineSync::FrameAnnotation.new(-5).should.not.be.valid?
14
+ CineSync::FrameAnnotation.new("three").should.not.be.valid?
15
+ end
16
+
17
+ it "should store notes" do
18
+ @obj.notes.should == ""
19
+ @obj.notes = "asdf"
20
+ @obj.notes.should == "asdf"
21
+ @obj.should.be.valid?
22
+ end
23
+
24
+ it "should start with no drawing objects" do
25
+ @obj.drawing_objects.should.be.empty?
26
+ end
27
+
28
+ it "should start in default state" do
29
+ @obj.should.be.default?
30
+ @obj.notes = "asdf"
31
+ @obj.should.not.be.default?
32
+ end
33
+ end
@@ -0,0 +1,125 @@
1
+ $: << File.expand_path(File.dirname(__FILE__))
2
+ require 'spec_helper'
3
+
4
+ shared "single and group movie" do
5
+ it "should store user data" do
6
+ @obj.user_data.should.not.be.nil?
7
+ @obj.user_data.should.be.empty?
8
+ @obj.user_data = "My custom data"
9
+ @obj.user_data.should == "My custom data"
10
+ @obj.should.be.valid?
11
+ end
12
+
13
+ it "should have an active property" do
14
+ @obj.should.not.be.active?
15
+ @obj.active = true
16
+ @obj.should.be.active?
17
+ @obj.should.be.valid?
18
+ end
19
+
20
+ it "should track the current frame" do
21
+ @obj.current_frame.should == 1
22
+ @obj.current_frame = 99
23
+ @obj.current_frame.should == 99
24
+ @obj.should.be.valid?
25
+
26
+ @obj.current_frame = -1
27
+ @obj.current_frame.should == -1
28
+ @obj.should.not.be.valid?
29
+ end
30
+
31
+ it "should belong to groups" do
32
+ @obj.groups.should.be.empty?
33
+ @obj.groups << "My group"
34
+ @obj.groups.should.be == ["My group"]
35
+ end
36
+ end
37
+
38
+
39
+ describe "cineSync media file" do
40
+ before do
41
+ @obj = CineSync::MediaFile.new("ftp://ftp.cinesync.com/demo.mov")
42
+ end
43
+
44
+ behaves_like "single and group movie"
45
+
46
+ it "should be valid by default" do
47
+ @obj.should.be.valid?
48
+ end
49
+
50
+ it "should create annotations on demand" do
51
+ @obj.annotations.should.be.empty?
52
+ ann_on_demand = @obj.annotations[32]
53
+ ann_on_demand.should.not.be.nil?
54
+ ann_on_demand.notes.should.not.be.nil?
55
+ ann_on_demand.notes.should.be.empty?
56
+
57
+ # Check that the instance we have is shared with the annotations hash
58
+ ann_on_demand.notes = 'notes on frame 32'
59
+ @obj.annotations[32].notes.should == ann_on_demand.notes
60
+ end
61
+
62
+ it "should validate annotation frame number" do
63
+ ann = @obj.annotations[3]
64
+ ann.should.be.valid?
65
+ @obj.should.be.valid?
66
+
67
+ ann2 = @obj.annotations[-5]
68
+ ann2.should.not.be.valid?
69
+ @obj.should.not.be.valid?
70
+ @obj.annotations.delete(-5)
71
+ @obj.should.be.valid?
72
+ end
73
+
74
+ it "should require a locator for validity" do
75
+ mf_loc = CineSync::MediaFile.new("/Volumes/Oyama/Streams/cineSync Test Files/movies/nasa_shuttle_m420p.mov")
76
+ mf_loc.should.be.valid?
77
+ mf_noloc = CineSync::MediaFile.new
78
+ mf_noloc.should.not.be.valid?
79
+ end
80
+
81
+ it "should get name from locator" do
82
+ @obj.name.should == "demo.mov"
83
+
84
+ @obj.name = ""
85
+ @obj.name.should.be.empty?
86
+ @obj.should.not.be.valid?
87
+
88
+ @obj.name = "custom_name"
89
+ @obj.name.should == "custom_name"
90
+ @obj.should.be.valid?
91
+
92
+ CineSync::MediaFile.new.name.should == ""
93
+ end
94
+ end
95
+
96
+
97
+ describe "group movies" do
98
+ before do
99
+ @obj = CineSync::GroupMovie.new("grp")
100
+ end
101
+
102
+ behaves_like "single and group movie"
103
+
104
+ it "should be based on a group" do
105
+ @obj.group.should == "grp"
106
+ @obj.should.be.valid?
107
+
108
+ @obj.group = ""
109
+ @obj.group.should.be.empty?
110
+ @obj.should.not.be.valid?
111
+ end
112
+
113
+ it "should accept all files group" do
114
+ empty = CineSync::GroupMovie.new("")
115
+ empty.group.should == ""
116
+ empty.should.not.be.valid?
117
+
118
+ empty.group = CineSync::AllFilesGroup
119
+ empty.should.be.valid?
120
+ end
121
+
122
+ it "should trigger pro features" do
123
+ @obj.should.uses_pro_features?
124
+ end
125
+ end
@@ -0,0 +1,68 @@
1
+ $: << File.expand_path(File.dirname(__FILE__))
2
+ require 'spec_helper'
3
+
4
+ describe "media locators" do
5
+ it "should represent empty locators" do
6
+ ml = CineSync::MediaLocator.new
7
+ ml.should.not.be.valid?
8
+ ml.path.should.be.nil?
9
+ ml.url.should.be.nil?
10
+ ml.short_hash.should.be.nil?
11
+ end
12
+
13
+ it "should accept a url location" do
14
+ url = "http://example.com/random_file.mov"
15
+ ml = CineSync::MediaLocator.new(url)
16
+ ml.should.be.valid?
17
+ ml.path.should.be.nil?
18
+ ml.url.to_s.should == url
19
+ ml.short_hash.should.be.nil?
20
+
21
+ ml.url.scheme.should == "http"
22
+ ml.url.host.should == "example.com"
23
+ ml.url.path.should == "/random_file.mov"
24
+ end
25
+
26
+ it "should set short hash for an existing path" do
27
+ path = "/Volumes/Oyama/Streams/cineSync Test Files/movies/nasa_shuttle_m420p.mov"
28
+ ml = CineSync::MediaLocator.new(path)
29
+ ml.should.be.valid?
30
+ ml.path.should == path
31
+ ml.url.should.be.nil?
32
+ ml.short_hash.should == "08e5628d51b14278f73f36afebf0506afc2bfcf8"
33
+ end
34
+
35
+ it "should accept path to non-existent file" do
36
+ path = "/path/to/nonexistent/file.mov"
37
+ ml = CineSync::MediaLocator.new(path)
38
+ ml.should.be.valid?
39
+ ml.path.should == path
40
+ ml.url.should.be.nil?
41
+ ml.short_hash.should.be.nil?
42
+ end
43
+
44
+ it "should accept dos path" do
45
+ path = 'C:\path\to\myMovie.mov'
46
+ ml = CineSync::MediaLocator.new(path)
47
+ ml.should.be.valid?
48
+ ml.path.should == path
49
+ ml.url.should.be.nil?
50
+ ml.short_hash.should.be.nil?
51
+ end
52
+
53
+ it "should accept short hash as locator" do
54
+ hash = "08e5628d51b14278f73f36afebf0506afc2bfcf8"
55
+ ml = CineSync::MediaLocator.new(hash)
56
+ ml.should.be.valid?
57
+ ml.path.should.be.nil?
58
+ ml.url.should.be.nil?
59
+ ml.short_hash.should == hash
60
+ end
61
+
62
+ it "should convert relative paths to absolute" do
63
+ rel_path = "../nonexist-test.mov"
64
+ abs_path = File.expand_path(rel_path)
65
+ ml = CineSync::MediaLocator.new(rel_path)
66
+ ml.path.should == abs_path
67
+ end
68
+ end