pyramid_scheme 0.1.6 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -19,3 +19,5 @@ rdoc
19
19
  pkg
20
20
 
21
21
  ## PROJECT::SPECIFIC
22
+ *.gemspec
23
+ spec/integrations/s3.yml
data/Rakefile CHANGED
@@ -13,6 +13,7 @@ begin
13
13
  gem.authors = ["Dan Pickett"]
14
14
  gem.add_dependency "rake", ">= 0.8.7"
15
15
  gem.add_dependency "configatron"
16
+ gem.add_dependency "aws-s3", ">= 0.5.1"
16
17
  gem.add_development_dependency "rspec", ">= 1.2.9"
17
18
  gem.add_development_dependency "yard", ">= 0"
18
19
  gem.add_development_dependency "mocha", "0.9.8"
@@ -27,7 +28,16 @@ end
27
28
  require 'spec/rake/spectask'
28
29
  Spec::Rake::SpecTask.new(:spec) do |spec|
29
30
  spec.libs << 'lib' << 'spec'
30
- spec.spec_files = FileList['spec/**/*_spec.rb']
31
+ spec.spec_files = FileList['spec/pyramid_scheme/*_spec.rb']
32
+ end
33
+
34
+ namespace :spec do
35
+
36
+ Spec::Rake::SpecTask.new(:integrations) do |spec|
37
+ spec.libs << 'lib' << 'spec'
38
+ spec.spec_files = FileList['spec/integrations/*_spec.rb']
39
+
40
+ end
31
41
  end
32
42
 
33
43
  Spec::Rake::SpecTask.new(:rcov) do |spec|
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.6
1
+ 0.2.0
@@ -1,17 +1,23 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
+
3
4
  require 'configatron'
5
+ require 'aws/s3'
4
6
 
5
7
  require 'pyramid_scheme/required_configuration_not_found'
6
8
 
7
9
  require 'pyramid_scheme/indexer/base'
8
10
  require 'pyramid_scheme/indexer/thinking_sphinx'
9
11
  require 'pyramid_scheme/indexer/ultrasphinx'
10
-
11
-
12
- require 'pyramid_scheme/index_lock_file'
13
12
  require 'pyramid_scheme/configuration'
13
+
14
+ require 'pyramid_scheme/index_provider/base'
14
15
  require 'pyramid_scheme/index_provider/file_system'
16
+ require 'pyramid_scheme/index_provider/s3'
17
+
18
+ require 'pyramid_scheme/lock/base'
19
+ require 'pyramid_scheme/lock/file'
20
+ require 'pyramid_scheme/lock/s3'
15
21
 
16
22
  require 'pyramid_scheme/index_server'
17
23
 
@@ -26,7 +26,11 @@ module PyramidScheme
26
26
  end
27
27
 
28
28
  def self.defaults
29
- { :lock_file_name => 'pyramid_scheme_index_in_progress.txt' }
29
+ {
30
+ :lock_file_name => 'pyramid_scheme_index_in_progress.txt',
31
+ :index_provider_class => PyramidScheme::IndexProvider::FileSystem,
32
+ :indexer_class => PyramidScheme::Indexer::ThinkingSphinx
33
+ }
30
34
  end
31
35
 
32
36
  def [](key)
@@ -2,7 +2,8 @@ module PyramidScheme
2
2
  class IndexClient
3
3
  attr_reader :index_provider
4
4
  def initialize(options = {})
5
- @index_provider = PyramidScheme::IndexProvider::FileSystem.new
5
+ @configuration = PyramidScheme::Configuration.new(options)
6
+ @index_provider = @configuration[:index_provider_class].new
6
7
  end
7
8
 
8
9
  def retrieve_index
