rivendell-import 0.0.4 → 0.0.5

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 CHANGED
@@ -1,11 +1,10 @@
1
- source "http://rubygems.org"
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
- gem "rivendell-api" # , :git => "git://projects.tryphon.priv/rivendell-api", :ref => "b98a46fbb0c31d965853206a56500cea4a340044" # , :path => "~/Projects/RivendellApi"
5
+ # gem "rivendell-db", :path => "~/Projects/RivendellDb"
6
6
 
7
7
  if RUBY_PLATFORM =~ /linux/
8
- gem 'libnotify'
9
- gem 'rb-inotify', '~> 0.8.8'
8
+ gem 'libnotify'
9
+ gem 'rb-inotify'
10
10
  end
11
-
data/Gemfile.lock CHANGED
@@ -1,36 +1,39 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rivendell-import (0.0.4)
4
+ rivendell-import (0.0.5)
5
5
  SyslogLogger (~> 2.0)
6
6
  activerecord (~> 3.2.8)
7
7
  activesupport (~> 3.2.8)
8
8
  daemons
9
9
  httmultiparty
10
- listen
10
+ listen (~> 1.2.1)
11
11
  mail
12
12
  rivendell-api (~> 0.0.4)
13
+ rivendell-db
13
14
  sinatra
14
15
  sqlite3
15
16
  trollop
16
17
  will_paginate (~> 3.0.0)
17
18
 
18
19
  GEM
19
- remote: http://rubygems.org/
20
+ remote: https://rubygems.org/
20
21
  specs:
21
22
  SyslogLogger (2.0)
22
- activemodel (3.2.9)
23
- activesupport (= 3.2.9)
23
+ activemodel (3.2.13)
24
+ activesupport (= 3.2.13)
24
25
  builder (~> 3.0.0)
25
- activerecord (3.2.9)
26
- activemodel (= 3.2.9)
27
- activesupport (= 3.2.9)
26
+ activerecord (3.2.13)
27
+ activemodel (= 3.2.13)
28
+ activesupport (= 3.2.13)
28
29
  arel (~> 3.0.2)
29
30
  tzinfo (~> 0.3.29)
30
- activesupport (3.2.9)
31
- i18n (~> 0.6)
31
+ activesupport (3.2.13)
32
+ i18n (= 0.6.1)
32
33
  multi_json (~> 1.0)
34
+ addressable (2.3.5)
33
35
  arel (3.0.2)
36
+ bcrypt-ruby (3.0.1)
34
37
  builder (3.0.3)
35
38
  cucumber (1.2.1)
36
39
  builder (>= 2.1.2)
@@ -38,9 +41,38 @@ GEM
38
41
  gherkin (~> 2.11.0)
39
42
  json (>= 1.4.6)
40
43
  daemons (1.1.9)
44
+ data_objects (0.10.13)
45
+ addressable (~> 2.1)
41
46
  database_cleaner (0.8.0)
42
47
  diff-lcs (1.1.3)
43
- ffi (1.1.5)
48
+ dm-core (1.2.1)
49
+ addressable (~> 2.3)
50
+ dm-do-adapter (1.2.0)
51
+ data_objects (~> 0.10.6)
52
+ dm-core (~> 1.2.0)
53
+ dm-mysql-adapter (1.2.0)
54
+ dm-do-adapter (~> 1.2.0)
55
+ do_mysql (~> 0.10.6)
56
+ dm-serializer (1.2.2)
57
+ dm-core (~> 1.2.0)
58
+ fastercsv (~> 1.5)
59
+ json (~> 1.6)
60
+ json_pure (~> 1.6)
61
+ multi_json (~> 1.0)
62
+ dm-types (1.2.2)
63
+ bcrypt-ruby (~> 3.0)
64
+ dm-core (~> 1.2.0)
65
+ fastercsv (~> 1.5)
66
+ json (~> 1.6)
67
+ multi_json (~> 1.0)
68
+ stringex (~> 1.4)
69
+ uuidtools (~> 2.1)
70
+ dm-validations (1.2.0)
71
+ dm-core (~> 1.2.0)
72
+ do_mysql (0.10.13)
73
+ data_objects (= 0.10.13)
74
+ fastercsv (1.5.5)
75
+ ffi (1.9.0)
44
76
  gherkin (2.11.2)
