virginia 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +1 -0
- data/CHANGELOG.md +11 -0
- data/Guardfile +1 -1
- data/README.md +3 -4
- data/lib/virginia.rb +6 -7
- data/lib/virginia/document_cache.rb +75 -37
- data/lib/virginia/document_cache/document.rb +15 -0
- data/lib/virginia/plugin.rb +6 -0
- data/lib/virginia/version.rb +1 -1
- data/spec/spec_helper.rb +6 -1
- data/spec/virginia/document_cache/document_spec.rb +29 -0
- data/spec/virginia/document_cache_spec.rb +144 -0
- data/spec/virginia/service_spec.rb +1 -1
- data/virginia.gemspec +2 -1
- metadata +25 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ecea8b6d003b01938bc430ec0dff8dd07d43f84e
|
4
|
+
data.tar.gz: ffa4a6fe704ae8de52f36aad3a01f168ebaacb22
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e76fcf59abbe5d17776ada161021491489ad9c81667f1f5baba592463a8873eb023c69fbc0927316fb46ed051ea07ccb15dc04977c0dd8e1833504259b1b648e
|
7
|
+
data.tar.gz: 7f793657d6ee01f31246fff65fdaf4a79cdf2a3bec287df951df0a10f7b3528dc227a9db252a600a098374cfa4b5cde4d469b8b190a01c3da9329c7762712224
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--format documentation
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
# develop
|
2
|
+
|
3
|
+
# Version 0.4.0
|
4
|
+
* BREAKING CHANGES! See the updated example in the README and the changes described below:
|
5
|
+
* Support for storing document content-types associated with each cached document. You must now specify the content type (or use the default of text/plain) when caching a document. This way Virginia knows how to serve it when it is requested.
|
6
|
+
* Wrap cached documents and store them as Virginia::DocumentCache::Document. The wrapped document is what will be returned from the cache.
|
7
|
+
* DocumentCache#fetch no longer accepts a `lifetime` argument. Instead, return an array of arguments suitable for passing to `#store` from the block, or return a complete DocumentCache::Document
|
8
|
+
* Switch DocumentCache to an Actor for better performance
|
9
|
+
* Load & start DocumentCache's actor by default
|
10
|
+
* Allow registering a document ID with a callback to populate it on demand
|
11
|
+
|
1
12
|
# Version 0.4.0
|
2
13
|
* Add document cache
|
3
14
|
|
data/Guardfile
CHANGED
data/README.md
CHANGED
@@ -57,16 +57,15 @@ Assuming you are using Sinatra like in the above examples, put this in your `lib
|
|
57
57
|
|
58
58
|
```Ruby
|
59
59
|
require 'sinatra'
|
60
|
-
require 'virginia/document_cache'
|
61
60
|
|
62
61
|
get '/documents/:id' do
|
63
62
|
begin
|
64
|
-
|
63
|
+
document = Virginia::DocumentCache.fetch params[:id]
|
64
|
+
headers['Content-Type'] = document.content_type
|
65
|
+
document.body
|
65
66
|
rescue Virginia::DocumentCache::NotFound
|
66
67
|
raise Sinatra::NotFound
|
67
68
|
end
|
68
|
-
|
69
|
-
grammar.to_s
|
70
69
|
end
|
71
70
|
```
|
72
71
|
|
data/lib/virginia.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
require "adhearsion"
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
%w(
|
3
|
+
version
|
4
|
+
plugin
|
5
|
+
service
|
6
|
+
document_cache
|
7
|
+
).each { |file| require "virginia/#{file}" }
|
5
8
|
|
6
9
|
module Virginia
|
7
|
-
extend ActiveSupport::Autoload
|
8
|
-
autoload :Plugin
|
9
|
-
autoload :Service
|
10
|
-
autoload :LoggingHandler
|
11
10
|
end
|
@@ -1,29 +1,31 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'singleton'
|
3
|
+
require 'virginia/document_cache/document'
|
3
4
|
|
4
5
|
module Virginia
|
5
6
|
class DocumentCache
|
6
|
-
include
|
7
|
+
include Celluloid
|
7
8
|
|
8
9
|
NotFound = Class.new StandardError
|
9
10
|
|
10
|
-
|
11
|
+
DEFAULT_CONTENT_TYPE = 'text/plain'
|
12
|
+
DEFAULT_LIFETIME = 10
|
13
|
+
|
14
|
+
execute_block_on_receiver :register, :send
|
11
15
|
|
12
16
|
class << self
|
13
17
|
def method_missing(m, *args, &block)
|
14
|
-
|
15
|
-
instance.send m, *args, &block
|
16
|
-
end
|
18
|
+
Celluloid::Actor[:virginia_document_cache].send m, *args, &block
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
20
22
|
def initialize
|
21
|
-
@mutex = Mutex.new
|
22
23
|
@documents = {}
|
24
|
+
@document_creators = {}
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
-
|
26
|
+
every(60) do
|
27
|
+
logger.debug "Reaping expired cached document"
|
28
|
+
reap_expired!
|
27
29
|
end
|
28
30
|
end
|
29
31
|
|
@@ -31,56 +33,82 @@ module Virginia
|
|
31
33
|
# @param [Object] document The document to be stored in the cache
|
32
34
|
# @param [Fixnum, Nil] lifetime The amount of time in seconds the document should be kept. If nil, document will be kept indefinitely.
|
33
35
|
# @param [String, Nil] id The ID to use to store the document. If nil, one will be generated.
|
34
|
-
# @return [String] ID of the stored document
|
35
|
-
def store(document, lifetime =
|
36
|
+
# @return [String] Cache ID of the stored document
|
37
|
+
def store(document, content_type = DEFAULT_CONTENT_TYPE, lifetime = DEFAULT_LIFETIME, id = nil)
|
38
|
+
return if document.nil? || document.to_s.empty?
|
39
|
+
|
36
40
|
id ||= generate_id
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
41
|
+
doc = Virginia::DocumentCache::Document.new id, document, content_type, lifetime
|
42
|
+
store_document doc
|
43
|
+
end
|
44
|
+
|
45
|
+
# Registers a new Virginia::DocumentCache::Document with the cache
|
46
|
+
# @param [Virginia::DocumentCache::Document] document The document to be stored in the cache
|
47
|
+
# @return [String] Cache ID of the stored document
|
48
|
+
def store_document(document)
|
49
|
+
@documents[document.id] = document
|
50
|
+
document.id
|
42
51
|
end
|
43
52
|
|
44
53
|
# Deletes a document from the cache
|
45
54
|
# @param [Object] id ID of the document to be removed from the cache
|
46
55
|
# @return [Object, Nil] document Returns the document if found in the cache, nil otherwise
|
47
56
|
def delete(id)
|
48
|
-
|
49
|
-
data[:document]
|
57
|
+
@documents.delete id
|
50
58
|
end
|
51
59
|
|
52
60
|
# Retrieves a document from the cache
|
53
61
|
# @param [String] id ID of the document to be retrieved from the cache
|
54
|
-
# @param [Fixnum, Nil] lifetime The amount of time in seconds the document should be kept. If nil, document will be kept indefinitely.
|
55
62
|
# @yield If given, will be used to generate the document, store it, and then return.
|
56
|
-
# @return [
|
57
|
-
# @raises [NotFound] If the document is not found in the cache
|
58
|
-
def fetch(id
|
63
|
+
# @return [Virginia::DocumentCache::Document] Returns the document if found in the cache
|
64
|
+
# @raises [Virginia::DocumentCache::NotFound] If the document is not found in the cache
|
65
|
+
def fetch(id)
|
66
|
+
# Check for a registered creator first
|
67
|
+
check_and_run_creator id unless @documents.has_key? id
|
68
|
+
|
69
|
+
# If we still don't have a document, check for a supplied block
|
59
70
|
unless @documents.has_key? id
|
71
|
+
|
60
72
|
if block_given?
|
61
|
-
|
73
|
+
result = yield
|
74
|
+
if result.is_a? Document
|
75
|
+
store_document result
|
76
|
+
else
|
77
|
+
args = *yield
|
78
|
+
doc = Virginia::DocumentCache::Document.new id, args[0], args[1] || DEFAULT_CONTENT_TYPE, args[2] || DEFAULT_LIFETIME
|
79
|
+
store_document doc
|
80
|
+
end
|
62
81
|
else
|
63
|
-
|
82
|
+
abort NotFound.new
|
64
83
|
end
|
65
84
|
end
|
66
|
-
|
67
|
-
@documents[id]
|
85
|
+
|
86
|
+
@documents[id]
|
68
87
|
end
|
69
88
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
89
|
+
# Registers a creation callback to populate a given document when requested
|
90
|
+
# @param [String] id ID of the document for which the creator should be registered
|
91
|
+
# @param [String] content_type Content-Type of the document
|
92
|
+
# @param [Fixnum, Nil] lifetime The amount of time in seconds the document should be kept. If nil, document will be kept indefinitely.
|
93
|
+
# @return [Nil, Object] nil if the ID was not found among the creators; otherwise the creator is returned
|
94
|
+
def register(id, content_type, lifetime = DEFAULT_LIFETIME, &callback)
|
95
|
+
@document_creators[id] = {
|
96
|
+
content_type: content_type,
|
97
|
+
lifetime: lifetime,
|
98
|
+
callback: callback,
|
99
|
+
}
|
74
100
|
end
|
75
101
|
|
76
|
-
|
77
|
-
|
102
|
+
# Removes a document creator registration by ID
|
103
|
+
# @param [String] id ID of the document for which the creator should be deleted
|
104
|
+
# @return [Nil, Object] nil if the ID was not found among the creators; otherwise the creator is returned
|
105
|
+
def unregister(id)
|
106
|
+
@document_creators.delete id
|
107
|
+
end
|
78
108
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
DocumentCache.reap_expired!
|
83
|
-
end
|
109
|
+
def reap_expired!
|
110
|
+
@documents.each_pair do |id, doc|
|
111
|
+
@documents.delete(id) if doc.expires_at && doc.expires_at < Time.now
|
84
112
|
end
|
85
113
|
end
|
86
114
|
|
@@ -89,5 +117,15 @@ module Virginia
|
|
89
117
|
def generate_id
|
90
118
|
SecureRandom.hex(16)
|
91
119
|
end
|
120
|
+
|
121
|
+
def check_and_run_creator(id)
|
122
|
+
if creator = @document_creators[id]
|
123
|
+
begin
|
124
|
+
store_document Document.new id, creator[:callback].call, creator[:content_type], creator[:lifetime]
|
125
|
+
rescue => e
|
126
|
+
abort e
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
92
130
|
end
|
93
131
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Virginia
|
4
|
+
class DocumentCache
|
5
|
+
class Document < Struct.new(:id, :body, :content_type, :lifetime, :created_at, :expires_at)
|
6
|
+
def initialize(id, body, content_type = 'text/plain', lifetime = nil)
|
7
|
+
self.id, self.body, self.content_type, self.lifetime = id, body, content_type, lifetime
|
8
|
+
self.created_at = Time.now
|
9
|
+
if self.lifetime
|
10
|
+
self.expires_at = self.created_at + self.lifetime
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/virginia/plugin.rb
CHANGED
@@ -6,6 +6,12 @@ module Virginia
|
|
6
6
|
run :virginia do
|
7
7
|
logger.info "Virginia has been loaded"
|
8
8
|
Service.start
|
9
|
+
|
10
|
+
# Document Cache
|
11
|
+
supervisor = Virginia::DocumentCache.supervise_as(:virginia_document_cache)
|
12
|
+
Adhearsion::Events.register_callback :shutdown do
|
13
|
+
supervisor.terminate
|
14
|
+
end
|
9
15
|
end
|
10
16
|
|
11
17
|
config :virginia do
|
data/lib/virginia/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,13 +1,18 @@
|
|
1
1
|
require 'adhearsion'
|
2
2
|
require 'virginia'
|
3
|
+
require 'timecop'
|
3
4
|
|
4
5
|
ENV['AHN_ENV'] = 'test'
|
5
6
|
|
6
7
|
RSpec.configure do |config|
|
7
|
-
config.
|
8
|
+
config.color = true
|
8
9
|
config.tty = true
|
9
10
|
|
10
11
|
config.filter_run :focus => true
|
11
12
|
config.run_all_when_everything_filtered = true
|
13
|
+
|
14
|
+
config.after :each do
|
15
|
+
Timecop.return
|
16
|
+
end
|
12
17
|
end
|
13
18
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Virginia::DocumentCache::Document do
|
5
|
+
let(:subject) { Virginia::DocumentCache::Document }
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
Timecop.freeze
|
9
|
+
@document = subject.new 'fake_id', 'fake_content'
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should accurately represent my content' do
|
13
|
+
expect(@document.body).to eq 'fake_content'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should automatically set the created_at time' do
|
17
|
+
expect(@document.created_at).to eq Time.now
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should default to an empty expiration time' do
|
21
|
+
expect(@document.expires_at).to be_nil
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should automatically determine the expiration time' do
|
25
|
+
# TODO: Use Timecop to make this test more precise
|
26
|
+
doc = subject.new '1', 'foo', 'text/plain', 30
|
27
|
+
expect(doc.expires_at).to eq Time.now + 30
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,144 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'virginia/document_cache'
|
4
|
+
|
5
|
+
describe Virginia::DocumentCache do
|
6
|
+
let(:subject) { Virginia::DocumentCache.new }
|
7
|
+
|
8
|
+
it 'should store the document and return the ID' do
|
9
|
+
expect(subject.store('foo')).to be_a String
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should not store a nil document' do
|
13
|
+
expect(subject.store(nil)).to be_nil
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should not store an empty string document' do
|
17
|
+
expect(subject.store("")).to be_nil
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should allow me to retrieve the document by ID' do
|
21
|
+
doc = 'foobar'
|
22
|
+
id = subject.store doc
|
23
|
+
expect(subject.fetch(id).body).to eq doc
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should allow me to store and retrieve a document with a specified ID' do
|
27
|
+
subject.store 'foobar', 'text/plain', nil, 'abc123'
|
28
|
+
expect(subject.fetch('abc123').body).to eq 'foobar'
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should store the document content type' do
|
32
|
+
id = subject.store '{foo: "bar"}', 'application/json'
|
33
|
+
expect(subject.fetch(id).content_type).to eq 'application/json'
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should allow me to specify a lifetime' do
|
37
|
+
Timecop.freeze
|
38
|
+
id = subject.store 'foobar', 'text/plain', 30
|
39
|
+
doc = subject.fetch id
|
40
|
+
expect(doc.expires_at).to eq Time.now + 30
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should allow documents that do not expire' do
|
44
|
+
Timecop.freeze
|
45
|
+
id = subject.store 'foobar', 'text/plain', nil
|
46
|
+
doc = subject.fetch id
|
47
|
+
expect(doc.expires_at).to be nil
|
48
|
+
Timecop.travel Time.now + (20 * 365 * 24 * 60 * 60) # 20 years
|
49
|
+
subject.reap_expired!
|
50
|
+
doc = subject.fetch id
|
51
|
+
expect(doc.body).to eq 'foobar'
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should remove (only) expired documents from the cache' do
|
55
|
+
Timecop.freeze
|
56
|
+
id1 = subject.store 'foobar', 'text/plain', 30
|
57
|
+
id2 = subject.store 'bazqux', 'text/plain', 90
|
58
|
+
Timecop.travel Time.now + 60
|
59
|
+
subject.reap_expired!
|
60
|
+
|
61
|
+
expect { subject.fetch(id1) }.to raise_error Virginia::DocumentCache::NotFound
|
62
|
+
expect(subject.fetch(id2).body).to eq 'bazqux'
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'auto-creation on #fetch' do
|
66
|
+
let(:doc_id) { 'boo' }
|
67
|
+
let(:body) { 'abcd' }
|
68
|
+
let(:ctype) { 'text/plain' }
|
69
|
+
let(:lifetime) { 93 }
|
70
|
+
|
71
|
+
before :each do
|
72
|
+
Timecop.freeze
|
73
|
+
expect { subject.fetch(doc_id) }.to raise_error Virginia::DocumentCache::NotFound
|
74
|
+
end
|
75
|
+
|
76
|
+
after :each do
|
77
|
+
doc = subject.fetch doc_id
|
78
|
+
expect(doc.body).to eq body
|
79
|
+
expect(doc.content_type).to eq ctype
|
80
|
+
expect(doc.expires_at).to eq Time.now + lifetime
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should allow me to supply a block to #store and create a document if one is not already cached' do
|
84
|
+
subject.fetch(doc_id) do
|
85
|
+
[body, 'text/plain', lifetime]
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should allow me to supply a block to #store that returns a document and cache it, if one is not already cached' do
|
90
|
+
subject.fetch(doc_id) do
|
91
|
+
Virginia::DocumentCache::Document.new doc_id, body, ctype, lifetime
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'registering document content at an id' do
|
97
|
+
let(:doc_id) { 'abcd1234' }
|
98
|
+
let(:body) { 'once upon a time there was a muppet' }
|
99
|
+
let(:ctype) { 'application/x-powa' }
|
100
|
+
let(:lifetime) { 193 }
|
101
|
+
|
102
|
+
before :each do
|
103
|
+
expect { subject.fetch(doc_id) }.to raise_error Virginia::DocumentCache::NotFound
|
104
|
+
Timecop.freeze
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'auto-creating documents' do
|
108
|
+
after :each do
|
109
|
+
doc = subject.fetch doc_id
|
110
|
+
expect(doc.body).to eq body
|
111
|
+
expect(doc.content_type).to eq ctype
|
112
|
+
expect(doc.expires_at).to eq Time.now + lifetime
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'should auto-populate the document if not found in the cache' do
|
116
|
+
subject.register(doc_id, ctype, lifetime) do
|
117
|
+
body
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'should not invoke the block if the document is already in the cache' do
|
122
|
+
subject.store body, ctype, lifetime, doc_id
|
123
|
+
subject.register(doc_id, ctype, lifetime) do
|
124
|
+
raise "Should not get here!"
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'should allow removing a document creator' do
|
130
|
+
Timecop.freeze
|
131
|
+
subject.register(doc_id, ctype, lifetime) do
|
132
|
+
body
|
133
|
+
end
|
134
|
+
doc = subject.fetch(doc_id)
|
135
|
+
|
136
|
+
# Move past expiration and clean up the cached document
|
137
|
+
Timecop.travel Time.now + (lifetime + 1)
|
138
|
+
subject.reap_expired!
|
139
|
+
|
140
|
+
subject.unregister(doc_id)
|
141
|
+
expect { subject.fetch(doc_id) }.to raise_error Virginia::DocumentCache::NotFound
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
@@ -18,7 +18,7 @@ describe Virginia::Service do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
it "should instantiate the handler" do
|
21
|
-
rack_logger =
|
21
|
+
rack_logger = double 'Rack::CommonLogger'
|
22
22
|
::Rack::CommonLogger.should_receive(:new).once.with(TestApp, Adhearsion.logger).and_return rack_logger
|
23
23
|
::Reel::Rack::Server.should_receive(:supervise_as).once.with(:reel_rack_server, rack_logger, options)
|
24
24
|
Virginia::Service.start
|
data/virginia.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
18
|
s.require_paths = ["lib"]
|
19
19
|
|
20
|
-
s.add_runtime_dependency %q<adhearsion>, ["~> 2.
|
20
|
+
s.add_runtime_dependency %q<adhearsion>, ["~> 2.6"]
|
21
21
|
s.add_runtime_dependency %q<activesupport>, [">= 3.0"]
|
22
22
|
s.add_runtime_dependency %q<reel>, ["~> 0.5.0"]
|
23
23
|
s.add_runtime_dependency %q<reel-rack>
|
@@ -25,5 +25,6 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.add_development_dependency %q<bundler>, ["~> 1.0"]
|
26
26
|
s.add_development_dependency %q<rspec>, ["~> 2.5"]
|
27
27
|
s.add_development_dependency %q<rake>, [">= 0"]
|
28
|
+
s.add_development_dependency %q<timecop>
|
28
29
|
s.add_development_dependency %q<guard-rspec>
|
29
30
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: virginia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Pradovera
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: adhearsion
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '2.
|
19
|
+
version: '2.6'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '2.
|
26
|
+
version: '2.6'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: timecop
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: guard-rspec
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -131,6 +145,7 @@ extensions: []
|
|
131
145
|
extra_rdoc_files: []
|
132
146
|
files:
|
133
147
|
- ".gitignore"
|
148
|
+
- ".rspec"
|
134
149
|
- ".travis.yml"
|
135
150
|
- CHANGELOG.md
|
136
151
|
- Gemfile
|
@@ -140,11 +155,14 @@ files:
|
|
140
155
|
- Rakefile
|
141
156
|
- lib/virginia.rb
|
142
157
|
- lib/virginia/document_cache.rb
|
158
|
+
- lib/virginia/document_cache/document.rb
|
143
159
|
- lib/virginia/plugin.rb
|
144
160
|
- lib/virginia/service.rb
|
145
161
|
- lib/virginia/version.rb
|
146
162
|
- spec/fixtures/config.ru
|
147
163
|
- spec/spec_helper.rb
|
164
|
+
- spec/virginia/document_cache/document_spec.rb
|
165
|
+
- spec/virginia/document_cache_spec.rb
|
148
166
|
- spec/virginia/service_spec.rb
|
149
167
|
- tmp/dsl.rb
|
150
168
|
- tmp/example.rb
|
@@ -168,11 +186,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
168
186
|
version: '0'
|
169
187
|
requirements: []
|
170
188
|
rubyforge_project: virginia
|
171
|
-
rubygems_version: 2.4.
|
189
|
+
rubygems_version: 2.4.5
|
172
190
|
signing_key:
|
173
191
|
specification_version: 4
|
174
192
|
summary: A Reel interface to Adhearsion
|
175
193
|
test_files:
|
176
194
|
- spec/fixtures/config.ru
|
177
195
|
- spec/spec_helper.rb
|
196
|
+
- spec/virginia/document_cache/document_spec.rb
|
197
|
+
- spec/virginia/document_cache_spec.rb
|
178
198
|
- spec/virginia/service_spec.rb
|