rivendell-import 0.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/.gitignore +21 -0
- data/Gemfile +11 -0
- data/Guardfile +14 -0
- data/LICENSE +22 -0
- data/README.md +29 -0
- data/Rakefile +4 -0
- data/bin/rivendell-import +6 -0
- data/db/migrate/20120920712200_create_tasks.rb +21 -0
- data/db/migrate/20120927194300_create_notifiers.rb +14 -0
- data/db/migrate/20120927203600_create_notifications.rb +14 -0
- data/examples/.gitignore +2 -0
- data/examples/config.rb +31 -0
- data/features/manage_cart_attributes.feature +20 -0
- data/features/manage_file_matching.feature +44 -0
- data/features/step_definitions/import_steps.rb +38 -0
- data/features/support/env.rb +19 -0
- data/features/support/mock_xport.rb +34 -0
- data/lib/rivendell/import.rb +48 -0
- data/lib/rivendell/import/base.rb +57 -0
- data/lib/rivendell/import/cart.rb +67 -0
- data/lib/rivendell/import/carts_cache.rb +58 -0
- data/lib/rivendell/import/cli.rb +90 -0
- data/lib/rivendell/import/config.rb +13 -0
- data/lib/rivendell/import/context.rb +28 -0
- data/lib/rivendell/import/cut.rb +33 -0
- data/lib/rivendell/import/file.rb +57 -0
- data/lib/rivendell/import/notification.rb +16 -0
- data/lib/rivendell/import/notifier/base.rb +89 -0
- data/lib/rivendell/import/notifier/mail-body.erb +8 -0
- data/lib/rivendell/import/notifier/mail-subject.erb +11 -0
- data/lib/rivendell/import/notifier/mail.rb +104 -0
- data/lib/rivendell/import/notifiers.rb +24 -0
- data/lib/rivendell/import/task.rb +80 -0
- data/lib/rivendell/import/tasking/cart.rb +25 -0
- data/lib/rivendell/import/tasking/destination.rb +28 -0
- data/lib/rivendell/import/tasking/file.rb +20 -0
- data/lib/rivendell/import/tasking/status.rb +29 -0
- data/lib/rivendell/import/tasking/tags.rb +27 -0
- data/lib/rivendell/import/tasks.rb +23 -0
- data/lib/rivendell/import/version.rb +5 -0
- data/lib/rivendell/import/worker.rb +34 -0
- data/rivendell-import.gemspec +37 -0
- data/spec/fixtures/mail-body.erb +5 -0
- data/spec/rivendell/import/base_spec.rb +125 -0
- data/spec/rivendell/import/cart_spec.rb +132 -0
- data/spec/rivendell/import/carts_cache_spec.rb +110 -0
- data/spec/rivendell/import/cli_spec.rb +149 -0
- data/spec/rivendell/import/config_spec.rb +16 -0
- data/spec/rivendell/import/context_spec.rb +19 -0
- data/spec/rivendell/import/file_spec.rb +63 -0
- data/spec/rivendell/import/notifier/base_spec.rb +63 -0
- data/spec/rivendell/import/notifier/mail_spec.rb +110 -0
- data/spec/rivendell/import/task_spec.rb +217 -0
- data/spec/rivendell/import/tasks_spec.rb +30 -0
- data/spec/rivendell/import/worker_spec.rb +25 -0
- data/spec/rivendell/import_spec.rb +32 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/support/database_cleaner.rb +17 -0
- data/spec/support/fixtures.rb +3 -0
- data/spec/support/mail.rb +3 -0
- data/spec/support/test_notifier.rb +15 -0
- data/tasks/ci.rake +2 -0
- data/tasks/cucumber.rake +4 -0
- data/tasks/database.rake +11 -0
- data/tasks/rdoc.rake +16 -0
- data/tasks/rspec.rake +2 -0
- metadata +399 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rivendell::Import::Config do
|
4
|
+
|
5
|
+
describe "#to_prepare" do
|
6
|
+
|
7
|
+
let(:user_block) { Proc.new {} }
|
8
|
+
|
9
|
+
it "should define to_prepare proc with given block" do
|
10
|
+
subject.to_prepare(&user_block)
|
11
|
+
subject.to_prepare.should == user_block
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rivendell::Import::Context do
|
4
|
+
|
5
|
+
let(:file) { Rivendell::Import::File.new "dummy.wav" }
|
6
|
+
let(:task) { Rivendell::Import::Task.new :file => file }
|
7
|
+
|
8
|
+
subject { Rivendell::Import::Context.new task }
|
9
|
+
|
10
|
+
describe "#notify" do
|
11
|
+
|
12
|
+
it "should add the specified notifier to the task" do
|
13
|
+
subject.notify 'recipient@domain', :by => :email
|
14
|
+
subject.task.notifiers.first.to.should == 'recipient@domain'
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rivendell::Import::File do
|
4
|
+
|
5
|
+
subject { Rivendell::Import::File.new "/path/to/dummy.wav", :base_directory => "/path/to" }
|
6
|
+
|
7
|
+
describe "initialization" do
|
8
|
+
|
9
|
+
it "should use given base_directory to compute relative name" do
|
10
|
+
Rivendell::Import::File.new("/path/to/dummy.wav", :base_directory => "/path/to").name.should == "dummy.wav"
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#to_s" do
|
16
|
+
|
17
|
+
it "should use name" do
|
18
|
+
subject.to_s.should == subject.name
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
describe ".relative_filename" do
|
24
|
+
|
25
|
+
it "should return '/subdirectory/file' from '/base/subdirectory/file'" do
|
26
|
+
Rivendell::Import::File.relative_filename('/base/subdirectory/file', '/base').should == 'subdirectory/file'
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "match" do
|
32
|
+
|
33
|
+
it "should match a given regexp" do
|
34
|
+
subject.stub :name => "dummy"
|
35
|
+
subject.should match(/^dum/)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should not return false when not match" do
|
39
|
+
subject.stub :name => "dummy"
|
40
|
+
subject.should_not match(/other/)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "#basename" do
|
46
|
+
|
47
|
+
it "should return 'dummy' for 'path/to/dummy.wav'" do
|
48
|
+
subject.stub :name => "path/to/dummy.wav"
|
49
|
+
subject.basename.should == "dummy"
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "#extension" do
|
55
|
+
|
56
|
+
it "should 'wav' for 'path/to/dummy.wav'" do
|
57
|
+
subject.stub :name => "path/to/dummy.wav"
|
58
|
+
subject.extension.should == "wav"
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rivendell::Import::Notifier::Base do
|
4
|
+
|
5
|
+
subject { Rivendell::Import::Notifier::Test.new }
|
6
|
+
|
7
|
+
describe "#notify" do
|
8
|
+
|
9
|
+
let(:to_sent_notifications) { [mock(:task => mock)] }
|
10
|
+
|
11
|
+
before(:each) do
|
12
|
+
subject.stub_chain("notifications.to_sent").and_return(to_sent_notifications)
|
13
|
+
to_sent_notifications.stub :includes => to_sent_notifications, :update_all => true
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should notify! tasks of notifications#to_sent" do
|
17
|
+
subject.should_receive(:notify!).with to_sent_notifications.map(&:task)
|
18
|
+
subject.notify
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:now) { Time.now }
|
22
|
+
|
23
|
+
before(:each) do
|
24
|
+
Time.stub :now => now
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should mark notifications as sent" do
|
28
|
+
to_sent_notifications.should_receive(:update_all).with(:sent_at => now)
|
29
|
+
subject.notify
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
describe ".notify" do
|
35
|
+
|
36
|
+
describe "'recipient@domain', :by => :email" do
|
37
|
+
|
38
|
+
subject { Rivendell::Import::Notifier::Base.notify 'recipient@domain', :by => :email }
|
39
|
+
|
40
|
+
it { should be_instance_of(Rivendell::Import::Notifier::Mail) }
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should reuse an existing Notifier" do
|
45
|
+
notifier = Rivendell::Import::Notifier::Base.notify 'recipient@domain', :by => :email
|
46
|
+
other_notifier = Rivendell::Import::Notifier::Base.notify 'recipient@domain', :by => :email
|
47
|
+
other_notifier.should == notifier
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#key" do
|
53
|
+
|
54
|
+
it "should be defined with parameters hash by default" do
|
55
|
+
subject.key = nil
|
56
|
+
subject.stub :parameters => { :dummy => true }
|
57
|
+
subject.save!
|
58
|
+
subject.key.should == subject.parameters.hash
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rivendell::Import::Notifier::Mail do
|
4
|
+
|
5
|
+
let(:mail_notifier) do
|
6
|
+
Rivendell::Import::Notifier::Mail.new.tap do |notifier|
|
7
|
+
notifier.from = "root@tryphon.eu"
|
8
|
+
notifier.to = "root@tryphon.eu"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
subject { mail_notifier }
|
13
|
+
|
14
|
+
let(:tasks) { [ Rivendell::Import::Task.new ] }
|
15
|
+
|
16
|
+
describe "#template" do
|
17
|
+
|
18
|
+
let(:file) { fixture_file("mail-body.erb") }
|
19
|
+
|
20
|
+
it "should read file specified if exists" do
|
21
|
+
subject.template(file).should == File.read(file)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return given text if not file" do
|
25
|
+
subject.template("dummy").should == "dummy"
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#create_message" do
|
31
|
+
|
32
|
+
it "should return a Rivendell::Import::Notifier::Mail::Message" do
|
33
|
+
subject.create_message(tasks).should be_instance_of(Rivendell::Import::Notifier::Mail::Message)
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "returned Message" do
|
37
|
+
|
38
|
+
subject { mail_notifier.create_message(tasks) }
|
39
|
+
|
40
|
+
its(:from) { should == mail_notifier.from }
|
41
|
+
|
42
|
+
its(:to) { should == mail_notifier.to }
|
43
|
+
|
44
|
+
its(:body) { should == mail_notifier.template(mail_notifier.body) }
|
45
|
+
|
46
|
+
its(:subject) { should == mail_notifier.template(mail_notifier.subject) }
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#notify!" do
|
53
|
+
|
54
|
+
it "should deliver mail" do
|
55
|
+
subject.subject = subject.body = "Dummy"
|
56
|
+
subject.notify! tasks
|
57
|
+
Mail::TestMailer.deliveries.last.subject.should == subject.subject
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "defaults" do
|
63
|
+
|
64
|
+
subject { Rivendell::Import::Notifier::Mail.new }
|
65
|
+
|
66
|
+
its(:body) { should == File.expand_path("../../../../../lib/rivendell/import/notifier/mail-body.erb", __FILE__) }
|
67
|
+
|
68
|
+
its(:subject) { should == File.expand_path("../../../../../lib/rivendell/import/notifier/mail-subject.erb", __FILE__) }
|
69
|
+
|
70
|
+
it "should use defined default from" do
|
71
|
+
Rivendell::Import::Notifier::Mail.from = "test@dummy"
|
72
|
+
subject.from.should == Rivendell::Import::Notifier::Mail.from
|
73
|
+
end
|
74
|
+
|
75
|
+
after(:each) do
|
76
|
+
Rivendell::Import::Notifier::Mail.from = nil
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "reloaded" do
|
82
|
+
|
83
|
+
let(:original) { mail_notifier.save! ; mail_notifier }
|
84
|
+
|
85
|
+
subject { Rivendell::Import::Notifier::Mail.find(original) }
|
86
|
+
|
87
|
+
its(:from) { should == original.from }
|
88
|
+
its(:to) { should == original.to }
|
89
|
+
its(:subject) { should == original.subject }
|
90
|
+
its(:body) { should == original.body }
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
describe Rivendell::Import::Notifier::Mail::Message do
|
97
|
+
|
98
|
+
let(:tasks) { [ mock ] }
|
99
|
+
|
100
|
+
subject { Rivendell::Import::Notifier::Mail::Message.new(tasks) }
|
101
|
+
|
102
|
+
describe "#render" do
|
103
|
+
|
104
|
+
it "should render ERB template with Message context" do
|
105
|
+
subject.render("size: <%= tasks.size %>").should == "size: 1"
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
@@ -0,0 +1,217 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rivendell::Import::Task do
|
4
|
+
|
5
|
+
let(:file) { Rivendell::Import::File.new("dummy.wav") }
|
6
|
+
subject { Rivendell::Import::Task.new :file => file }
|
7
|
+
|
8
|
+
describe "#file" do
|
9
|
+
|
10
|
+
it "should return a file with specified path" do
|
11
|
+
Rivendell::Import::Task.new(:file => file).file.should == file
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#cart" do
|
17
|
+
|
18
|
+
it "should return a Cart associated to the task" do
|
19
|
+
subject.cart.task.should == subject
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#xport" do
|
25
|
+
|
26
|
+
it "should return a instance of Rivendell::API::Xport" do
|
27
|
+
subject.xport.should be_instance_of(Rivendell::API::Xport)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#prepare" do
|
33
|
+
|
34
|
+
it "should return the Task" do
|
35
|
+
subject.prepare { |file| } .should == subject
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should invoke the specified block with Task file" do
|
39
|
+
given_file = nil
|
40
|
+
subject.prepare do |file|
|
41
|
+
given_file = file
|
42
|
+
end
|
43
|
+
given_file.should == subject.file
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "#run" do
|
49
|
+
|
50
|
+
before(:each) do
|
51
|
+
subject.stub :destination => "test"
|
52
|
+
subject.stub :cart => mock(:create => true, :import => true, :update => true, :number => 123, :to_json => '')
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should create Cart" do
|
56
|
+
subject.cart.should_receive(:create)
|
57
|
+
subject.run
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should import File in Cart" do
|
61
|
+
subject.cart.should_receive(:import).with(subject.file)
|
62
|
+
subject.run
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should update Cart" do
|
66
|
+
subject.cart.should_receive(:update)
|
67
|
+
subject.run
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should change the status to completed" do
|
71
|
+
subject.run
|
72
|
+
subject.status.should be_completed
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should change the status to failed if an error is raised" do
|
76
|
+
subject.cart.stub(:create).and_raise("dummy")
|
77
|
+
subject.run
|
78
|
+
subject.status.should be_failed
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "#destination" do
|
84
|
+
|
85
|
+
it "should return 'Cart in group :group' if cart#group is defined" do
|
86
|
+
subject.cart.group = 'dummy'
|
87
|
+
subject.destination.should == "Cart in group dummy"
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should return 'Cart :number' if cart#number is defined" do
|
91
|
+
subject.cart.number = 123
|
92
|
+
subject.destination.should == "Cart 123"
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#tags" do
|
98
|
+
|
99
|
+
it "should be empty by default" do
|
100
|
+
subject.tags.should be_empty
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "#tag" do
|
106
|
+
|
107
|
+
it "should add the given tag" do
|
108
|
+
subject.tag "dummy"
|
109
|
+
subject.tags.should == %w{dummy}
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
describe "storage" do
|
115
|
+
|
116
|
+
it "should store destination" do
|
117
|
+
subject.cart.number = 123
|
118
|
+
subject.save
|
119
|
+
subject.destination.should == Rivendell::Import::Task.find(subject).destination
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should store tags separated with commas" do
|
123
|
+
subject.tags << "tag1" << "tag2"
|
124
|
+
subject.save
|
125
|
+
Rivendell::Import::Task.find(subject).raw_tags.should == "tag1,tag2"
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should store cart" do
|
129
|
+
subject.cart.number = 123
|
130
|
+
subject.save
|
131
|
+
Rivendell::Import::Task.find(subject).cart.number.should == 123
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
describe "#status" do
|
137
|
+
|
138
|
+
it "should be include in pending, completed, failed" do
|
139
|
+
pending
|
140
|
+
# subject.should validate_inclusion_of(:status, :in => %w{pending running completed failed})
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should be pending by default" do
|
144
|
+
subject.status.should be_pending
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
describe "#notifications" do
|
150
|
+
|
151
|
+
before(:each) do
|
152
|
+
subject.save!
|
153
|
+
end
|
154
|
+
|
155
|
+
it "should be empty by default" do
|
156
|
+
subject.notifications.should be_empty
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
160
|
+
|
161
|
+
describe "#notifiers" do
|
162
|
+
|
163
|
+
before(:each) do
|
164
|
+
subject.save!
|
165
|
+
end
|
166
|
+
|
167
|
+
let(:notifier) { Rivendell::Import::Notifier::Test.create! }
|
168
|
+
|
169
|
+
it "should create a Notification when a Notifier is added" do
|
170
|
+
subject.notifiers << notifier
|
171
|
+
subject.notifications.first.notifier.should == notifier
|
172
|
+
end
|
173
|
+
|
174
|
+
end
|
175
|
+
|
176
|
+
describe "#notify!" do
|
177
|
+
|
178
|
+
before(:each) do
|
179
|
+
subject.status = "completed"
|
180
|
+
subject.save!
|
181
|
+
subject.notifiers << notifier
|
182
|
+
end
|
183
|
+
|
184
|
+
let(:notifier) { Rivendell::Import::Notifier::Test.create! }
|
185
|
+
|
186
|
+
it "should notify task with all associated notifiers" do
|
187
|
+
subject.notify!
|
188
|
+
notifier.notified_tasks.should == [ subject ]
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should mark notification as sent" do
|
192
|
+
subject.notify!
|
193
|
+
subject.notifications.first.should be_sent
|
194
|
+
end
|
195
|
+
|
196
|
+
end
|
197
|
+
|
198
|
+
describe "#change_status!" do
|
199
|
+
|
200
|
+
it "should update_attribute :status" do
|
201
|
+
subject.should_receive(:update_attribute).with(:status, "completed")
|
202
|
+
subject.change_status! :completed
|
203
|
+
end
|
204
|
+
|
205
|
+
it "should notify change when status is completed" do
|
206
|
+
subject.should_receive(:notify!)
|
207
|
+
subject.change_status! :completed
|
208
|
+
end
|
209
|
+
|
210
|
+
it "should notify change when status is failed" do
|
211
|
+
subject.should_receive(:notify!)
|
212
|
+
subject.change_status! :failed
|
213
|
+
end
|
214
|
+
|
215
|
+
end
|
216
|
+
|
217
|
+
end
|