rivendell-import 0.7 → 0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +10 -0
- data/Gemfile.lock +21 -16
- data/README.md +10 -21
- data/examples/.gitignore +2 -0
- data/examples/config.rb +2 -0
- data/lib/rivendell/import/cart.rb +35 -7
- data/lib/rivendell/import/cut.rb +16 -1
- data/lib/rivendell/import/task.rb +14 -3
- data/lib/rivendell/import/version.rb +1 -1
- data/lib/rivendell/import.rb +9 -2
- data/rivendell-import.gemspec +1 -1
- data/spec/rivendell/import/base_spec.rb +2 -3
- data/spec/rivendell/import/cut_spec.rb +21 -0
- data/spec/rivendell/import/task_spec.rb +89 -26
- data/spec/rivendell/import_spec.rb +39 -4
- data/spec/simplecov-default.rb +19 -0
- data/spec/spec_helper.rb +1 -6
- metadata +321 -297
data/Gemfile
CHANGED
@@ -5,7 +5,17 @@ gemspec
|
|
5
5
|
# gem "rivendell-db", :path => "~/Projects/RivendellDb"
|
6
6
|
# gem "rivendell-api", :path => "~/Projects/RivendellApi"
|
7
7
|
|
8
|
+
# To test mysql DB instead of sqlite
|
9
|
+
#
|
10
|
+
# $ mysqladmin create import
|
11
|
+
# $ mysql mysql
|
12
|
+
# mysql> GRANT ALL PRIVILEGES ON import.* TO 'import'@'localhost' IDENTIFIED BY 'import';
|
13
|
+
#
|
14
|
+
# and this gem :
|
15
|
+
# gem "mysql"
|
16
|
+
|
8
17
|
gem 'capistrano'
|
18
|
+
gem 'simplecov-rcov'
|
9
19
|
|
10
20
|
if RUBY_PLATFORM =~ /linux/
|
11
21
|
gem 'libnotify'
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rivendell-import (0.
|
4
|
+
rivendell-import (0.8)
|
5
5
|
SyslogLogger (~> 2.0)
|
6
6
|
activerecord (~> 3.2.8)
|
7
7
|
activesupport (~> 3.2.8)
|
@@ -21,32 +21,33 @@ GEM
|
|
21
21
|
remote: https://rubygems.org/
|
22
22
|
specs:
|
23
23
|
SyslogLogger (2.0)
|
24
|
-
activemodel (3.2.
|
25
|
-
activesupport (= 3.2.
|
24
|
+
activemodel (3.2.17)
|
25
|
+
activesupport (= 3.2.17)
|
26
26
|
builder (~> 3.0.0)
|
27
|
-
activerecord (3.2.
|
28
|
-
activemodel (= 3.2.
|
29
|
-
activesupport (= 3.2.
|
27
|
+
activerecord (3.2.17)
|
28
|
+
activemodel (= 3.2.17)
|
29
|
+
activesupport (= 3.2.17)
|
30
30
|
arel (~> 3.0.2)
|
31
31
|
tzinfo (~> 0.3.29)
|
32
|
-
activesupport (3.2.
|
32
|
+
activesupport (3.2.17)
|
33
33
|
i18n (~> 0.6, >= 0.6.4)
|
34
34
|
multi_json (~> 1.0)
|
35
35
|
addressable (2.3.5)
|
36
36
|
arel (3.0.3)
|
37
37
|
bcrypt-ruby (3.1.2)
|
38
|
-
builder (3.0.
|
38
|
+
builder (3.0.4)
|
39
39
|
capistrano (2.14.2)
|
40
40
|
highline
|
41
41
|
net-scp (>= 1.0.0)
|
42
42
|
net-sftp (>= 2.0.0)
|
43
43
|
net-ssh (>= 2.0.14)
|
44
44
|
net-ssh-gateway (>= 1.1.0)
|
45
|
-
cucumber (1.
|
45
|
+
cucumber (1.3.10)
|
46
46
|
builder (>= 2.1.2)
|
47
47
|
diff-lcs (>= 1.1.3)
|
48
|
-
gherkin (~> 2.
|
49
|
-
|
48
|
+
gherkin (~> 2.12)
|
49
|
+
multi_json (>= 1.7.5, < 2.0)
|
50
|
+
multi_test (>= 0.0.2)
|
50
51
|
daemons (1.1.9)
|
51
52
|
data_objects (0.10.13)
|
52
53
|
addressable (~> 2.1)
|
@@ -80,8 +81,8 @@ GEM
|
|
80
81
|
data_objects (= 0.10.13)
|
81
82
|
fastercsv (1.5.5)
|
82
83
|
ffi (1.9.3)
|
83
|
-
gherkin (2.
|
84
|
-
|
84
|
+
gherkin (2.12.2)
|
85
|
+
multi_json (~> 1.3)
|
85
86
|
guard (1.4.0)
|
86
87
|
listen (>= 0.4.2)
|
87
88
|
thor (>= 0.14.6)
|
@@ -112,6 +113,7 @@ GEM
|
|
112
113
|
treetop (~> 1.4.8)
|
113
114
|
mime-types (1.25.1)
|
114
115
|
multi_json (1.8.2)
|
116
|
+
multi_test (0.0.3)
|
115
117
|
multi_xml (0.5.5)
|
116
118
|
multipart-post (1.2.0)
|
117
119
|
net-scp (1.1.0)
|
@@ -122,7 +124,7 @@ GEM
|
|
122
124
|
net-ssh-gateway (1.2.0)
|
123
125
|
net-ssh (>= 2.6.5)
|
124
126
|
null_logger (0.0.1)
|
125
|
-
polyglot (0.3.
|
127
|
+
polyglot (0.3.4)
|
126
128
|
rack (1.5.2)
|
127
129
|
rack-protection (1.5.1)
|
128
130
|
rack
|
@@ -156,11 +158,13 @@ GEM
|
|
156
158
|
multi_json (~> 1.0)
|
157
159
|
simplecov-html (~> 0.5.3)
|
158
160
|
simplecov-html (0.5.3)
|
161
|
+
simplecov-rcov (0.2.3)
|
162
|
+
simplecov (>= 0.4.1)
|
159
163
|
sinatra (1.4.4)
|
160
164
|
rack (~> 1.4)
|
161
165
|
rack-protection (~> 1.4)
|
162
166
|
tilt (~> 1.3, >= 1.3.4)
|
163
|
-
sqlite3 (1.3.
|
167
|
+
sqlite3 (1.3.9)
|
164
168
|
stringex (1.5.1)
|
165
169
|
thor (0.16.0)
|
166
170
|
tilt (1.4.1)
|
@@ -168,7 +172,7 @@ GEM
|
|
168
172
|
polyglot
|
169
173
|
polyglot (>= 0.3.1)
|
170
174
|
trollop (2.0)
|
171
|
-
tzinfo (0.3.
|
175
|
+
tzinfo (0.3.39)
|
172
176
|
uuidtools (2.1.4)
|
173
177
|
will_paginate (3.0.5)
|
174
178
|
|
@@ -188,3 +192,4 @@ DEPENDENCIES
|
|
188
192
|
rivendell-import!
|
189
193
|
rspec
|
190
194
|
simplecov
|
195
|
+
simplecov-rcov
|
data/README.md
CHANGED
@@ -1,29 +1,18 @@
|
|
1
1
|
# Rivendell::Import
|
2
2
|
|
3
|
-
|
3
|
+
Next-Generation import interface for Rivendell
|
4
4
|
|
5
|
-
##
|
5
|
+
## Run examples
|
6
6
|
|
7
|
-
|
7
|
+
bundle exec ./bin/rivendell-import --config examples/config.rb --listen examples --debug
|
8
8
|
|
9
|
-
|
9
|
+
## Initialize a dedicated MySQL database
|
10
10
|
|
11
|
-
|
11
|
+
$ mysqladmin create import
|
12
|
+
$ mysql mysql
|
13
|
+
mysql> GRANT ALL PRIVILEGES ON import.* TO 'import'@'localhost' IDENTIFIED BY 'import';
|
14
|
+
$ mysqladmin flush-privileges
|
12
15
|
|
13
|
-
|
16
|
+
Then use :
|
14
17
|
|
15
|
-
|
16
|
-
|
17
|
-
$ gem install rivendell-import
|
18
|
-
|
19
|
-
## Usage
|
20
|
-
|
21
|
-
TODO: Write usage instructions here
|
22
|
-
|
23
|
-
## Contributing
|
24
|
-
|
25
|
-
1. Fork it
|
26
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
-
3. Commit your changes (`git commit -am 'Added some feature'`)
|
28
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
-
5. Create new Pull Request
|
18
|
+
rivendell-import [...] --database 'mysql://import:import@localhost/import' [...]
|
data/examples/.gitignore
CHANGED
data/examples/config.rb
CHANGED
@@ -51,16 +51,44 @@ module Rivendell::Import
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def update
|
54
|
-
|
54
|
+
begin
|
55
|
+
update_by_api
|
56
|
+
rescue => e
|
57
|
+
Rivendell::Import.logger.debug "Update by API failed : #{e}"
|
58
|
+
update_by_db if Database.enabled?
|
59
|
+
end
|
60
|
+
end
|
55
61
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
62
|
+
def empty_title?(title)
|
63
|
+
not [ nil, "", "[new cart]" ].include? title
|
64
|
+
end
|
65
|
+
|
66
|
+
def update_by_api
|
67
|
+
update_attributes = {}
|
68
|
+
|
69
|
+
if title
|
70
|
+
update_attributes[:title] = title
|
71
|
+
else
|
72
|
+
update_attributes[:title] = default_title if default_title && empty_title?(xport.list_cart(number).title)
|
61
73
|
end
|
62
74
|
|
63
|
-
|
75
|
+
unless update_attributes.empty?
|
76
|
+
Rivendell::Import.logger.debug "Update Cart by API : #{update_attributes}"
|
77
|
+
xport.edit_cart number, update_attributes
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def update_by_db
|
82
|
+
Database.init
|
83
|
+
|
84
|
+
Rivendell::Import.logger.debug "Update Cart by DB"
|
85
|
+
current_cart = Rivendell::DB::Cart.get(number)
|
86
|
+
if title
|
87
|
+
current_cart.title = title
|
88
|
+
else
|
89
|
+
current_cart.title = default_title if default_title && empty_title?(current_cart.title)
|
90
|
+
end
|
91
|
+
current_cart.save
|
64
92
|
end
|
65
93
|
|
66
94
|
def cut
|
data/lib/rivendell/import/cut.rb
CHANGED
@@ -16,7 +16,11 @@ module Rivendell::Import
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def as_json(options = {})
|
19
|
-
super
|
19
|
+
super(options.merge(:root => false)).tap do |as_json|
|
20
|
+
as_json.each do |k,v|
|
21
|
+
as_json[k] = [v.begin, v.end] if v.is_a?(Range)
|
22
|
+
end
|
23
|
+
end
|
20
24
|
end
|
21
25
|
|
22
26
|
def attributes
|
@@ -70,5 +74,16 @@ module Rivendell::Import
|
|
70
74
|
end
|
71
75
|
end
|
72
76
|
|
77
|
+
def datetime=(datetime)
|
78
|
+
datetime = (datetime.first)..(datetime.last) if Array === datetime
|
79
|
+
datetime = Time.parse(datetime.begin)..Time.parse(datetime.end) if String === datetime.first
|
80
|
+
@datetime = datetime
|
81
|
+
end
|
82
|
+
|
83
|
+
def daypart=(daypart)
|
84
|
+
daypart = (daypart.first)..(daypart.last) if Array === daypart
|
85
|
+
@daypart = daypart
|
86
|
+
end
|
87
|
+
|
73
88
|
end
|
74
89
|
end
|
@@ -20,8 +20,10 @@ module Rivendell::Import
|
|
20
20
|
self.pending.select(&:ready?)
|
21
21
|
end
|
22
22
|
|
23
|
+
RAN_STATUSES = %w{completed failed canceled}.freeze
|
24
|
+
|
23
25
|
def self.ran
|
24
|
-
where :status =>
|
26
|
+
where :status => RAN_STATUSES
|
25
27
|
end
|
26
28
|
|
27
29
|
def self.search(text)
|
@@ -29,7 +31,7 @@ module Rivendell::Import
|
|
29
31
|
end
|
30
32
|
|
31
33
|
def ran?
|
32
|
-
status.
|
34
|
+
status.in? RAN_STATUSES
|
33
35
|
end
|
34
36
|
|
35
37
|
@@default_xport_options = {}
|
@@ -99,7 +101,16 @@ module Rivendell::Import
|
|
99
101
|
file.destroy! if delete_file?
|
100
102
|
end
|
101
103
|
|
104
|
+
def cancel!
|
105
|
+
self.status = "canceled"
|
106
|
+
end
|
107
|
+
|
102
108
|
def run
|
109
|
+
if status.canceled?
|
110
|
+
logger.debug "Don't run canceled task : #{self.inspect}"
|
111
|
+
return
|
112
|
+
end
|
113
|
+
|
103
114
|
logger.debug "Run #{self.inspect}"
|
104
115
|
change_status! :running
|
105
116
|
|
@@ -117,7 +128,7 @@ module Rivendell::Import
|
|
117
128
|
logger.error "Task failed : #{e}"
|
118
129
|
logger.debug e.backtrace.join("\n")
|
119
130
|
ensure
|
120
|
-
unless
|
131
|
+
unless ran?
|
121
132
|
change_status! :failed
|
122
133
|
end
|
123
134
|
save!
|
data/lib/rivendell/import.rb
CHANGED
@@ -19,8 +19,15 @@ module Rivendell
|
|
19
19
|
@@logger = NullLogger.instance
|
20
20
|
mattr_accessor :logger
|
21
21
|
|
22
|
-
def self.establish_connection(
|
23
|
-
|
22
|
+
def self.establish_connection(file_or_uri = "db.sqlite3")
|
23
|
+
database_spec =
|
24
|
+
if URI.parse(file_or_uri).scheme.in? [nil, "file"]
|
25
|
+
{ :adapter => "sqlite3", :database => file_or_uri }
|
26
|
+
else
|
27
|
+
file_or_uri
|
28
|
+
end
|
29
|
+
|
30
|
+
ActiveRecord::Base.establish_connection database_spec
|
24
31
|
ActiveRecord::Migrator.migrate(::File.expand_path("../../../db/migrate/", __FILE__), nil)
|
25
32
|
end
|
26
33
|
|
data/rivendell-import.gemspec
CHANGED
@@ -44,6 +44,6 @@ Gem::Specification.new do |gem|
|
|
44
44
|
gem.add_development_dependency "rdoc"
|
45
45
|
gem.add_development_dependency "cucumber"
|
46
46
|
gem.add_development_dependency "database_cleaner"
|
47
|
-
# gem.add_development_dependency "remarkable_activerecord"
|
48
47
|
|
48
|
+
# gem.add_development_dependency "remarkable_activerecord"
|
49
49
|
end
|
@@ -46,12 +46,11 @@ describe Rivendell::Import::Base do
|
|
46
46
|
let(:file) { Rivendell::Import::File.new("dummy.wav") }
|
47
47
|
|
48
48
|
it "should create a File with given path and base_directory" do
|
49
|
-
|
50
|
-
subject.file "path", "base_directory"
|
49
|
+
subject.file("path", "base_directory").file_path.should == File.expand_path("path", "base_directory")
|
51
50
|
end
|
52
51
|
|
53
52
|
it "should create a File with given path and base_directory" do
|
54
|
-
Rivendell::Import::File.stub :new=> file
|
53
|
+
Rivendell::Import::File.stub :new => file
|
55
54
|
subject.should_receive(:create_task).with(file)
|
56
55
|
subject.file "path", "base_directory"
|
57
56
|
end
|
@@ -14,6 +14,26 @@ describe Rivendell::Import::Cut do
|
|
14
14
|
|
15
15
|
end
|
16
16
|
|
17
|
+
describe "#to_json" do
|
18
|
+
|
19
|
+
let(:json_clone) do
|
20
|
+
Rivendell::Import::Cut.new(cart).tap do |clone|
|
21
|
+
clone.from_json subject.to_json, false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should support datetime (Time range)" do
|
26
|
+
subject.datetime = Time.parse("2014-03-20 00:00")..Time.parse("2014-03-21 23:59:59")
|
27
|
+
json_clone.datetime.should == subject.datetime
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should support datepart (String range)" do
|
31
|
+
subject.daypart = "08:00:00".."12:00:00"
|
32
|
+
json_clone.daypart.should == subject.daypart
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
17
37
|
describe "#create" do
|
18
38
|
|
19
39
|
before(:each) do
|
@@ -39,6 +59,7 @@ describe Rivendell::Import::Cut do
|
|
39
59
|
|
40
60
|
before do
|
41
61
|
subject.number = 1
|
62
|
+
subject.cart.number = 1
|
42
63
|
end
|
43
64
|
|
44
65
|
context "when DB attributes are defined" do
|
@@ -6,7 +6,7 @@ describe Rivendell::Import::Task do
|
|
6
6
|
subject { Rivendell::Import::Task.new :file => file }
|
7
7
|
|
8
8
|
describe "#file" do
|
9
|
-
|
9
|
+
|
10
10
|
it "should return a file with specified path" do
|
11
11
|
Rivendell::Import::Task.new(:file => file).file.should == file
|
12
12
|
end
|
@@ -14,7 +14,7 @@ describe Rivendell::Import::Task do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
describe "#cart" do
|
17
|
-
|
17
|
+
|
18
18
|
it "should return a Cart associated to the task" do
|
19
19
|
subject.cart.task.should == subject
|
20
20
|
end
|
@@ -22,7 +22,7 @@ describe Rivendell::Import::Task do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
describe "#xport" do
|
25
|
-
|
25
|
+
|
26
26
|
it "should return a instance of Rivendell::API::Xport" do
|
27
27
|
subject.xport.should be_instance_of(Rivendell::API::Xport)
|
28
28
|
end
|
@@ -35,14 +35,14 @@ describe Rivendell::Import::Task do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
describe "#xport_options" do
|
38
|
-
|
38
|
+
|
39
39
|
it "should use #default_xport_options" do
|
40
|
-
subject.stub :default_xport_options => { :host => "dummy" }
|
40
|
+
subject.stub :default_xport_options => { :host => "dummy" }
|
41
41
|
subject.xport_options.should == { :host => "dummy" }
|
42
42
|
end
|
43
43
|
|
44
44
|
it "should not modified #default_xport_options" do
|
45
|
-
subject.stub :default_xport_options => { :host => "dummy" }
|
45
|
+
subject.stub :default_xport_options => { :host => "dummy" }
|
46
46
|
subject.xport_options[:host] = "other"
|
47
47
|
subject.default_xport_options.should == { :host => "dummy" }
|
48
48
|
end
|
@@ -50,14 +50,14 @@ describe Rivendell::Import::Task do
|
|
50
50
|
end
|
51
51
|
|
52
52
|
describe "#prepare" do
|
53
|
-
|
53
|
+
|
54
54
|
it "should return the Task" do
|
55
55
|
subject.prepare { |file| } .should == subject
|
56
56
|
end
|
57
57
|
|
58
58
|
it "should invoke the specified block with Task file" do
|
59
59
|
given_file = nil
|
60
|
-
subject.prepare do |file|
|
60
|
+
subject.prepare do |file|
|
61
61
|
given_file = file
|
62
62
|
end
|
63
63
|
given_file.should == subject.file
|
@@ -71,7 +71,23 @@ describe Rivendell::Import::Task do
|
|
71
71
|
subject.stub :destination => "test"
|
72
72
|
subject.stub :cart => mock(:create => true, :import => true, :update => true, :number => 123, :to_json => '')
|
73
73
|
end
|
74
|
-
|
74
|
+
|
75
|
+
context "when task is canceled" do
|
76
|
+
before do
|
77
|
+
subject.status = "canceled"
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should not create cart" do
|
81
|
+
subject.cart.should_not_receive(:create)
|
82
|
+
subject.run
|
83
|
+
end
|
84
|
+
|
85
|
+
it "keeps its canceled status" do
|
86
|
+
subject.run
|
87
|
+
expect(subject.status).to be_canceled
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
75
91
|
it "should create Cart" do
|
76
92
|
subject.cart.should_receive(:create)
|
77
93
|
subject.run
|
@@ -101,7 +117,7 @@ describe Rivendell::Import::Task do
|
|
101
117
|
end
|
102
118
|
|
103
119
|
describe "#destination" do
|
104
|
-
|
120
|
+
|
105
121
|
it "should return 'Cart in group :group' if cart#group is defined" do
|
106
122
|
subject.cart.group = 'dummy'
|
107
123
|
subject.destination.should == "Cart in group dummy"
|
@@ -115,7 +131,7 @@ describe Rivendell::Import::Task do
|
|
115
131
|
end
|
116
132
|
|
117
133
|
describe "#tags" do
|
118
|
-
|
134
|
+
|
119
135
|
it "should be empty by default" do
|
120
136
|
subject.tags.should be_empty
|
121
137
|
end
|
@@ -123,12 +139,12 @@ describe Rivendell::Import::Task do
|
|
123
139
|
end
|
124
140
|
|
125
141
|
describe "#tag" do
|
126
|
-
|
142
|
+
|
127
143
|
it "should add the given tag" do
|
128
144
|
subject.tag "dummy"
|
129
145
|
subject.tags.should == %w{dummy}
|
130
146
|
end
|
131
|
-
|
147
|
+
|
132
148
|
end
|
133
149
|
|
134
150
|
describe "storage" do
|
@@ -163,14 +179,14 @@ describe Rivendell::Import::Task do
|
|
163
179
|
subject.xport_options[:host] = "dummy"
|
164
180
|
reloaded_task.xport_options[:host].should == "dummy"
|
165
181
|
end
|
166
|
-
|
182
|
+
|
167
183
|
end
|
168
184
|
|
169
185
|
describe "#status" do
|
170
|
-
|
186
|
+
|
171
187
|
it "should be include in pending, completed, failed" do
|
172
188
|
pending
|
173
|
-
# subject.should validate_inclusion_of(:status, :in => %w{pending running completed failed})
|
189
|
+
# subject.should validate_inclusion_of(:status, :in => %w{pending running completed failed canceled})
|
174
190
|
end
|
175
191
|
|
176
192
|
it "should be pending by default" do
|
@@ -180,7 +196,7 @@ describe Rivendell::Import::Task do
|
|
180
196
|
end
|
181
197
|
|
182
198
|
describe "#notifications" do
|
183
|
-
|
199
|
+
|
184
200
|
before(:each) do
|
185
201
|
subject.save!
|
186
202
|
end
|
@@ -198,7 +214,7 @@ describe Rivendell::Import::Task do
|
|
198
214
|
end
|
199
215
|
|
200
216
|
let(:notifier) { Rivendell::Import::Notifier::Test.create! }
|
201
|
-
|
217
|
+
|
202
218
|
it "should create a Notification when a Notifier is added" do
|
203
219
|
subject.notifiers << notifier
|
204
220
|
subject.notifications.first.notifier.should == notifier
|
@@ -207,7 +223,7 @@ describe Rivendell::Import::Task do
|
|
207
223
|
end
|
208
224
|
|
209
225
|
describe "#notify!" do
|
210
|
-
|
226
|
+
|
211
227
|
before(:each) do
|
212
228
|
subject.status = "completed"
|
213
229
|
subject.save!
|
@@ -215,7 +231,7 @@ describe Rivendell::Import::Task do
|
|
215
231
|
end
|
216
232
|
|
217
233
|
let(:notifier) { Rivendell::Import::Notifier::Test.create! }
|
218
|
-
|
234
|
+
|
219
235
|
it "should notify task with all associated notifiers" do
|
220
236
|
subject.notify!
|
221
237
|
notifier.notified_tasks.should == [ subject ]
|
@@ -229,7 +245,7 @@ describe Rivendell::Import::Task do
|
|
229
245
|
end
|
230
246
|
|
231
247
|
describe "#change_status!" do
|
232
|
-
|
248
|
+
|
233
249
|
it "should update_attribute :status" do
|
234
250
|
subject.should_receive(:update_attribute).with(:status, "completed")
|
235
251
|
subject.change_status! :completed
|
@@ -248,7 +264,7 @@ describe Rivendell::Import::Task do
|
|
248
264
|
end
|
249
265
|
|
250
266
|
describe "#delete_file!" do
|
251
|
-
|
267
|
+
|
252
268
|
it "should set flag delete_file" do
|
253
269
|
subject.delete_file!
|
254
270
|
subject.delete_file.should be_true
|
@@ -259,14 +275,14 @@ describe Rivendell::Import::Task do
|
|
259
275
|
before do
|
260
276
|
subject.stub :cart => mock.as_null_object
|
261
277
|
end
|
262
|
-
|
278
|
+
|
263
279
|
|
264
280
|
it "should destroy! file when task is completed" do
|
265
281
|
subject.delete_file!
|
266
282
|
subject.file.should_receive(:destroy!)
|
267
283
|
subject.run
|
268
284
|
end
|
269
|
-
|
285
|
+
|
270
286
|
end
|
271
287
|
|
272
288
|
context "not defined" do
|
@@ -275,13 +291,13 @@ describe Rivendell::Import::Task do
|
|
275
291
|
subject.file.should_not_receive(:destroy!)
|
276
292
|
subject.run
|
277
293
|
end
|
278
|
-
|
294
|
+
|
279
295
|
end
|
280
296
|
|
281
297
|
end
|
282
298
|
|
283
299
|
describe ".purge!" do
|
284
|
-
|
300
|
+
|
285
301
|
it "should remove tasks older than 24 hours" do
|
286
302
|
old_task = Rivendell::Import::Task.create! :file => file, :created_at => 25.hours.ago
|
287
303
|
Rivendell::Import::Task.purge!
|
@@ -301,4 +317,51 @@ describe Rivendell::Import::Task do
|
|
301
317
|
|
302
318
|
end
|
303
319
|
|
320
|
+
describe "#ran?" do
|
321
|
+
|
322
|
+
it "should be true when status is completed" do
|
323
|
+
subject.status = "completed"
|
324
|
+
expect(subject).to be_ran
|
325
|
+
end
|
326
|
+
|
327
|
+
it "should be true when status is failed" do
|
328
|
+
subject.status = "failed"
|
329
|
+
expect(subject).to be_ran
|
330
|
+
end
|
331
|
+
|
332
|
+
it "should be true when status is canceled" do
|
333
|
+
subject.status = "canceled"
|
334
|
+
expect(subject).to be_ran
|
335
|
+
end
|
336
|
+
|
337
|
+
end
|
338
|
+
|
339
|
+
describe ".ran" do
|
340
|
+
|
341
|
+
it "should return completed tasks" do
|
342
|
+
subject.change_status! "completed"
|
343
|
+
expect(Rivendell::Import::Task.ran).to include(subject)
|
344
|
+
end
|
345
|
+
|
346
|
+
it "should return failed tasks" do
|
347
|
+
subject.change_status! "failed"
|
348
|
+
expect(Rivendell::Import::Task.ran).to include(subject)
|
349
|
+
end
|
350
|
+
|
351
|
+
it "should return canceled tasks" do
|
352
|
+
subject.change_status! "canceled"
|
353
|
+
expect(Rivendell::Import::Task.ran).to include(subject)
|
354
|
+
end
|
355
|
+
|
356
|
+
end
|
357
|
+
|
358
|
+
describe "#cancel!" do
|
359
|
+
|
360
|
+
it "should change task status to canceled" do
|
361
|
+
subject.cancel!
|
362
|
+
expect(subject.status).to be_canceled
|
363
|
+
end
|
364
|
+
|
365
|
+
end
|
366
|
+
|
304
367
|
end
|