45
77
  json (>= 1.4.6)
46
78
  guard (1.4.0)
@@ -52,37 +84,49 @@ GEM
52
84
  guard-rspec (2.0.0)
53
85
  guard (>= 1.1)
54
86
  rspec (~> 2.11)
55
- httmultiparty (0.3.8)
87
+ httmultiparty (0.3.10)
56
88
  httparty (>= 0.7.3)
57
89
  multipart-post
58
- httparty (0.9.0)
90
+ httparty (0.11.0)
59
91
  multi_json (~> 1.0)
60
- multi_xml
92
+ multi_xml (>= 0.5.2)
61
93
  i18n (0.6.1)
62
94
  json (1.7.5)
95
+ json_pure (1.8.0)
63
96
  libnotify (0.8.0)
64
97
  ffi (>= 1.0.11)
65
- listen (0.5.3)
66
- mail (2.5.2)
67
- i18n (>= 0.4.0)
98
+ listen (1.2.2)
99
+ rb-fsevent (>= 0.9.3)
100
+ rb-inotify (>= 0.9)
101
+ rb-kqueue (>= 0.2)
102
+ mail (2.5.4)
68
103
  mime-types (~> 1.16)
69
104
  treetop (~> 1.4.8)
70
- mime-types (1.19)
105
+ mime-types (1.23)
71
106
  multi_json (1.4.0)
72
- multi_xml (0.5.1)
73
- multipart-post (1.1.5)
107
+ multi_xml (0.5.4)
108
+ multipart-post (1.2.0)
74
109
  null_logger (0.0.1)
75
110
  polyglot (0.3.3)
76
- rack (1.4.1)
77
- rack-protection (1.2.0)
111
+ rack (1.5.2)
112
+ rack-protection (1.5.0)
78
113
  rack
79
114
  rake (0.9.2.2)
80
- rb-inotify (0.8.8)
115
+ rb-fsevent (0.9.3)
116
+ rb-inotify (0.9.0)
117
+ ffi (>= 0.5.0)
118
+ rb-kqueue (0.2.0)
81
119
  ffi (>= 0.5.0)
82
120
  rivendell-api (0.0.4)
83
121
  activesupport
84
122
  httmultiparty
85
123
  null_logger
124
+ rivendell-db (0.0.1)
125
+ dm-core
126
+ dm-mysql-adapter
127
+ dm-serializer
128
+ dm-types
129
+ dm-validations
86
130
  rspec (2.11.0)
87
131
  rspec-core (~> 2.11.0)
88
132
  rspec-expectations (~> 2.11.0)
@@ -95,19 +139,21 @@ GEM
95
139
  multi_json (~> 1.0)
96
140
  simplecov-html (~> 0.5.3)
97
141
  simplecov-html (0.5.3)
98
- sinatra (1.3.3)
99
- rack (~> 1.3, >= 1.3.6)
100
- rack-protection (~> 1.2)
101
- tilt (~> 1.3, >= 1.3.3)
102
- sqlite3 (1.3.6)
142
+ sinatra (1.4.3)
143
+ rack (~> 1.4)
144
+ rack-protection (~> 1.4)
145
+ tilt (~> 1.3, >= 1.3.4)
146
+ sqlite3 (1.3.7)
147
+ stringex (1.5.1)
103
148
  thor (0.16.0)
104
- tilt (1.3.3)
105
- treetop (1.4.12)
149
+ tilt (1.4.1)
150
+ treetop (1.4.14)
106
151
  polyglot
107
152
  polyglot (>= 0.3.1)
108
153
  trollop (2.0)
