stale_fish 1.2.4 → 1.3.0.pre
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 +14 -0
- data/README.rdoc +6 -0
- data/Rakefile +8 -7
- data/VERSION +1 -1
- data/lib/stale_fish/fixture.rb +68 -0
- data/lib/stale_fish.rb +70 -39
- data/spec/fixtures/stale_fish_fakeweb.yml +2 -2
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +13 -3
- data/{tmp/.gitignore → spec/support/stale_fish.yml} +0 -0
- data/spec/support/test.yml +14 -0
- data/spec/unit/fixture_spec.rb +123 -0
- data/spec/unit/stale_fish_spec.rb +124 -0
- data/stale_fish.gemspec +23 -27
- metadata +15 -34
- data/lib/stale_fish/fakeweb.rb +0 -26
- data/lib/stale_fish/fixture_definition.rb +0 -34
- data/lib/stale_fish/utility.rb +0 -67
- data/spec/deprecation_spec.rb +0 -20
- data/spec/stale_fish_spec.rb +0 -104
data/Gemfile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
source :gemcutter
|
2
|
+
|
3
|
+
group :runtime do
|
4
|
+
gem 'fakeweb'
|
5
|
+
gem 'activesupport', :require => "active_support/core_ext/numeric/time"
|
6
|
+
end
|
7
|
+
|
8
|
+
group :test do
|
9
|
+
gem 'rspec', :require => 'spec'
|
10
|
+
gem 'rake'
|
11
|
+
gem 'bundler', '~> 0.9.5'
|
12
|
+
gem 'jeweler'
|
13
|
+
end
|
14
|
+
|
data/README.rdoc
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
|
3
3
|
This gem provides a method for keeping your fixtures in sync with their sources. This will prevent the scenario where your build is broken in production, but CI has a green build to do outdated fixture data. StaleFish also allows for FakeWeb integration and URI management.
|
4
4
|
|
5
|
+
== NOTICE
|
6
|
+
|
7
|
+
1.3.x is a complete rewrite of the StaleFish utility. The API is based on: http://gist.github.com/308260
|
8
|
+
|
9
|
+
The information below has not been corrected or updated.
|
10
|
+
|
5
11
|
== Features
|
6
12
|
|
7
13
|
* Fixture update frequency uses the ActiveSupport relative time DSL
|
data/Rakefile
CHANGED
@@ -1,21 +1,22 @@
|
|
1
|
-
require 'rubygems'
|
2
1
|
require 'rake'
|
2
|
+
require 'bundler'
|
3
3
|
|
4
4
|
begin
|
5
5
|
require 'jeweler'
|
6
6
|
Jeweler::Tasks.new do |gem|
|
7
7
|
gem.name = "stale_fish"
|
8
|
-
gem.summary =
|
8
|
+
gem.summary = "keeps fixtures synchronized with sources to prevent outdated fixtures going undetected."
|
9
9
|
gem.email = "justin.smestad@gmail.com"
|
10
10
|
gem.homepage = "http://github.com/jsmestad/stale_fish"
|
11
11
|
gem.authors = ["Justin Smestad"]
|
12
12
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
bundle = Bundler::Definition.from_gemfile('Gemfile')
|
14
|
+
bundle.dependencies.each do |dep|
|
15
|
+
next unless dep.groups.include?(:runtime)
|
16
|
+
gem.add_dependency(dep.name, dep.version_requirements.to_s)
|
17
|
+
end
|
17
18
|
end
|
18
|
-
|
19
|
+
Jeweler::GemcutterTasks.new
|
19
20
|
rescue LoadError
|
20
21
|
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
21
22
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.3.0.pre
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module StaleFish
|
2
|
+
class Fixture
|
3
|
+
attr_accessor :name, :file, :last_updated_at
|
4
|
+
attr_accessor :update_interval, :update_string, :check_against, :request_type
|
5
|
+
|
6
|
+
def initialize(attributes={})
|
7
|
+
attributes.each do |key, value|
|
8
|
+
self.send("#{key}=", value)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def is_stale?
|
13
|
+
if (last_updated_at + update_interval) < Time.now
|
14
|
+
return true
|
15
|
+
else
|
16
|
+
return false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def update!
|
21
|
+
uri, type = URI.parse(check_against), request_type.downcase.to_sym
|
22
|
+
Net::HTTP.start(uri.host) { |http|
|
23
|
+
response = if type == :post
|
24
|
+
http.post(uri.path, uri.query)
|
25
|
+
else
|
26
|
+
http.get(uri.path)
|
27
|
+
end
|
28
|
+
write_response_to_file(response.body)
|
29
|
+
}
|
30
|
+
|
31
|
+
self.last_updated_at = Time.now
|
32
|
+
end
|
33
|
+
|
34
|
+
def register_lock!
|
35
|
+
uri, type = build_uri, request_type.downcase.to_sym
|
36
|
+
FakeWeb.register_uri(type, uri, :body => file)
|
37
|
+
|
38
|
+
return FakeWeb.registered_uri?(type, uri)
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_yaml
|
42
|
+
# update_interval.inspect trick is to prevent Fixnum being written
|
43
|
+
yaml = <<-EOF
|
44
|
+
#{name}:
|
45
|
+
file: '#{file}'
|
46
|
+
update_interval: #{update_interval.inspect.gsub(/ /, '.')}
|
47
|
+
check_against: #{check_against}
|
48
|
+
request_type: #{request_type}
|
49
|
+
last_updated_at: #{last_updated_at}
|
50
|
+
EOF
|
51
|
+
return yaml
|
52
|
+
end
|
53
|
+
|
54
|
+
protected
|
55
|
+
|
56
|
+
def build_uri
|
57
|
+
if check_against =~ /:\d+/
|
58
|
+
Regexp.new(check_against, true)
|
59
|
+
else
|
60
|
+
check_against
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def write_response_to_file(body)
|
65
|
+
File.open(file, "w") { |file| file.write(body) }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/lib/stale_fish.rb
CHANGED
@@ -1,54 +1,85 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
#Rails 3: require 'active_support/core_ext/numeric/time'
|
2
|
+
require 'active_support'
|
3
|
+
require 'fakeweb'
|
3
4
|
require 'yaml'
|
4
|
-
require 'rubygems'
|
5
|
-
require 'activesupport' # only used for time helpers
|
6
|
-
require 'resourceful'
|
7
5
|
|
8
|
-
require 'stale_fish
|
9
|
-
require 'stale_fish/fixture_definition'
|
10
|
-
|
11
|
-
begin
|
12
|
-
require 'fakeweb'
|
13
|
-
require 'stale_fish/fakeweb'
|
14
|
-
rescue LoadError; end
|
6
|
+
require File.join(File.dirname(__FILE__), 'stale_fish', 'fixture')
|
15
7
|
|
16
8
|
module StaleFish
|
17
9
|
# no one likes stale fish.
|
18
|
-
|
19
|
-
class FixtureUpdateFailure < StandardError; end
|
20
|
-
class MalformedSourceURL < StandardError; end
|
21
|
-
|
22
10
|
class << self
|
23
|
-
attr_accessor :configuration
|
24
|
-
attr_accessor :http
|
25
|
-
attr_accessor :fixtures
|
26
|
-
attr_accessor :force_flag
|
27
|
-
end
|
28
11
|
|
29
|
-
|
30
|
-
|
31
|
-
|
12
|
+
def configuration=(config)
|
13
|
+
@configuration = config
|
14
|
+
end
|
32
15
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
16
|
+
def configuration
|
17
|
+
@configuration || if defined?(Rails)
|
18
|
+
File.join(Rails.root, 'spec', 'stale_fish.yml')
|
19
|
+
else
|
20
|
+
'stale_fish.yml'
|
21
|
+
end
|
22
|
+
end
|
37
23
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
24
|
+
def update_stale(options={})
|
25
|
+
allow_requests
|
26
|
+
fixtures(options).each do |fixture|
|
27
|
+
if fixture.is_stale?
|
28
|
+
fixture.update!
|
29
|
+
end
|
30
|
+
end
|
31
|
+
block_requests
|
32
|
+
write
|
33
|
+
end
|
43
34
|
|
44
|
-
|
45
|
-
|
35
|
+
def update_stale!(options={})
|
36
|
+
allow_requests
|
37
|
+
fixtures(options).each do |fixture|
|
38
|
+
fixture.update!
|
39
|
+
end
|
40
|
+
block_requests
|
41
|
+
write
|
46
42
|
end
|
47
43
|
|
48
|
-
fixtures
|
44
|
+
def fixtures(params=nil)
|
45
|
+
@fixtures ||= []
|
46
|
+
if params.is_a?(Hash)
|
47
|
+
if params[:only]
|
48
|
+
@fixtures.select { |f| params[:only].include?(f.name.to_sym) }
|
49
|
+
elsif params[:except]
|
50
|
+
@fixtures.select { |f| !params[:except].include?(f.name.to_sym) }
|
51
|
+
end
|
52
|
+
else
|
53
|
+
@fixtures
|
54
|
+
end
|
55
|
+
end
|
49
56
|
|
50
|
-
|
51
|
-
|
52
|
-
|
57
|
+
protected
|
58
|
+
|
59
|
+
def load
|
60
|
+
@fixtures = []
|
61
|
+
definitions = YAML::load(File.open(configuration))['stale'].symbolize_keys!
|
62
|
+
definitions.each do |key, definition|
|
63
|
+
self.fixtures << StaleFish::Fixture.new(definition.merge({:name => key.to_s}))
|
64
|
+
end
|
65
|
+
return fixtures
|
66
|
+
end
|
53
67
|
|
68
|
+
def write
|
69
|
+
updated_yaml = []
|
70
|
+
fixtures.each do |fixture|
|
71
|
+
updated_yaml << fixture.to_yaml
|
72
|
+
end
|
73
|
+
updated_yaml = { :stale => updated_yaml }
|
74
|
+
File.open(configuration, 'w') { |file| updated_yaml.to_yaml }
|
75
|
+
end
|
76
|
+
|
77
|
+
def allow_requests
|
78
|
+
FakeWeb.allow_net_connect = true
|
79
|
+
end
|
80
|
+
|
81
|
+
def block_requests
|
82
|
+
FakeWeb.allow_net_connect = false
|
83
|
+
end
|
84
|
+
end
|
54
85
|
end
|
@@ -5,9 +5,9 @@ stale:
|
|
5
5
|
file_path: ./tmp/yahoo.html
|
6
6
|
source_url: http://www.yahoo.com/
|
7
7
|
update_frequency: 1.day
|
8
|
-
last_updated_at: 2009-
|
8
|
+
last_updated_at: 2009-11-30T18:26:20-07:00
|
9
9
|
google:
|
10
10
|
file_path: ./tmp/google.html
|
11
11
|
source_url: http://www.google.com/
|
12
12
|
update_frequency: 2.weeks
|
13
|
-
last_updated_at: 2009-
|
13
|
+
last_updated_at: 2009-11-30T18:26:20-07:00
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,19 @@
|
|
1
|
-
require
|
2
|
-
|
1
|
+
Bundler.require(:default, :runtime, :test)
|
3
2
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
4
3
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
4
|
+
|
5
5
|
require 'stale_fish'
|
6
|
+
require 'spec'
|
7
|
+
require 'spec/autorun'
|
8
|
+
|
9
|
+
# Requires supporting files with custom matchers and macros, etc,
|
10
|
+
# in ./support/ and its subdirectories.
|
11
|
+
Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require f}
|
6
12
|
|
7
13
|
Spec::Runner.configure do |config|
|
8
|
-
|
14
|
+
|
15
|
+
config.before :all do
|
16
|
+
StaleFish.configuration = nil
|
17
|
+
end
|
18
|
+
|
9
19
|
end
|
File without changes
|
@@ -0,0 +1,14 @@
|
|
1
|
+
stale:
|
2
|
+
twitter:
|
3
|
+
file: 'timeline.json'
|
4
|
+
update_interval: 30.days
|
5
|
+
check_against: http://twitter.com/api/timeline
|
6
|
+
request_type: POST
|
7
|
+
last_updated_at:
|
8
|
+
gh_commits:
|
9
|
+
file: 'commits.xml'
|
10
|
+
update_interval: 3.days
|
11
|
+
check_against: http://api.github.com/commits.xml
|
12
|
+
request_type: GET
|
13
|
+
last_updated_at:
|
14
|
+
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), *%w[.. spec_helper])
|
2
|
+
|
3
|
+
describe StaleFish::Fixture do
|
4
|
+
before do
|
5
|
+
@time = Time.now
|
6
|
+
@args = {
|
7
|
+
:name => 'commits',
|
8
|
+
:file => 'commit.json',
|
9
|
+
:last_updated_at => @time,
|
10
|
+
:update_interval => 2.days,
|
11
|
+
:check_against => 'http://google.com',
|
12
|
+
:request_type => 'GET'
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
context "#initialize" do
|
17
|
+
it "set the proper arguements" do
|
18
|
+
fixture = StaleFish::Fixture.new(@args)
|
19
|
+
@args.each do |key, value|
|
20
|
+
fixture.send(key).should == value
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "#is_stale?" do
|
26
|
+
before do
|
27
|
+
@stale_fixture = StaleFish::Fixture.new(:last_updated_at => 1.week.ago,
|
28
|
+
:update_interval => 1.day)
|
29
|
+
@fresh_fixture = StaleFish::Fixture.new(:last_updated_at => 1.day.from_now,
|
30
|
+
:update_interval => 1.day)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should return true when stale" do
|
34
|
+
@stale_fixture.is_stale?.should == true
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should return false when fresh" do
|
38
|
+
@fresh_fixture.is_stale?.should == false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "#update!" do
|
43
|
+
before do
|
44
|
+
@fixture = StaleFish::Fixture.new(:request_type => 'GET',
|
45
|
+
:check_against => 'http://google.com/index.html',
|
46
|
+
:file => 'index.html')
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should update the fixture data" do
|
50
|
+
@fixture.should_receive(:write_response_to_file).once.and_return(true)
|
51
|
+
@fixture.update!
|
52
|
+
@fixture.last_updated_at.should be_a(Time)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should use Net::HTTP#get with a GET request_type"
|
56
|
+
it "should use Net::HTTP#post with a POST request_type"
|
57
|
+
end
|
58
|
+
|
59
|
+
context "#register_lock!" do
|
60
|
+
before do
|
61
|
+
@fixture = StaleFish::Fixture.new(:request_type => 'GET',
|
62
|
+
:check_against => 'http://google.com/index.html',
|
63
|
+
:file => 'index.html')
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should add fakeweb register_uri" do
|
67
|
+
@fixture.register_lock!.should == true
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "#to_yaml" do
|
72
|
+
before do
|
73
|
+
@fixture = StaleFish::Fixture.new(:name => 'google',
|
74
|
+
:update_interval => 1.day,
|
75
|
+
:request_type => 'GET',
|
76
|
+
:check_against => 'http://google.com/index.html',
|
77
|
+
:file => 'index.html',
|
78
|
+
:last_updated_at => @time)
|
79
|
+
@proper_yaml =
|
80
|
+
<<-EOF
|
81
|
+
google:
|
82
|
+
file: 'index.html'
|
83
|
+
update_interval: 1.day
|
84
|
+
check_against: http://google.com/index.html
|
85
|
+
request_type: GET
|
86
|
+
last_updated_at: #{@time}
|
87
|
+
EOF
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should have the proper schema" do
|
91
|
+
@fixture.to_yaml.should == @proper_yaml
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context "#build_uri" do
|
96
|
+
before do
|
97
|
+
@fixture = StaleFish::Fixture.new(@args)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should parse anything with a port as a regular expression" do
|
101
|
+
@fixture.check_against = 'http://www.google.com:443/index.html'
|
102
|
+
@fixture.send(:build_uri).should be_a(Regexp)
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should parse anything without a port as a string" do
|
106
|
+
@fixture.check_against = 'http://www.google.com/index.html'
|
107
|
+
@fixture.send(:build_uri).should be_a(String)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "#write_response_to_file" do
|
112
|
+
before do
|
113
|
+
@fixture = StaleFish::Fixture.new(@args)
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should update the passed in file" do
|
117
|
+
File.should_receive(:open).and_return(true)
|
118
|
+
@fixture.send(:write_response_to_file, 'this is a response')
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should have failover with a bad response"
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), *%w[.. spec_helper])
|
2
|
+
|
3
|
+
describe StaleFish do
|
4
|
+
before do
|
5
|
+
@stale_fixture = StaleFish::Fixture.new(:last_updated_at => 1.week.ago,
|
6
|
+
:update_interval => 1.day)
|
7
|
+
@fresh_fixture = StaleFish::Fixture.new(:last_updated_at => 1.day.from_now,
|
8
|
+
:update_interval => 1.day)
|
9
|
+
end
|
10
|
+
|
11
|
+
context ".configuration" do
|
12
|
+
it "should return a default path" do
|
13
|
+
StaleFish.configuration.should == 'stale_fish.yml'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context ".configuration=" do
|
18
|
+
it "should assign the path to the config file" do
|
19
|
+
StaleFish.configuration = '/someplace/stale_fish.yml'
|
20
|
+
StaleFish.configuration.should == '/someplace/stale_fish.yml'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context ".load" do
|
25
|
+
before do
|
26
|
+
test_yaml = File.join(File.dirname(__FILE__), '..', 'support', 'test.yml')
|
27
|
+
StaleFish.stub!(:configuration).and_return(test_yaml)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should build fixtures" do
|
31
|
+
StaleFish.send(:load).size.should == 2
|
32
|
+
StaleFish.fixtures.size.should == 2
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
context ".update_stale" do
|
38
|
+
before do
|
39
|
+
StaleFish.stub!(:fixtures).and_return([@stale_fixture,@fresh_fixture])
|
40
|
+
@stale_fixture.stub!(:update!).and_return(true)
|
41
|
+
@fresh_fixture.stub!(:update!).and_return(true)
|
42
|
+
StaleFish.should_receive(:write)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should only call update! on stale fixtures" do
|
46
|
+
@stale_fixture.should_receive(:update!).once
|
47
|
+
@fresh_fixture.should_not_receive(:update!)
|
48
|
+
StaleFish.update_stale
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should block requests after completion" do
|
52
|
+
StaleFish.should_receive(:allow_requests)
|
53
|
+
StaleFish.should_receive(:block_requests)
|
54
|
+
StaleFish.update_stale
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context ".update_stale!" do
|
59
|
+
before do
|
60
|
+
StaleFish.stub!(:fixtures).and_return([@stale_fixture,@fresh_fixture])
|
61
|
+
@stale_fixture.stub!(:update!).and_return(true)
|
62
|
+
@fresh_fixture.stub!(:update!).and_return(true)
|
63
|
+
StaleFish.should_receive(:write)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should only call update! on all fixtures" do
|
67
|
+
@stale_fixture.should_receive(:update!).once
|
68
|
+
@fresh_fixture.should_receive(:update!).once
|
69
|
+
StaleFish.update_stale!
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should block requests after completion" do
|
73
|
+
StaleFish.should_receive(:allow_requests)
|
74
|
+
StaleFish.should_receive(:block_requests)
|
75
|
+
StaleFish.update_stale!
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context ".fixtures" do
|
80
|
+
before do
|
81
|
+
StaleFish.fixtures.size.should == 2
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should accept the :all parameter" do
|
85
|
+
StaleFish.fixtures(:all).size == 2
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should accept the :only parameter with an array of symbols" do
|
89
|
+
response = StaleFish.fixtures(:only => [:twitter])
|
90
|
+
response.size.should == 1
|
91
|
+
response.first.name.should == 'twitter'
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should accept the :except parameter with an array of symbols" do
|
95
|
+
response = StaleFish.fixtures(:except => [:twitter])
|
96
|
+
response.size.should == 1
|
97
|
+
response.first.name.should_not == 'twitter'
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
context ".write" do
|
103
|
+
before do
|
104
|
+
StaleFish.stub!(:fixtures).and_return([@stale_fixture,@fresh_fixture])
|
105
|
+
File.should_receive(:open).and_return(true)
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should overwrite the contents of the YAML file" do
|
109
|
+
StaleFish.send(:write)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
context ".allow_requests" do
|
114
|
+
it "should disable FakeWeb" do
|
115
|
+
StaleFish.send(:allow_requests).should == true
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context ".block_requests" do
|
120
|
+
it "should disable FakeWeb" do
|
121
|
+
StaleFish.send(:block_requests).should == false
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
data/stale_fish.gemspec
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{stale_fish}
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.3.0.pre"
|
9
9
|
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Justin Smestad"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2010-02-22}
|
13
13
|
s.email = %q{justin.smestad@gmail.com}
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"LICENSE",
|
@@ -17,25 +17,26 @@ Gem::Specification.new do |s|
|
|
17
17
|
]
|
18
18
|
s.files = [
|
19
19
|
".gitignore",
|
20
|
+
"Gemfile",
|
20
21
|
"LICENSE",
|
21
22
|
"README.rdoc",
|
22
23
|
"Rakefile",
|
23
24
|
"VERSION",
|
24
25
|
"lib/stale_fish.rb",
|
25
|
-
"lib/stale_fish/
|
26
|
-
"lib/stale_fish/fixture_definition.rb",
|
27
|
-
"lib/stale_fish/utility.rb",
|
28
|
-
"spec/deprecation_spec.rb",
|
26
|
+
"lib/stale_fish/fixture.rb",
|
29
27
|
"spec/fixtures/deprecated_yaml.yml",
|
30
28
|
"spec/fixtures/google.html",
|
31
29
|
"spec/fixtures/malformed_stale_fish.yml",
|
32
30
|
"spec/fixtures/stale_fish.yml",
|
33
31
|
"spec/fixtures/stale_fish_fakeweb.yml",
|
34
32
|
"spec/fixtures/yahoo.html",
|
33
|
+
"spec/spec.opts",
|
35
34
|
"spec/spec_helper.rb",
|
36
|
-
"spec/
|
37
|
-
"
|
38
|
-
"
|
35
|
+
"spec/support/stale_fish.yml",
|
36
|
+
"spec/support/test.yml",
|
37
|
+
"spec/unit/fixture_spec.rb",
|
38
|
+
"spec/unit/stale_fish_spec.rb",
|
39
|
+
"stale_fish.gemspec"
|
39
40
|
]
|
40
41
|
s.homepage = %q{http://github.com/jsmestad/stale_fish}
|
41
42
|
s.rdoc_options = ["--charset=UTF-8"]
|
@@ -43,9 +44,9 @@ Gem::Specification.new do |s|
|
|
43
44
|
s.rubygems_version = %q{1.3.5}
|
44
45
|
s.summary = %q{keeps fixtures synchronized with sources to prevent outdated fixtures going undetected.}
|
45
46
|
s.test_files = [
|
46
|
-
"spec/
|
47
|
-
"spec/
|
48
|
-
"spec/stale_fish_spec.rb"
|
47
|
+
"spec/spec_helper.rb",
|
48
|
+
"spec/unit/fixture_spec.rb",
|
49
|
+
"spec/unit/stale_fish_spec.rb"
|
49
50
|
]
|
50
51
|
|
51
52
|
if s.respond_to? :specification_version then
|
@@ -53,20 +54,15 @@ Gem::Specification.new do |s|
|
|
53
54
|
s.specification_version = 3
|
54
55
|
|
55
56
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
56
|
-
s.add_runtime_dependency(%q<
|
57
|
-
s.add_runtime_dependency(%q<
|
58
|
-
s.add_runtime_dependency(%q<resourceful>, ["~> 0.6.1"])
|
59
|
-
s.add_runtime_dependency(%q<activesupport>, [">= 2.1.2"])
|
57
|
+
s.add_runtime_dependency(%q<fakeweb>, [">= 0"])
|
58
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 0"])
|
60
59
|
else
|
61
|
-
s.add_dependency(%q<
|
62
|
-
s.add_dependency(%q<
|
63
|
-
s.add_dependency(%q<resourceful>, ["~> 0.6.1"])
|
64
|
-
s.add_dependency(%q<activesupport>, [">= 2.1.2"])
|
60
|
+
s.add_dependency(%q<fakeweb>, [">= 0"])
|
61
|
+
s.add_dependency(%q<activesupport>, [">= 0"])
|
65
62
|
end
|
66
63
|
else
|
67
|
-
s.add_dependency(%q<
|
68
|
-
s.add_dependency(%q<
|
69
|
-
s.add_dependency(%q<resourceful>, ["~> 0.6.1"])
|
70
|
-
s.add_dependency(%q<activesupport>, [">= 2.1.2"])
|
64
|
+
s.add_dependency(%q<fakeweb>, [">= 0"])
|
65
|
+
s.add_dependency(%q<activesupport>, [">= 0"])
|
71
66
|
end
|
72
67
|
end
|
68
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stale_fish
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Smestad
|
@@ -9,19 +9,9 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-02-22 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
16
|
-
name: facets
|
17
|
-
type: :runtime
|
18
|
-
version_requirement:
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: "0"
|
24
|
-
version:
|
25
15
|
- !ruby/object:Gem::Dependency
|
26
16
|
name: fakeweb
|
27
17
|
type: :runtime
|
@@ -30,17 +20,7 @@ dependencies:
|
|
30
20
|
requirements:
|
31
21
|
- - ">="
|
32
22
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
-
version:
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: resourceful
|
37
|
-
type: :runtime
|
38
|
-
version_requirement:
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
40
|
-
requirements:
|
41
|
-
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: 0.6.1
|
23
|
+
version: "0"
|
44
24
|
version:
|
45
25
|
- !ruby/object:Gem::Dependency
|
46
26
|
name: activesupport
|
@@ -50,7 +30,7 @@ dependencies:
|
|
50
30
|
requirements:
|
51
31
|
- - ">="
|
52
32
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
33
|
+
version: "0"
|
54
34
|
version:
|
55
35
|
description:
|
56
36
|
email: justin.smestad@gmail.com
|
@@ -63,25 +43,26 @@ extra_rdoc_files:
|
|
63
43
|
- README.rdoc
|
64
44
|
files:
|
65
45
|
- .gitignore
|
46
|
+
- Gemfile
|
66
47
|
- LICENSE
|
67
48
|
- README.rdoc
|
68
49
|
- Rakefile
|
69
50
|
- VERSION
|
70
51
|
- lib/stale_fish.rb
|
71
|
-
- lib/stale_fish/
|
72
|
-
- lib/stale_fish/fixture_definition.rb
|
73
|
-
- lib/stale_fish/utility.rb
|
74
|
-
- spec/deprecation_spec.rb
|
52
|
+
- lib/stale_fish/fixture.rb
|
75
53
|
- spec/fixtures/deprecated_yaml.yml
|
76
54
|
- spec/fixtures/google.html
|
77
55
|
- spec/fixtures/malformed_stale_fish.yml
|
78
56
|
- spec/fixtures/stale_fish.yml
|
79
57
|
- spec/fixtures/stale_fish_fakeweb.yml
|
80
58
|
- spec/fixtures/yahoo.html
|
59
|
+
- spec/spec.opts
|
81
60
|
- spec/spec_helper.rb
|
82
|
-
- spec/
|
61
|
+
- spec/support/stale_fish.yml
|
62
|
+
- spec/support/test.yml
|
63
|
+
- spec/unit/fixture_spec.rb
|
64
|
+
- spec/unit/stale_fish_spec.rb
|
83
65
|
- stale_fish.gemspec
|
84
|
-
- tmp/.gitignore
|
85
66
|
has_rdoc: true
|
86
67
|
homepage: http://github.com/jsmestad/stale_fish
|
87
68
|
licenses: []
|
@@ -99,9 +80,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
99
80
|
version:
|
100
81
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
82
|
requirements:
|
102
|
-
- - "
|
83
|
+
- - ">"
|
103
84
|
- !ruby/object:Gem::Version
|
104
|
-
version:
|
85
|
+
version: 1.3.1
|
105
86
|
version:
|
106
87
|
requirements: []
|
107
88
|
|
@@ -111,6 +92,6 @@ signing_key:
|
|
111
92
|
specification_version: 3
|
112
93
|
summary: keeps fixtures synchronized with sources to prevent outdated fixtures going undetected.
|
113
94
|
test_files:
|
114
|
-
- spec/deprecation_spec.rb
|
115
95
|
- spec/spec_helper.rb
|
116
|
-
- spec/
|
96
|
+
- spec/unit/fixture_spec.rb
|
97
|
+
- spec/unit/stale_fish_spec.rb
|
data/lib/stale_fish/fakeweb.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
module StaleFish
|
2
|
-
|
3
|
-
class << self
|
4
|
-
attr_accessor :use_fakeweb
|
5
|
-
end
|
6
|
-
|
7
|
-
self.use_fakeweb = true
|
8
|
-
|
9
|
-
class FixtureDefinition
|
10
|
-
alias_method :update_without_fakeweb, :update!
|
11
|
-
|
12
|
-
def update!
|
13
|
-
FakeWeb.allow_net_connect = true
|
14
|
-
update_without_fakeweb
|
15
|
-
FakeWeb.allow_net_connect = false
|
16
|
-
end
|
17
|
-
|
18
|
-
def register_uri
|
19
|
-
if StaleFish.use_fakeweb && !FakeWeb.registered_uri?(:any, source_url)
|
20
|
-
FakeWeb.register_uri(:any, source_url, :body => file_path)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
module StaleFish
|
2
|
-
|
3
|
-
class FixtureDefinition
|
4
|
-
attr_accessor :tag, :file_path, :source_url, :last_updated_at, :response
|
5
|
-
attr_accessor :update_frequency
|
6
|
-
|
7
|
-
def is_stale?
|
8
|
-
StaleFish.force_flag || last_updated_at.nil? || ((DateTime.now + eval(update_frequency)) < last_updated_at)
|
9
|
-
end
|
10
|
-
|
11
|
-
def update!
|
12
|
-
begin
|
13
|
-
self.response = StaleFish.http.resource(source_url).get
|
14
|
-
File.open(eval(file_path), 'w') { |file| file.write(response.body.to_s) }
|
15
|
-
self.last_updated_at = DateTime.now
|
16
|
-
rescue Resourceful::UnsuccessfulHttpRequestError
|
17
|
-
raise StaleFish::FixtureUpdateFailure, "#{key}'s source: #{value['source']} returned unsuccessfully."
|
18
|
-
rescue ArgumentError
|
19
|
-
raise StaleFish::MalformedSourceURL, "#{key}'s source: #{value['source']} is not a valid URL path. Most likely it's missing a trailing slash."
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def output_hash
|
24
|
-
<<-EOF
|
25
|
-
#{tag}:
|
26
|
-
file_path: #{file_path}
|
27
|
-
source_url: #{source_url}
|
28
|
-
update_frequency: #{update_frequency}
|
29
|
-
last_updated_at: #{last_updated_at}
|
30
|
-
EOF
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
data/lib/stale_fish/utility.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
require 'singleton'
|
2
|
-
|
3
|
-
module StaleFish
|
4
|
-
module Utility
|
5
|
-
class << self
|
6
|
-
attr_accessor :config_path
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.valid_path?
|
10
|
-
!config_path.nil? ? File.exist?(config_path) : false
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.loader
|
14
|
-
raise Errno::ENOENT, 'invalid config path: #{Utility.config_path}; ensure StaleFish::Utility.valid_path? is true' unless Utility.valid_path?
|
15
|
-
|
16
|
-
data = YAML.load_file(config_path)
|
17
|
-
|
18
|
-
config = data['stale'].delete('configuration')
|
19
|
-
StaleFish.use_fakeweb = (config['use_fakeweb'] || false) unless config.nil?
|
20
|
-
|
21
|
-
raise YAML::Error, 'missing root element' unless data['stale']
|
22
|
-
|
23
|
-
# Reset these
|
24
|
-
StaleFish.fixtures = []
|
25
|
-
StaleFish.force_flag = false
|
26
|
-
|
27
|
-
deprecated_var_names = {
|
28
|
-
'file_path' => 'filepath',
|
29
|
-
'update_frequency' => 'frequency',
|
30
|
-
'source_url' => 'source',
|
31
|
-
'last_updated_at' => 'updated'
|
32
|
-
}
|
33
|
-
|
34
|
-
data['stale'].each do |key, value|
|
35
|
-
definition = FixtureDefinition.new
|
36
|
-
definition.tag = key
|
37
|
-
%w{ file_path update_frequency source_url }.each do |field|
|
38
|
-
if value[deprecated_var_names[field]]
|
39
|
-
$stderr.puts "Deprecation warning: #{field} has been replaced with #{deprecated_var_names[field]}. Please update #{Utility.config_path}."
|
40
|
-
definition.send((field + '=').to_sym, value[deprecated_var_names[field]])
|
41
|
-
else
|
42
|
-
raise YAML::Error, "missing #{field} node for #{key} in #{Utility.config_path}" unless value[field]
|
43
|
-
definition.send((field + '=').to_sym, value[field])
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
$stderr.puts "Deprecation warning: updated has been changed to last_updated_at; this change is automatic." if value.has_key?('updated')
|
48
|
-
definition.last_updated_at = value['last_updated_at'] || value[deprecated_var_names['last_updated_at']] || nil
|
49
|
-
|
50
|
-
StaleFish.fixtures << definition
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.writer
|
55
|
-
string = <<-EOF
|
56
|
-
stale:
|
57
|
-
configuration:
|
58
|
-
use_fakeweb: #{StaleFish.use_fakeweb}
|
59
|
-
EOF
|
60
|
-
StaleFish.fixtures.each do |fix|
|
61
|
-
string << fix.output_hash
|
62
|
-
end
|
63
|
-
|
64
|
-
File.open(config_path, "w+") { |f| f.write(string) }
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
data/spec/deprecation_spec.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
-
|
3
|
-
describe StaleFish do
|
4
|
-
|
5
|
-
before do
|
6
|
-
@deprecated_yaml = File.dirname(__FILE__) + "/fixtures/deprecated_yaml.yml"
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should assign the config file" do
|
10
|
-
StaleFish::Utility.config_path = @deprecated_yaml
|
11
|
-
StaleFish::Utility.config_path.should == @deprecated_yaml
|
12
|
-
StaleFish::Utility.valid_path?.should == true
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should map to valid attributes" do
|
16
|
-
pending
|
17
|
-
StaleFish::Utility.loader
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
data/spec/stale_fish_spec.rb
DELETED
@@ -1,104 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
|
3
|
-
describe "StaleFish" do
|
4
|
-
|
5
|
-
before do
|
6
|
-
@valid_yaml = File.dirname(__FILE__) + "/fixtures/stale_fish.yml"
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should assign the config file" do
|
10
|
-
StaleFish::Utility.config_path = @valid_yaml
|
11
|
-
StaleFish::Utility.config_path.should == @valid_yaml
|
12
|
-
StaleFish::Utility.valid_path?.should == true
|
13
|
-
end
|
14
|
-
|
15
|
-
context "when loading the yaml file" do
|
16
|
-
|
17
|
-
it "should raise errors on malformed yaml" do
|
18
|
-
StaleFish::Utility.config_path = File.dirname(__FILE__) + "/fixtures/malformed_stale_fish.yml"
|
19
|
-
lambda { StaleFish::Utility.loader }.should_not raise_error(Errno::ENOENT)
|
20
|
-
lambda { StaleFish::Utility.loader }.should raise_error(YAML::Error)
|
21
|
-
end
|
22
|
-
|
23
|
-
it "shouldn't fail on valid yaml" do
|
24
|
-
StaleFish::Utility.config_path = @valid_yaml
|
25
|
-
lambda { StaleFish::Utility.loader }.should_not raise_error(YAML::Error)
|
26
|
-
end
|
27
|
-
|
28
|
-
it "should establish the fixture definitions" do
|
29
|
-
StaleFish::Utility.config_path = @valid_yaml
|
30
|
-
lambda { StaleFish::Utility.loader }
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
context "after loading the config" do
|
36
|
-
|
37
|
-
before(:each) do
|
38
|
-
FileUtils.cp(@valid_yaml, File.dirname(__FILE__) + "/fixtures/stale_fish.orig.yml")
|
39
|
-
StaleFish::Utility.config_path = @valid_yaml
|
40
|
-
StaleFish::Utility.valid_path?.should == true
|
41
|
-
StaleFish::Utility.loader
|
42
|
-
end
|
43
|
-
|
44
|
-
it "should update all stale fixtures" do
|
45
|
-
StaleFish.update_stale.should == 2
|
46
|
-
end
|
47
|
-
|
48
|
-
it "should update only the passed fixtures, if stale" do
|
49
|
-
StaleFish.update_stale('google').should == 1
|
50
|
-
end
|
51
|
-
|
52
|
-
it "should update all passed fixtures, when passed the :force flag" do
|
53
|
-
StaleFish.update_stale('google').should == 1
|
54
|
-
StaleFish.update_stale('google', :force => true).should == 1
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should not have any remaining fixtures to update" do
|
58
|
-
StaleFish.update_stale.should == 2
|
59
|
-
StaleFish.fixtures = [] # this will force a reload of the YAML file.
|
60
|
-
StaleFish.fixtures.should == [] # ensure it was reset
|
61
|
-
StaleFish::Utility.loader
|
62
|
-
StaleFish.update_stale.should == 0
|
63
|
-
end
|
64
|
-
|
65
|
-
it "should notify user, and rollback, if source is no longer valid"
|
66
|
-
|
67
|
-
after(:each) do
|
68
|
-
FileUtils.mv(@valid_yaml, File.dirname(__FILE__)+"/../tmp/stale_fish.test.yml")
|
69
|
-
FileUtils.mv(File.dirname(__FILE__)+"/fixtures/stale_fish.orig.yml", @valid_yaml)
|
70
|
-
StaleFish.fixtures = []
|
71
|
-
end
|
72
|
-
|
73
|
-
end
|
74
|
-
|
75
|
-
context "with FakeWeb" do
|
76
|
-
|
77
|
-
before(:each) do
|
78
|
-
@fakeweb_yaml = File.dirname(__FILE__) + '/fixtures/stale_fish_fakeweb.yml'
|
79
|
-
StaleFish::Utility.config_path = @fakeweb_yaml
|
80
|
-
StaleFish::Utility.valid_path?.should == true
|
81
|
-
StaleFish::Utility.loader
|
82
|
-
StaleFish.use_fakeweb = true
|
83
|
-
StaleFish.use_fakeweb.should == true
|
84
|
-
end
|
85
|
-
|
86
|
-
it "should register any FakeWeb URI's" do
|
87
|
-
definition = StaleFish.fixtures.first
|
88
|
-
definition.register_uri
|
89
|
-
FakeWeb.registered_uri?(definition.source_url).should == true
|
90
|
-
end
|
91
|
-
|
92
|
-
it "should turn off FakeWeb.allow_net_connect to process stale fixtures" do
|
93
|
-
FakeWeb.allow_net_connect = false
|
94
|
-
lambda { StaleFish.update_stale(:force => true) }.should_not raise_error
|
95
|
-
lambda { StaleFish.update_stale(:force => true) }.should_not change { FakeWeb.allow_net_connect? }
|
96
|
-
end
|
97
|
-
|
98
|
-
after(:each) do
|
99
|
-
StaleFish.fixtures = []
|
100
|
-
end
|
101
|
-
|
102
|
-
end
|
103
|
-
|
104
|
-
end
|