@@ -0,0 +1,87 @@
1
+ module PyramidScheme
2
+ module IndexProvider
3
+ class Base
4
+ class << self
5
+ def maximum_copy_attempts
6
+ 5
7
+ end
8
+
9
+ def required_options
10
+ []
11
+ end
12
+ end
13
+
14
+ attr_reader :configuration, :copy_attempts
15
+
16
+ def initialize(options = {})
17
+ @configuration = PyramidScheme::Configuration.new(options)
18
+ ensure_required_options_are_present
19
+ @copy_attempts = 0
20
+ end
21
+
22
+ def index_in_progress?
23
+ raise_override
24
+ end
25
+
26
+ def process_index
27
+ raise_override
28
+ end
29
+
30
+ def provide_client_with_index
31
+ raise_override
32
+ end
33
+
34
+ def lock
35
+ raise_override
36
+ end
37
+
38
+ def retrieve_index
39
+ client_copy
40
+ end
41
+
42
+ def index_in_progress?
43
+ lock.exists?
44
+ end
45
+
46
+ protected
47
+ def ensure_required_options_are_present
48
+ self.class.required_options.each do |opt|
49
+ if @configuration[opt].nil?
50
+ raise PyramidScheme::RequiredConfigurationNotFound,
51
+ "the #{opt} setting was not found"
52
+ end
53
+ end
54
+ end
55
+
56
+ def attempt_to_copy
57
+ @copy_attempts += 1
58
+ if index_in_progress?
59
+ Kernel.sleep(5)
60
+ retrieve_index
61
+ else
62
+ provide_client_with_index
63
+ end
64
+ end
65
+
66
+ def client_copy
67
+ if !exceeded_maximum_copy_attempts?
68
+ attempt_to_copy
69
+ else
70
+ raise "copying sphinx indexes failed after maximum number of attempts"
71
+ end
72
+ end
73
+
74
+
75
+ def exceeded_maximum_copy_attempts?
76
+ copy_attempts > self.class.maximum_copy_attempts
77
+ end
78
+
79
+
80
+ private
81
+ def raise_override
82
+ raise "you must override this function"
83
+ end
84
+
85
+ end
86
+ end
87
+ end
@@ -1,70 +1,26 @@
1
1
  module PyramidScheme
2
2
  module IndexProvider
3
- class FileSystem
4
- MAXIMUM_COPY_ATTEMPTS = 5
5
- REQUIRED_OPTIONS = [
6
- :server_source_path,
7
- :server_destination_path,
8
- :client_source_path,
9
- :client_destination_path
10
- ]
11
-
12
- attr_reader :configuration, :copy_attempts
13
-
14
- def initialize(options = {})
15
- @configuration = PyramidScheme::Configuration.new(options)
16
- ensure_required_options_are_present
17
- @copy_attempts = 0
18
- end
19
-
20
- def index_in_progress?
21
- PyramidScheme::IndexLockFile.exists?
3
+ class FileSystem < IndexProvider::Base
4
+ class << self
5
+ def required_options
6
+ [
7
+ :server_source_path,
8
+ :server_destination_path,
9
+ :client_source_path,
10
+ :client_destination_path
11
+ ]
12
+ end
22
13
  end
23
14
 
24
15
  def process_index
25
16
  server_copy
26
17
  end
27
-
28
- def retrieve_index
29
- client_copy
18
+
19
+ def lock
20
+ @lock ||= PyramidScheme::Lock::File.new
30
21
  end
31
-
32
- private
33
- def server_copy
34
- Configuration::INDEX_FILE_EXTENSIONS.each do |ext|
35
- Dir[File.join(self.configuration[:server_source_path], "*#{ext}")].each do |f|
36
- FileUtils.cp_r(f, "#{self.configuration[:server_destination_path]}")
37
- end
38
- end
39
- end
40
-
41
- def client_copy
42
- if !exceeded_maximum_copy_attempts?
43
- attempt_to_copy
44
- else
45
- raise "copying sphinx indexes failed after maximum number of attempts"
46
- end
47
- end
48
-
49
- def ensure_required_options_are_present
50
- REQUIRED_OPTIONS.each do |opt|
51
- if configuration[opt].nil?
52
- raise PyramidScheme::RequiredConfigurationNotFound, "the #{opt} setting was not found"
53
- end
54
- end
55
- end
56
-
57
- def attempt_to_copy
58
- @copy_attempts += 1
59
- if index_in_progress?
60
- Kernel.sleep(5)
61
- client_copy
62
- else
63
- copy_client_files
64
- end
65
- end
66
-
67
- def copy_client_files
22
+
23
+ def provide_client_with_index
68
24
  Configuration::INDEX_FILE_EXTENSIONS.each do |ext|