109
- tzinfo (0.3.35)
110
- will_paginate (3.0.3)
154
+ tzinfo (0.3.37)
155
+ uuidtools (2.1.4)
156
+ will_paginate (3.0.4)
111
157
 
112
158
  PLATFORMS
113
159
  ruby
@@ -120,8 +166,7 @@ DEPENDENCIES
120
166
  guard-rspec
121
167
  libnotify
122
168
  rake
123
- rb-inotify (~> 0.8.8)
124
- rivendell-api
169
+ rb-inotify
125
170
  rivendell-import!
126
171
  rspec
127
172
  simplecov
data/examples/config.rb CHANGED
@@ -15,7 +15,6 @@ end
15
15
  Rivendell::Import::Notifier::Mail.from = "root@tryphon.eu"
16
16
 
17
17
  Rivendell::Import.config do |config|
18
-
19
18
  config.rivendell.host = "localhost"
20
19
  config.rivendell.login_name = "user"
21
20
  config.rivendell.password = ""
@@ -29,7 +28,7 @@ Rivendell::Import.config do |config|
29
28
  cart.clear_cuts!
30
29
  cart.find_by_title file.basename
31
30
  end
32
-
31
+
33
32
  cart.group ||= "TEST"
34
33
 
35
34
  # To delete file when task is completed
@@ -22,12 +22,15 @@ module Rivendell::Import
22
22
  workers << Worker.new(self).start unless options[:dry_run]
23
23
 
24
24
  Rivendell::Import.logger.info "Listen files in #{directory}"
25
- Listen.to(directory) do |modified, added, removed|
25
+
26
+ callback = Proc.new do |modified, added, removed|
26
27
  added.each do |file|
27
28
  Rivendell::Import.logger.debug "Detected file '#{file}'"
28
29
  file(file, directory)
29
30
  end
30
31
  end
32
+
33
+ Listen.to(directory).change(&callback).start!
31
34
  end
32
35
 
33
36
  def process(*paths)
@@ -54,7 +54,7 @@ module Rivendell::Import
54
54
  end
55
55
 
56
56
  def find_by_title(string, options = {})
57
- if remote_cart = carts_cache.find_by_title(string, options)
57
+ if remote_cart = cart_finder.find_by_title(string, options)
58
58
  self.number = remote_cart.number
59
59
  end
60
60
  end
@@ -66,10 +66,21 @@ module Rivendell::Import
66
66
  self.clear_cuts = true
67
67
  end
68
68
 
69
- def carts_cache
70
- @carts_cache ||= Rivendell::Import::CartsCache.new(xport)
69
+ @db_url = nil
70
+ cattr_accessor :db_url
71
+
72
+ def cart_finder
73
+ @cart_finder ||=
74
+ begin
75
+ unless db_url
76
+ Rivendell::Import::CartFinder::ByApi.new xport
77
+ else
78
+ Rivendell::DB.establish_connection(db_url)
79
+ Rivendell::Import::CartFinder::ByDb.new
80
+ end
81
+ end
71
82
  end
72
-
83
+
73
84
  end
74
85
  end
75
86
 
@@ -0,0 +1,62 @@
1
+ module Rivendell::Import
2
+ class CartFinder
3
+
4
+ def find_all_by_title(string, options = {})
5
+ normalizer = options.delete(:normalizer) || Proc.new { |id| id }
6
+
7
+ string = normalizer.call(string)
8
+ carts(options).select do |cart|
9
+ normalizer.call(cart.title) == string
10
+ end
11
+ end
12
+
13
+ def default_normalizer
14
+ Proc.new do |string|
15
+ ActiveSupport::Multibyte::Chars.new(string).normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.to_s.gsub(/[^a-z0-9]/," ").gsub(/[ ]+/," ")
16
+ end
17
+ end
18
+
19
+ def find_by_title(string, options = {})
20
+ matching_carts = find_all_by_title(string, options)
21
+
22
+ if matching_carts.blank?
23
+ matching_carts = find_all_by_title(string, options.merge(:normalizer => default_normalizer))
24
+ end
25
+
26
+ matching_carts.first if matching_carts.one?
27
+ end
28
+
29
+ class ByApi < CartFinder
30
+
31
+ attr_accessor :xport
32
+
33
+ def initialize(xport)
34
+ @xport = xport
35
+ end
36
+
37
+ def cache
38
+ clear if purged_at < time_to_live.ago
39
+ @cache ||= {}
40
+ end
41
+
42
+ def clear
43
+ @cache = nil
44
+ end
45
+
46
+ @@time_to_live = 600
47
+ cattr_accessor :time_to_live
48
+
49
+ attr_accessor :purged_at
50
+
51
+ def purged_at
52
+ @purged_at ||= Time.now
53
+ end
54
+
55
+ def carts(options = {})
56
+ cache[options.to_s] ||= xport.list_carts(options)
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+ end
@@ -0,0 +1,18 @@
1
+ # Find Carts using a direct database access.
2
+ #
3
+ # Provided to workaround actual accent problems experienced with Rivendell API.
4
+ module Rivendell::Import
5
+ class CartFinder::ByDb < CartFinder
6
+
7
+ def carts(options = {})
8
+ query_options = { :fields => [ :number, :title ] }
9
+
10
+ if options[:group]
11
+ query_options[:group_name] = options[:group]
12
+ end
13
+
14
+ Rivendell::DB::Cart.all(query_options)
15
+ end
16
+
17
+ end
18
+ end
@@ -46,7 +46,7 @@ module Rivendell::Import
46
46
 
47
47
  def parser
48
48
  @parser ||= Trollop::Parser.new do
49
- opt :config, "Configuration file", :type => String
49
+ opt :config, "Configuration file", :type => String, :required => true
50
50
  opt :listen, "Wait for files in given directory"
51
51
  opt :dry_run, "Just create tasks without executing them"
52
52
  opt :debug, "Enable debug messages (in stderr)"
@@ -78,7 +78,7 @@ module Rivendell::Import
78
78
  parsed_parser.leftovers
79
79
  end
80
80
 
81
- def setup_logger
81
+ def setup_logger
82
82
  new_logger =
83
83
  if syslog?
84
84
  Syslog::Logger.new('rivendell-import').tap do |syslog|
@@ -115,7 +115,7 @@ module Rivendell::Import
115
115
  Daemons.daemonize :app_name => "rivendell-import", :dir => pid_directory, :dir_mode => :normal
116
116
  end
117
117
  end
118
-
118
+
119
119
  def run
120
120
  setup_logger
121
121
 
@@ -131,7 +131,7 @@ module Rivendell::Import
131
131
  config_loader.listen_file
132
132
 
133
133
  if listen_mode?
134
- start_webserver
134
+ start_webserver
135
135
 
136
136
  listen_options = {}
137
137
  listen_options[:dry_run] = true if dry_run?
@@ -19,12 +19,12 @@ module Rivendell::Import
19
19
  callback = Proc.new do |modified, added, removed|
20
20
  if modified.include? absolute_path
21
21
  Rivendell::Import.logger.info "Configuration changed, reload it"
22
- load
22
+ load
23
23
  end
24
24
  end
25
25
 
26
26
  Rivendell::Import.logger.info "Listen to config file changes (#{file})"