69
25
  Dir[File.join(self.configuration[:client_source_path], "*#{ext}")].each do |f|
70
26
  new_filename = File.basename(f.gsub(/\./, ".new."))
@@ -72,12 +28,16 @@ module PyramidScheme
72
28
  "#{self.configuration[:client_destination_path]}/#{new_filename}")
73
29
  end
74
30
  end
75
-
76
31
  end
77
32
 
78
- def exceeded_maximum_copy_attempts?
79
- copy_attempts > MAXIMUM_COPY_ATTEMPTS
80
- end
33
+ private
34
+ def server_copy
35
+ Configuration::INDEX_FILE_EXTENSIONS.each do |ext|
36
+ Dir[File.join(self.configuration[:server_source_path], "*#{ext}")].each do |f|
37
+ FileUtils.cp_r(f, "#{self.configuration[:server_destination_path]}")
38
+ end
39
+ end
40
+ end
81
41
  end
82
42
  end
83
43
  end
@@ -0,0 +1,68 @@
1
+ module PyramidScheme
2
+ module IndexProvider
3
+ class S3 < PyramidScheme::IndexProvider::Base
4
+ class << self
5
+ def required_options
6
+ [
7
+ :access_key,
8
+ :secret_access_key,
9
+ :bucket,
10
+ :prefix,
11
+ :server_source_path,
12
+ :client_destination_path
13
+ ]
14
+ end
15
+
16
+ def establish_connection!
17
+ @connection ||= AWS::S3::Base.establish_connection!(
18
+ :access_key_id => PyramidScheme.configuration[:access_key],
19
+ :secret_access_key => PyramidScheme.configuration[:secret_access_key]
20
+ )
21
+ end
22
+
23
+ end
24
+
25
+ def initialize(options = {})
26
+ super
27
+ self.class.establish_connection!
28
+ end
29
+
30
+ def process_index
31
+ server_copy
32
+ end
33
+
34
+ def provide_client_with_index
35
+ Configuration::INDEX_FILE_EXTENSIONS.each do |ext|
36
+ AWS::S3::Bucket.objects(@configuration[:bucket],
37
+ :prefix => @configuration[:prefix]).each do |obj|
38
+
39
+ new_filename = File.basename(obj.key.gsub(@configuration[:prefix], '').gsub(/\./, ".new."))
40
+ destined_path = File.join(@configuration[:client_destination_path], new_filename)
41
+ File.open(destined_path, 'w') do |file|
42
+ AWS::S3::S3Object.stream(obj.key, @configuration[:bucket]) do |chunk|
43
+ file.write chunk
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ def lock
51
+ @lock ||= PyramidScheme::Lock::S3.new
52
+ end
53
+
54
+ private
55
+ def server_copy
56
+ Configuration::INDEX_FILE_EXTENSIONS.each do |ext|
57
+ Dir[File.join(@configuration[:server_source_path], "*#{ext}")].each do |f|
58
+ AWS::S3::S3Object.store("#{@configuration[:prefix]}/#{File.basename(f)}",
59
+ File.open(f),
60
+ @configuration[:bucket]
61
+ )
62
+ end
63
+ end
64
+
65
+ end
66
+ end
67
+ end
68
+ end
@@ -5,9 +5,9 @@ module PyramidScheme
5
5
  # initializes a new index server
6
6
  # @param options [Hash] takes an optional :indexer_class (defaults to PyramidScheme::ThinkingSphinxIndexer
7
7
  def initialize(options = {})
8
- @index_provider = PyramidScheme::IndexProvider::FileSystem.new
9
8
  @configuration = PyramidScheme::Configuration.new
10
- @indexer_class = configuration[:indexer_class] || PyramidScheme::Indexer::ThinkingSphinx
9
+ @index_provider = @configuration[:index_provider_class].new
10
+ @indexer_class = @configuration[:indexer_class]
11
11
  end
12
12
 
13
13
  # @returns [PyramidScheme::Indexer::Base] an instance of the specified indexer_class from initialization
@@ -26,11 +26,11 @@ module PyramidScheme
26
26
 
27
27
  private
28
28
  def create_lock_file
29
- PyramidScheme::IndexLockFile.create
29
+ @index_provider.lock.create
30
30
  end
31
31
 
32
32
  def destroy_lock_file
33
- PyramidScheme::IndexLockFile.destroy
33
+ @index_provider.lock.destroy
34
34
  end
35
35
  end
36
36
  end
@@ -0,0 +1,17 @@
1
+ module PyramidScheme
2
+ module Lock
3
+ class Base
4
+ def exists?
5
+ raise_override
6
+ end
7
+
8
+ def create
9
+ raise_override
10
+ end
11
+
12
+ def destroy
13
+ raise_override
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,28 @@
1
+ module PyramidScheme
2
+ module Lock
3
+ class File < PyramidScheme::Lock::Base
4
+ def exists?
5
+ ::File.exists?(client_path)
6
+ end
7
+
8
+ def create
9
+ FileUtils.touch(server_path)
10
+ end
11
+
12
+ def destroy
13
+ FileUtils.rm_f(server_path)
14
+ end
15
+
16
+ private
17
+ def server_path
18
+ ::File.join(PyramidScheme.configuration[:server_destination_path],
19
+ PyramidScheme.configuration[:lock_file_name])
20
+ end
21
+
22
+ def client_path
23
+ ::File.join(PyramidScheme.configuration[:client_source_path],
24
+ PyramidScheme.configuration[:lock_file_name])
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,30 @@
1
+ module PyramidScheme
2
+ module Lock
3
+ class S3 < PyramidScheme::Lock::Base
4
+ def initialize
5
+ PyramidScheme::IndexProvider::S3.establish_connection!
6
+ end
7
+
8
+ def exists?
9
+ AWS::S3::S3Object.exists?(key_name, bucket)
10
+ end
11
+
12
+ def create
13
+ AWS::S3::S3Object.store(key_name, "", bucket)
14
+ end
15
+
16
+ def destroy
17
+ AWS::S3::S3Object.delete(key_name, bucket)
18
+ end
19
+
20
+ protected
21
+ def bucket
22
+ PyramidScheme.configuration[:bucket]
23
+ end
24
+
25
+ def key_name
26
+ "#{PyramidScheme.configuration[:prefix]}/#{PyramidScheme.configuration[:lock_file_name]}"
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,5 @@
1
+ access_key: key
2
+ secret_access_key: key
3
+ bucket: bucket_name
4
+ prefix: some_path_prefix
5
+
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+
3
+ describe "S3 index provider" do
4
+ before(:each) do
5
+ load_configuration_from_yaml
6
+ @provider = PyramidScheme::IndexProvider::S3.new
7
+ end
8
+
9
+ describe "lock files" do
10
+ it 'should create a key in the s3 bucket and prefix' do
11
+ PyramidScheme::Lock::S3.new.create
12
+ PyramidScheme::Lock::S3.new.exists?.should be_true
13
+ end
14
+
15
+ it 'should remove a key in the s3 bucket and prefix' do
16
+ PyramidScheme::Lock::S3.new.destroy
17
+ PyramidScheme::Lock::S3.new.exists?.should be_false
18
+ end
19
+ end
20
+
21
+ describe "populating index files" do
22
+ before(:each) do
23
+
24
+ end
25
+ it 'should copy all the relevant index files to s3 on processing' do
26
+ FileUtils.mkdir_p(PyramidScheme.configuration[:server_source_path])
27
+ FileUtils.mkdir_p(PyramidScheme.configuration[:server_destination_path])
28
+ @filenames = [
29
+ '.spi',
30
+ '.spd',
31
+ '.spa',
32
+ '.sph',
33
+ '.spm',
34
+ '.spp',
35
+ '.spk'
36
+ ].collect{|s| "some_index#{s}" }
37
+
38
+ @filenames.each do |f|
39
+ FileUtils.touch(File.join(PyramidScheme.configuration[:server_source_path], f))
40
+ File.exists?(File.join(PyramidScheme.configuration[:server_source_path], f)).should be_true
41
+ end
42
+
43
+ @provider.process_index
44
+
45
+ @filenames.each do |f|
46
+ AWS::S3::S3Object.exists?("#{PyramidScheme.configuration[:prefix]}/#{@filename}",
47
+ PyramidScheme.configuration[:bucket])
48
+ end
49
+ end
50
+ end
51
+
52
+ describe "providing index files" do
53
+ it 'should download all the relevant index files to s3 on providing' do
54
+ FileUtils.mkdir_p(PyramidScheme.configuration[:client_destination_path])
55
+ @provider.retrieve_index
56
+
57
+ [
58
+ '.spi',
59
+ '.spd',
60
+ '.spa',
61
+ '.sph',
62
+ '.spm',
63
+ '.spp',
64
+ '.spk'
65
+ ].collect{|s| "some_index#{s}" }.each do |f|
66
+ File.exists?(File.join(PyramidScheme.configuration[:client_destination_path],
67
+ f.gsub(/\./, '.new.'))).should be_true
68
+ end
69
+
70
+ end
71
+ end
72
+
73
+ def load_configuration_from_yaml
74
+ FakeFS.deactivate!
75
+ yml_config = YAML.load_file(File.join(File.dirname(__FILE__), 's3.yml'))
76
+
77
+ PyramidScheme.configure do |config|
78
+ config.index_provider_class = PyramidScheme::IndexProvider::S3
79
+ config.access_key = yml_config["access_key"]
80
+ config.secret_access_key = yml_config["secret_access_key"]
81
+ config.bucket = yml_config["bucket"]
82
+ config.prefix = yml_config["prefix"]
83
+ config.server_source_path = "/some/server/source"
84
+ config.client_destination_path = "/some/client/destination"
85
+ end
86
+
87
+ FakeFS.activate!
88
+
89
+ end
90
+ end
@@ -95,18 +95,22 @@ describe "copying from the filesytem" do
95
95
  ].collect{|s| "some_index#{s}" }