27
- Listen.to(directory).filter(/^#{basename}$/).change(&callback).start(false)
27
+ Listen.to(directory).filter(/^#{basename}$/).change(&callback).start
28
28
  end
29
29
 
30
30
  def listen_file_with_inotify
@@ -99,5 +99,15 @@ module Rivendell::Import
99
99
  save!
100
100
  end
101
101
 
102
+ after_create :purge!
103
+
104
+ def purge!
105
+ self.class.purge!
106
+ end
107
+
108
+ def self.purge!
109
+ where("created_at < ?", 24.hours.ago).destroy_all
110
+ end
111
+
102
112
  end
103
113
  end
@@ -1,5 +1,5 @@
1
1
  module Rivendell
2
2
  module Import
3
- VERSION = "0.0.4"
3
+ VERSION = "0.0.5"
4
4
  end
5
5
  end
@@ -40,7 +40,7 @@ require "rivendell/import/worker"
40
40
  require "rivendell/import/task"
41
41
  require "rivendell/import/tasks"
42
42
  require "rivendell/import/base"
43
- require "rivendell/import/carts_cache"
43
+ require "rivendell/import/cart_finder"
44
44
  require "rivendell/import/cart"
45
45
  require "rivendell/import/context"
46
46
  require "rivendell/import/cut"
@@ -48,3 +48,7 @@ require "rivendell/import/file"
48
48
  require "rivendell/import/notification"
49
49
  require "rivendell/import/notifier/base"
50
50
  require "rivendell/import/notifier/mail"
51
+
52
+ # TODO Rivendell::Import::CartFinder::ByDb should be optional
53
+ require 'rivendell/db'
54
+ require 'rivendell/import/cart_finder_by_db'
@@ -15,7 +15,7 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Rivendell::Import::VERSION
17
17
 
18
- gem.add_runtime_dependency 'listen'
18
+ gem.add_runtime_dependency 'listen', '~> 1.2.1'
19
19
  gem.add_runtime_dependency 'httmultiparty'
20
20
  gem.add_runtime_dependency 'rivendell-api', '~> 0.0.4'
21
21
  gem.add_runtime_dependency 'trollop'
@@ -30,6 +30,8 @@ Gem::Specification.new do |gem|
30
30
 
31
31
  gem.add_runtime_dependency 'daemons'
32
32
 
33
+ gem.add_runtime_dependency 'rivendell-db'
34
+
33
35
  gem.add_development_dependency "simplecov"
34
36
  gem.add_development_dependency "rspec"
35
37
  gem.add_development_dependency "guard"
@@ -1,18 +1,13 @@
1
+ # -*- coding: utf-8 -*-
1
2
  require 'spec_helper'
2
3
 
3
- describe Rivendell::Import::CartsCache do
4
-
5
- let(:carts_cache) { Rivendell::Import::CartsCache.new(xport) }
6
- subject { carts_cache }
4
+ describe Rivendell::Import::CartFinder do
7
5
 
8
6
  let(:cart) { mock :title => "dummy" }
9
7
  let(:carts) { [ cart ] }
10
8
 
11
- let(:xport) { mock }
12
-
13
- before do
14
- subject.stub :xport => xport
15
- end
9
+ let(:cart_finder) { Rivendell::Import::CartFinder.new }
10
+ subject { cart_finder }
16
11
 
17
12
  describe "#find_all_by_title" do
18
13
 
@@ -41,7 +36,7 @@ describe Rivendell::Import::CartsCache do
41
36
 
42
37
  describe "#default_normalizer" do
43
38
 
44
- subject { carts_cache.default_normalizer }
39
+ subject { cart_finder.default_normalizer }
45
40
 
46
41
  it "should downcase string" do
47
42
  subject.call("ABC").should == "abc"
@@ -54,9 +49,50 @@ describe Rivendell::Import::CartsCache do
54
49
  it "should remove double spaces" do
55
50
  subject.call("a b c").should == "a b c"
56
51
  end
52
+
53
+ it "should remove accents" do
54
+ subject.call("Ç'est évident").should == "c est evident"
55
+ end
56
+
57
+ end
58
+
59
+ describe "#find_by_title" do
60
+
61
+ before do
62
+ subject.stub(:carts).and_return(carts)
63
+ end
57
64
 
65
+ it "should try an exact match" do
66
+ subject.find_by_title(cart.title).should == cart
67
+ end
68
+
69
+ it "should try a match with default normalizer" do
70
+ subject.find_by_title(cart.title.upcase).should == cart
71
+ end
72
+
73
+ it "should return nil when no cart matchs" do
74
+ subject.find_by_title("nothing").should be_nil
75
+ end
76
+
77
+ it "should return nil when several carts match" do
78
+ carts << cart
79
+ subject.find_by_title(cart.title).should be_nil
80
+ end
81
+
58
82
  end
59
83
 
84
+ end
85
+
86
+ describe Rivendell::Import::CartFinder::ByApi do
87
+
88
+ let(:cart_finder) { Rivendell::Import::CartFinder::ByApi.new(xport) }
89
+ subject { cart_finder }
90
+
91
+ let(:xport) { mock }
92
+
93
+ let(:cart) { mock :title => "dummy" }
94
+ let(:carts) { [ cart ] }
95
+
60
96
  describe "#carts" do
61
97
 
62
98
  before do
@@ -82,27 +118,29 @@ describe Rivendell::Import::CartsCache do
82
118
 
83
119
  end
84
120
 
85
- describe "#find_by_title" do
121
+ end
122
+
123
+ describe Rivendell::Import::CartFinder::ByDb do
124
+
125
+ let(:cart_finder) { Rivendell::Import::CartFinder::ByDb.new }
126
+ subject { cart_finder }
127
+
128
+ let(:cart) { mock :title => "dummy" }
129
+ let(:carts) { [ cart ] }
130
+
131
+ describe "#carts" do
86
132
 
87
133
  before do
88
- subject.stub(:carts).and_return(carts)
134
+ Rivendell::DB::Cart.stub :all => carts
89
135
  end
90
136
 
91
- it "should try an exact match" do
92
- subject.find_by_title(cart.title).should == cart
93
- end
94
-
95
- it "should try a match with default normalizer" do
96
- subject.find_by_title(cart.title.upcase).should == cart
97
- end
98
-
99
- it "should return nil when no cart matchs" do
100
- subject.find_by_title("nothing").should be_nil
137
+ it "should return Carts found in database" do
138
+ subject.carts.should == carts
101
139
  end
102
140
 
103
- it "should return nil when several carts match" do
104
- carts << cart
105
- subject.find_by_title(cart.title).should be_nil
141
+ it "should search in specified group if present" do
142
+ Rivendell::DB::Cart.should_receive(:all).with(hash_including(:group_name => "dummy")).and_return(carts)
143
+ subject.carts(:group => "dummy")
106
144
  end
107
145
 
108
146
  end
@@ -280,4 +280,25 @@ describe Rivendell::Import::Task do
280
280
 
281
281
  end
282
282
 
283
+ describe ".purge!" do
284
+
285
+ it "should remove tasks older than 24 hours" do
286
+ old_task = Rivendell::Import::Task.create! :file => file, :created_at => 25.hours.ago
287
+ Rivendell::Import::Task.purge!
288
+ Rivendell::Import::Task.exists?(old_task).should be_false
289
+ end
290
+
291
+ it "should keep recent tasks" do
292
+ task = Rivendell::Import::Task.create! :file => file
293
+ Rivendell::Import::Task.purge!
294
+ Rivendell::Import::Task.exists?(task).should be_true
295
+ end
296
+
297
+ it "should be invoked each time a new Task is created" do
298
+ Rivendell::Import::Task.should_receive(:purge!)
299
+ Rivendell::Import::Task.create! :file => file
300
+ end
301
+
302
+ end
303
+
283
304
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rivendell-import
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,24 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-01 00:00:00.000000000 Z
12
+ date: 2013-07-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: listen
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: '0'
21
+ version: 1.2.1
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ! '>='
27
+ - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: '0'
29
+ version: 1.2.1
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: httmultiparty
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -203,6 +203,22 @@ dependencies:
203
203
  - - ! '>='
204
204
  - !ruby/object:Gem::Version
205
205
  version: '0'
206
+ - !ruby/object:Gem::Dependency
207
+ name: rivendell-db
208
+ requirement: !ruby/object:Gem::Requirement
209
+ none: false
210
+ requirements:
211
+ - - ! '>='
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ type: :runtime
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ! '>='
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
206
222
  - !ruby/object:Gem::Dependency
207
223
  name: simplecov
208
224
  requirement: !ruby/object:Gem::Requirement
@@ -364,7 +380,8 @@ files:
364
380
  - lib/rivendell/import/application.rb
365
381
  - lib/rivendell/import/base.rb
366
382
  - lib/rivendell/import/cart.rb
367
- - lib/rivendell/import/carts_cache.rb
383
+ - lib/rivendell/import/cart_finder.rb
384
+ - lib/rivendell/import/cart_finder_by_db.rb
368
385
  - lib/rivendell/import/cli.rb
369
386
  - lib/rivendell/import/config.rb
370
387
  - lib/rivendell/import/config_loader.rb
@@ -393,8 +410,8 @@ files:
393
410
  - rivendell-import.gemspec
394
411
  - spec/fixtures/mail-body.erb
395
412
  - spec/rivendell/import/base_spec.rb
413
+ - spec/rivendell/import/cart_finder_spec.rb
396
414
  - spec/rivendell/import/cart_spec.rb
397
- - spec/rivendell/import/carts_cache_spec.rb
398
415
  - spec/rivendell/import/cli_spec.rb
399
416
  - spec/rivendell/import/config_spec.rb
400
417
  - spec/rivendell/import/context_spec.rb
@@ -429,7 +446,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
429
446
  version: '0'
430
447
  segments:
431
448
  - 0
432
- hash: -1619764904591619983
449
+ hash: 3691791623266021807
433
450
  required_rubygems_version: !ruby/object:Gem::Requirement
434
451
  none: false
435
452
  requirements:
@@ -438,7 +455,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
438
455
  version: '0'
439
456
  segments:
440
457
  - 0
441
- hash: -1619764904591619983
458
+ hash: 3691791623266021807
442
459
  requirements: []
443
460
  rubyforge_project:
444
461
  rubygems_version: 1.8.23
@@ -453,8 +470,8 @@ test_files:
453
470
  - features/support/mock_xport.rb
454
471
  - spec/fixtures/mail-body.erb
455
472
  - spec/rivendell/import/base_spec.rb
473
+ - spec/rivendell/import/cart_finder_spec.rb
456
474
  - spec/rivendell/import/cart_spec.rb
457
- - spec/rivendell/import/carts_cache_spec.rb
458
475
  - spec/rivendell/import/cli_spec.rb
459
476
  - spec/rivendell/import/config_spec.rb
460
477
  - spec/rivendell/import/context_spec.rb
@@ -1,58 +0,0 @@
1
- module Rivendell::Import
2
- class CartsCache
3
-
4
- attr_accessor :xport
5
-
6
- def initialize(xport)
7
- @xport = xport
8
- end
9
-
10
- def find_all_by_title(string, options = {})
11
- normalizer = options.delete(:normalizer) || Proc.new { |id| id }
12
-
13
- string = normalizer.call(string)
14
- carts(options).select do |cart|
15
- normalizer.call(cart.title) == string
16
- end
17
- end
18
-
19
- def default_normalizer
20
- Proc.new do |string|
21
- string.downcase.gsub(/[^a-z0-9]/," ").gsub(/[ ]+/," ")
22
- end
23
- end
24
-
25
- def find_by_title(string, options = {})
26
- matching_carts = find_all_by_title(string, options)
27
-
28
- if matching_carts.blank?
29
- matching_carts = find_all_by_title(string, options.merge(:normalizer => default_normalizer))
30
- end
31
-
32
- matching_carts.first if matching_carts.one?
33
- end
34
-
35
- def cache
36
- clear if purged_at < time_to_live.ago
37
- @cache ||= {}
38
- end
39
-
40
- def clear
41
- @cache = nil
42
- end
43
-
44
- @@time_to_live = 600
45
- cattr_accessor :time_to_live
46
-
47
- attr_accessor :purged_at
48
-
49
- def purged_at
50
- @purged_at ||= Time.now
51
- end
52
-
53
- def carts(options = {})
54
- cache[options.to_s] ||= xport.list_carts(options)
55
- end
56
-
57
- end
58
- end