96
96
 
97
97
  @filenames.each do |f|
98
- FileUtils.touch(File.join(PyramidScheme.configuration[:client_source_path], f))
99
- File.exists?(File.join(PyramidScheme.configuration[:client_source_path], f)).should be_true
98
+ FileUtils.touch(::File.join(PyramidScheme.configuration[:client_source_path], f))
99
+ ::File.exists?(::File.join(PyramidScheme.configuration[:client_source_path], f)).should be_true
100
100
  end
101
101
 
102
102
  @provider.retrieve_index
103
103
 
104
104
  @filenames.each do |f|
105
- new_filename = File.basename(f).gsub(/\./, ".new.")
106
- File.exists?(File.join(PyramidScheme.configuration[:client_destination_path],
105
+ new_filename = ::File.basename(f).gsub(/\./, ".new.")
106
+ ::File.exists?(::File.join(PyramidScheme.configuration[:client_destination_path],
107
107
  new_filename)).should be_true
108
108
  end
109
109
 
110
110
  end
111
+
112
+ it 'should have a lock file' do
113
+ @provider.lock.should be_kind_of(PyramidScheme::Lock::File)
114
+ end
111
115
  end
112
116
 
data/spec/spec_helper.rb CHANGED
@@ -20,3 +20,11 @@ Spec::Runner.configure do |config|
20
20
  end
21
21
  end
22
22
  end
23
+
24
+ module FakeFS
25
+ class File
26
+ def size
27
+ 0
28
+ end
29
+ end
30
+ end
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pyramid_scheme
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
5
10
  platform: ruby
6
11
  authors:
7
12
  - Dan Pickett
@@ -9,69 +14,103 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-02-17 00:00:00 -05:00
17
+ date: 2010-03-08 00:00:00 -05:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: rake
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ">="
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ - 8
30
+ - 7
23
31
  version: 0.8.7
24
- version:
32
+ type: :runtime
33
+ version_requirements: *id001
25
34
  - !ruby/object:Gem::Dependency
26
35
  name: configatron
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
30
38
  requirements:
31
39
  - - ">="
32
40
  - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
33
43
  version: "0"
34
- version:
44
+ type: :runtime
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: aws-s3
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ segments:
54
+ - 0
55
+ - 5
56
+ - 1
57
+ version: 0.5.1
58
+ type: :runtime
59
+ version_requirements: *id003
35
60
  - !ruby/object:Gem::Dependency
36
61
  name: rspec
37
- type: :development
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
62
+ prerelease: false
63
+ requirement: &id004 !ruby/object:Gem::Requirement
40
64
  requirements:
41
65
  - - ">="
42
66
  - !ruby/object:Gem::Version
67
+ segments:
68
+ - 1
69
+ - 2
70
+ - 9
43
71
  version: 1.2.9
44
- version:
72
+ type: :development
73
+ version_requirements: *id004
45
74
  - !ruby/object:Gem::Dependency
46
75
  name: yard
47
- type: :development
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
76
+ prerelease: false
77
+ requirement: &id005 !ruby/object:Gem::Requirement
50
78
  requirements:
51
79
  - - ">="
52
80
  - !ruby/object:Gem::Version
81
+ segments:
82
+ - 0
53
83
  version: "0"
54
- version:
84
+ type: :development
85
+ version_requirements: *id005
55
86
  - !ruby/object:Gem::Dependency
56
87
  name: mocha
57
- type: :development
58
- version_requirement:
59
- version_requirements: !ruby/object:Gem::Requirement
88
+ prerelease: false
89
+ requirement: &id006 !ruby/object:Gem::Requirement
60
90
  requirements:
61
91
  - - "="
62
92
  - !ruby/object:Gem::Version
93
+ segments:
94
+ - 0
95
+ - 9
96
+ - 8
63
97
  version: 0.9.8
64
- version:
98
+ type: :development
99
+ version_requirements: *id006
65
100
  - !ruby/object:Gem::Dependency
66
101
  name: fakefs
67
- type: :development
68
- version_requirement:
69
- version_requirements: !ruby/object:Gem::Requirement
102
+ prerelease: false
103
+ requirement: &id007 !ruby/object:Gem::Requirement
70
104
  requirements:
71
105
  - - "="
72
106
  - !ruby/object:Gem::Version
107
+ segments:
108
+ - 0
109
+ - 2
110
+ - 1
73
111
  version: 0.2.1
74
- version:
112
+ type: :development
113
+ version_requirements: *id007
75
114
  description: Sphinx index propagtion (currently via the filesystem)
76
115
  email: dpickett@enlightsolutions.com
77
116
  executables: []
@@ -91,18 +130,23 @@ files:
91
130
  - lib/pyramid_scheme.rb
92
131
  - lib/pyramid_scheme/configuration.rb
93
132
  - lib/pyramid_scheme/index_client.rb
94
- - lib/pyramid_scheme/index_lock_file.rb
133
+ - lib/pyramid_scheme/index_provider/base.rb
95
134
  - lib/pyramid_scheme/index_provider/file_system.rb
135
+ - lib/pyramid_scheme/index_provider/s3.rb
96
136
  - lib/pyramid_scheme/index_server.rb
97
137
  - lib/pyramid_scheme/indexer/base.rb
98
138
  - lib/pyramid_scheme/indexer/thinking_sphinx.rb
99
139
  - lib/pyramid_scheme/indexer/ultrasphinx.rb
140
+ - lib/pyramid_scheme/lock/base.rb
141
+ - lib/pyramid_scheme/lock/file.rb
142
+ - lib/pyramid_scheme/lock/s3.rb
100
143
  - lib/pyramid_scheme/required_configuration_not_found.rb
101
144
  - lib/pyramid_scheme/tasks.rb
102
145
  - lib/pyramid_scheme/tasks/rake_tasks.rake
103
146
  - lib/pyramid_scheme/thinking_sphinx_indexer.rb
104
147
  - lib/pyramid_scheme/ultrasphinx_indexer.rb
105
- - pyramid_scheme.gemspec
148
+ - spec/integrations/s3.example.yml
149
+ - spec/integrations/s3_spec.rb
106
150
  - spec/pyramid_scheme.rb
107
151
  - spec/pyramid_scheme/index_client_spec.rb
108
152
  - spec/pyramid_scheme/index_provider/file_system_spec.rb
@@ -126,22 +170,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
126
170
  requirements:
127
171
  - - ">="
128
172
  - !ruby/object:Gem::Version
173
+ segments:
174
+ - 0
129
175
  version: "0"
130
- version:
131
176
  required_rubygems_version: !ruby/object:Gem::Requirement
132
177
  requirements:
133
178
  - - ">="
134
179
  - !ruby/object:Gem::Version
180
+ segments:
181
+ - 0
135
182
  version: "0"
136
- version:
137
183
  requirements: []
138
184
 
139
185
  rubyforge_project:
140
- rubygems_version: 1.3.5
186
+ rubygems_version: 1.3.6
141
187
  signing_key:
142
188
  specification_version: 3
143
189
  summary: Sphinx index propagation
144
190
  test_files:
191
+ - spec/integrations/s3_spec.rb
145
192
  - spec/pyramid_scheme/index_client_spec.rb
146
193
  - spec/pyramid_scheme/index_provider/file_system_spec.rb
147
194
  - spec/pyramid_scheme/index_provider_configuration_spec.rb
@@ -1,25 +0,0 @@
1
- module PyramidScheme
2
- class IndexLockFile
3
- def self.server_path
4
- File.join(PyramidScheme.configuration[:server_destination_path],
5
- PyramidScheme.configuration[:lock_file_name])
6
- end
7
-
8
- def self.client_path
9
- File.join(PyramidScheme.configuration[:client_source_path],
10
- PyramidScheme.configuration[:lock_file_name])
11
- end
12
-
13
- def self.exists?
14
- File.exists?(client_path)
15
- end
16
-
17
- def self.create
18
- FileUtils.touch(server_path)
19
- end
20
-
21
- def self.destroy
22
- FileUtils.rm_f(server_path)
23
- end
24
- end
25
- end
@@ -1,96 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = %q{pyramid_scheme}
8
- s.version = "0.1.6"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Dan Pickett"]
12
- s.date = %q{2010-02-17}
13
- s.description = %q{Sphinx index propagtion (currently via the filesystem)}
14
- s.email = %q{dpickett@enlightsolutions.com}
15
- s.extra_rdoc_files = [
16
- "LICENSE",
17
- "README.rdoc"
18
- ]
19
- s.files = [
20
- ".document",
21
- ".gitignore",
22
- "LICENSE",
23
- "README.rdoc",
24
- "Rakefile",
25
- "VERSION",
26
- "lib/pyramid_scheme.rb",
27
- "lib/pyramid_scheme/configuration.rb",
28
- "lib/pyramid_scheme/index_client.rb",
29
- "lib/pyramid_scheme/index_lock_file.rb",
30
- "lib/pyramid_scheme/index_provider/file_system.rb",
31
- "lib/pyramid_scheme/index_server.rb",
32
- "lib/pyramid_scheme/indexer/base.rb",
33
- "lib/pyramid_scheme/indexer/thinking_sphinx.rb",
34
- "lib/pyramid_scheme/indexer/ultrasphinx.rb",
35
- "lib/pyramid_scheme/required_configuration_not_found.rb",
36
- "lib/pyramid_scheme/tasks.rb",
37
- "lib/pyramid_scheme/tasks/rake_tasks.rake",
38
- "lib/pyramid_scheme/thinking_sphinx_indexer.rb",
39
- "lib/pyramid_scheme/ultrasphinx_indexer.rb",
40
- "pyramid_scheme.gemspec",
41
- "spec/pyramid_scheme.rb",
42
- "spec/pyramid_scheme/index_client_spec.rb",
43
- "spec/pyramid_scheme/index_provider/file_system_spec.rb",
44
- "spec/pyramid_scheme/index_provider_configuration_spec.rb",
45
- "spec/pyramid_scheme/index_server_spec.rb",
46
- "spec/pyramid_scheme/indexer/thinking_sphinx_spec.rb",
47
- "spec/pyramid_scheme/indexer/ultrasphinx_spec.rb",
48
- "spec/spec.opts",
49
- "spec/spec_helper.rb",
50
- "tasks/pyramid_scheme.rake"
51
- ]
52
- s.homepage = %q{http://github.com/dpickett/pyramid_scheme}
53
- s.rdoc_options = ["--charset=UTF-8"]
54
- s.require_paths = ["lib"]
55
- s.rubygems_version = %q{1.3.5}
56
- s.summary = %q{Sphinx index propagation}
57
- s.test_files = [
58
- "spec/pyramid_scheme/index_client_spec.rb",
59
- "spec/pyramid_scheme/index_provider/file_system_spec.rb",
60
- "spec/pyramid_scheme/index_provider_configuration_spec.rb",
61
- "spec/pyramid_scheme/index_server_spec.rb",
62
- "spec/pyramid_scheme/indexer/thinking_sphinx_spec.rb",
63
- "spec/pyramid_scheme/indexer/ultrasphinx_spec.rb",
64
- "spec/pyramid_scheme.rb",
65
- "spec/spec_helper.rb"
66
- ]
67
-
68
- if s.respond_to? :specification_version then
69
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
70
- s.specification_version = 3
71
-
72
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
73
- s.add_runtime_dependency(%q<rake>, [">= 0.8.7"])
74
- s.add_runtime_dependency(%q<configatron>, [">= 0"])
75
- s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
76
- s.add_development_dependency(%q<yard>, [">= 0"])
77
- s.add_development_dependency(%q<mocha>, ["= 0.9.8"])
78
- s.add_development_dependency(%q<fakefs>, ["= 0.2.1"])
79
- else
80
- s.add_dependency(%q<rake>, [">= 0.8.7"])
81
- s.add_dependency(%q<configatron>, [">= 0"])
82
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
83
- s.add_dependency(%q<yard>, [">= 0"])
84
- s.add_dependency(%q<mocha>, ["= 0.9.8"])
85
- s.add_dependency(%q<fakefs>, ["= 0.2.1"])
86
- end
87
- else
88
- s.add_dependency(%q<rake>, [">= 0.8.7"])
89
- s.add_dependency(%q<configatron>, [">= 0"])
90
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
91
- s.add_dependency(%q<yard>, [">= 0"])
92
- s.add_dependency(%q<mocha>, ["= 0.9.8"])
93
- s.add_dependency(%q<fakefs>, ["= 0.2.1"])
94
- end
95
- end
96
-