fallback 0.1.0
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/Rakefile +19 -0
- data/Readme.md +34 -0
- data/VERSION +1 -0
- data/fallback.gemspec +45 -0
- data/lib/fallback.rb +52 -0
- data/spec/database.rb +23 -0
- data/spec/fallback_spec.rb +115 -0
- data/spec/spec_helper.rb +5 -0
- metadata +71 -0
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec/rake/spectask'
|
2
|
+
Spec::Rake::SpecTask.new {|t| t.spec_opts = ['--color']}
|
3
|
+
task :default => :spec
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'jeweler'
|
7
|
+
project_name = 'fallback'
|
8
|
+
Jeweler::Tasks.new do |gem|
|
9
|
+
gem.name = project_name
|
10
|
+
gem.summary = "Fallback when original is not present or somethings not right."
|
11
|
+
gem.email = "grosser.michael@gmail.com"
|
12
|
+
gem.homepage = "http://github.com/grosser/#{project_name}"
|
13
|
+
gem.authors = ["Michael Grosser"]
|
14
|
+
end
|
15
|
+
|
16
|
+
Jeweler::GemcutterTasks.new
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install jeweler"
|
19
|
+
end
|
data/Readme.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
Fallback when original is not present or somethings not right.
|
2
|
+
For normal Object's and ActiveRecord's.
|
3
|
+
|
4
|
+
class User < ActiveRecord::Base
|
5
|
+
include Fallback
|
6
|
+
|
7
|
+
# use description if detailed description is not available
|
8
|
+
fallback :detailed_description => :descripion
|
9
|
+
|
10
|
+
has_one :shop
|
11
|
+
|
12
|
+
# use shop.name if user.name is blank
|
13
|
+
fallback :name, :to => :shop
|
14
|
+
|
15
|
+
# use shop.title if user.name is blank
|
16
|
+
fallback :name => :title, :to => :shop
|
17
|
+
|
18
|
+
# use shop.title if lambda is true (also works with :unless)
|
19
|
+
fallback :title, :to => :shop, :if => lambda{|user| user.title.size < 10 }
|
20
|
+
|
21
|
+
# use shop.title if user.title_to_short? is true
|
22
|
+
fallback :title, :to => :shop, :if => :title_to_short?
|
23
|
+
end
|
24
|
+
|
25
|
+
Install
|
26
|
+
=======
|
27
|
+
Gem ` sudo gem install fallback `
|
28
|
+
Or as Rails plugin: ` script/plugin install git://github.com/grosser/fallback.git `
|
29
|
+
|
30
|
+
Author
|
31
|
+
======
|
32
|
+
[Michael Grosser](http://pragmatig.wordpress.com)
|
33
|
+
grosser.michael@gmail.com
|
34
|
+
Hereby placed under public domain, do what you want, just do not hold me accountable...
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/fallback.gemspec
ADDED
@@ -0,0 +1,45 @@
|
|
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{fallback}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Michael Grosser"]
|
12
|
+
s.date = %q{2010-05-04}
|
13
|
+
s.email = %q{grosser.michael@gmail.com}
|
14
|
+
s.files = [
|
15
|
+
"Rakefile",
|
16
|
+
"Readme.md",
|
17
|
+
"VERSION",
|
18
|
+
"fallback.gemspec",
|
19
|
+
"lib/fallback.rb",
|
20
|
+
"spec/database.rb",
|
21
|
+
"spec/fallback_spec.rb",
|
22
|
+
"spec/spec_helper.rb"
|
23
|
+
]
|
24
|
+
s.homepage = %q{http://github.com/grosser/fallback}
|
25
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
26
|
+
s.require_paths = ["lib"]
|
27
|
+
s.rubygems_version = %q{1.3.6}
|
28
|
+
s.summary = %q{Fallback when original is not present or somethings not right.}
|
29
|
+
s.test_files = [
|
30
|
+
"spec/fallback_spec.rb",
|
31
|
+
"spec/database.rb",
|
32
|
+
"spec/spec_helper.rb"
|
33
|
+
]
|
34
|
+
|
35
|
+
if s.respond_to? :specification_version then
|
36
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
37
|
+
s.specification_version = 3
|
38
|
+
|
39
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
40
|
+
else
|
41
|
+
end
|
42
|
+
else
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
data/lib/fallback.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
module Fallback
|
2
|
+
VERSION = File.read( File.join(File.dirname(__FILE__),'..','VERSION') ).strip
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.send(:extend, ClassMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def fallback(*args)
|
10
|
+
options = args.pop if args.last.is_a?(Hash) # extract_options!
|
11
|
+
|
12
|
+
methods = options.reject{|k,v| [:if, :unless, :to].include?(k) }.to_a
|
13
|
+
methods += args
|
14
|
+
|
15
|
+
methods.each do |method, delegate_method|
|
16
|
+
define_fallback(method, delegate_method, options)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def define_fallback(method, delegate_method, options)
|
21
|
+
delegate_method ||= method
|
22
|
+
# build attribute methods for AR or alias will not work
|
23
|
+
define_attribute_methods if respond_to?(:define_attribute_methods)
|
24
|
+
|
25
|
+
define_method "#{method}_with_fallback" do
|
26
|
+
current = send("#{method}_without_fallback")
|
27
|
+
|
28
|
+
conditions = options.select{|k,v| [:if, :unless].include?(k)}
|
29
|
+
do_delegate = if conditions.empty?
|
30
|
+
current.to_s.strip.empty? # present?
|
31
|
+
else
|
32
|
+
# {:if => :a, :unless => :a} --> [true, false].all? --> false
|
33
|
+
conditions.map do |condition, value|
|
34
|
+
result = !!(value.respond_to?(:call) ? value.call(self) : send(value))
|
35
|
+
condition == :unless ? result : !result
|
36
|
+
end.all?
|
37
|
+
end
|
38
|
+
|
39
|
+
if do_delegate
|
40
|
+
delegate = (options[:to] ? send(options[:to]) : self )
|
41
|
+
delegate.send(delegate_method)
|
42
|
+
else
|
43
|
+
current
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# alias_method_chain method, :fallback
|
48
|
+
alias_method "#{method}_without_fallback", method
|
49
|
+
alias_method method, "#{method}_with_fallback"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/spec/database.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
|
3
|
+
# connect
|
4
|
+
ActiveRecord::Base.establish_connection(
|
5
|
+
:adapter => "sqlite3",
|
6
|
+
:database => ":memory:"
|
7
|
+
)
|
8
|
+
|
9
|
+
# create tables
|
10
|
+
ActiveRecord::Schema.define(:version => 1) do
|
11
|
+
create_table :users do |t|
|
12
|
+
t.string :name
|
13
|
+
t.string :title
|
14
|
+
t.string :description
|
15
|
+
t.text :detailed_description
|
16
|
+
end
|
17
|
+
|
18
|
+
create_table :shops do |t|
|
19
|
+
t.string :name
|
20
|
+
t.string :title
|
21
|
+
t.string :description
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
class Shop < ActiveRecord::Base
|
4
|
+
end
|
5
|
+
|
6
|
+
class User < ActiveRecord::Base
|
7
|
+
include Fallback
|
8
|
+
has_one :shop
|
9
|
+
fallback :name, :to => :shop
|
10
|
+
end
|
11
|
+
|
12
|
+
class User2 < ActiveRecord::Base
|
13
|
+
include Fallback
|
14
|
+
set_table_name :users
|
15
|
+
has_one :shop
|
16
|
+
fallback :name => :title, :to => :shop
|
17
|
+
end
|
18
|
+
|
19
|
+
class User3 < ActiveRecord::Base
|
20
|
+
include Fallback
|
21
|
+
set_table_name :users
|
22
|
+
fallback :description => :detailed_description
|
23
|
+
end
|
24
|
+
|
25
|
+
class User4 < ActiveRecord::Base
|
26
|
+
include Fallback
|
27
|
+
set_table_name :users
|
28
|
+
fallback :name => :description, :if => lambda{|u| u.xxx}
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
describe Fallback do
|
33
|
+
describe 'without delegation' do
|
34
|
+
it "uses current if current is present" do
|
35
|
+
user = User3.new(:description => 'DESC', :detailed_description => 'OOOPS')
|
36
|
+
user.description.should == 'DESC'
|
37
|
+
end
|
38
|
+
|
39
|
+
it "calls method if current is blank" do
|
40
|
+
user = User3.new(:description => ' ', :detailed_description => 'DESC')
|
41
|
+
user.description.should == 'DESC'
|
42
|
+
end
|
43
|
+
|
44
|
+
it "calls method if current is nil" do
|
45
|
+
user = User3.new(:description => nil, :detailed_description => 'DESC')
|
46
|
+
user.description.should == 'DESC'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe 'simple delegation' do
|
51
|
+
it "uses current if current is present" do
|
52
|
+
user = User.new(:name => 'NAME', :shop => Shop.new(:name => 'OOPS'))
|
53
|
+
user.name.should == 'NAME'
|
54
|
+
end
|
55
|
+
|
56
|
+
it "calls method if current is blank" do
|
57
|
+
user = User.new(:name => ' ', :shop => Shop.new(:name => 'NAME'))
|
58
|
+
user.name.should == 'NAME'
|
59
|
+
end
|
60
|
+
|
61
|
+
it "calls method if current is nil" do
|
62
|
+
user = User.new(:name => nil, :shop => Shop.new(:name => 'NAME'))
|
63
|
+
user.name.should == 'NAME'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe 'delegation with rewrite' do
|
68
|
+
it "uses current if current is present" do
|
69
|
+
user = User2.new(:name => 'NAME', :shop => Shop.new(:title => 'OOPS'))
|
70
|
+
user.name.should == 'NAME'
|
71
|
+
end
|
72
|
+
|
73
|
+
it "calls method if current is blank" do
|
74
|
+
user = User2.new(:name => ' ', :shop => Shop.new(:title => 'TITLE'))
|
75
|
+
user.name.should == 'TITLE'
|
76
|
+
end
|
77
|
+
|
78
|
+
it "calls method if current is nil" do
|
79
|
+
user = User2.new(:name => nil, :shop => Shop.new(:title => 'TITLE'))
|
80
|
+
user.name.should == 'TITLE'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe 'with lambda' do
|
85
|
+
before do
|
86
|
+
@user = User4.new(:name => 'N', :description => 'D')
|
87
|
+
end
|
88
|
+
|
89
|
+
it "asks lambda" do
|
90
|
+
@user.should_receive(:xxx).and_return true
|
91
|
+
@user.name
|
92
|
+
end
|
93
|
+
|
94
|
+
it "returns original if lambda returns false" do
|
95
|
+
@user.stub!(:xxx).and_return false
|
96
|
+
@user.name.should == 'D'
|
97
|
+
end
|
98
|
+
|
99
|
+
it "delegates if lambda returns true" do
|
100
|
+
@user.stub!(:xxx).and_return true
|
101
|
+
@user.name.should == 'N'
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "without fallback" do
|
106
|
+
it "can call original value" do
|
107
|
+
user = User.new(:name => nil, :shop => Shop.new(:name => 'NAME'))
|
108
|
+
user.name_without_fallback.should == nil
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
it "has a VERSION" do
|
113
|
+
Fallback::VERSION.should =~ /^\d+\.\d+\.\d+$/
|
114
|
+
end
|
115
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fallback
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Michael Grosser
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-05-04 00:00:00 +02:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description:
|
22
|
+
email: grosser.michael@gmail.com
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files: []
|
28
|
+
|
29
|
+
files:
|
30
|
+
- Rakefile
|
31
|
+
- Readme.md
|
32
|
+
- VERSION
|
33
|
+
- fallback.gemspec
|
34
|
+
- lib/fallback.rb
|
35
|
+
- spec/database.rb
|
36
|
+
- spec/fallback_spec.rb
|
37
|
+
- spec/spec_helper.rb
|
38
|
+
has_rdoc: true
|
39
|
+
homepage: http://github.com/grosser/fallback
|
40
|
+
licenses: []
|
41
|
+
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options:
|
44
|
+
- --charset=UTF-8
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
segments:
|
52
|
+
- 0
|
53
|
+
version: "0"
|
54
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
requirements: []
|
62
|
+
|
63
|
+
rubyforge_project:
|
64
|
+
rubygems_version: 1.3.6
|
65
|
+
signing_key:
|
66
|
+
specification_version: 3
|
67
|
+
summary: Fallback when original is not present or somethings not right.
|
68
|
+
test_files:
|
69
|
+
- spec/fallback_spec.rb
|
70
|
+
- spec/database.rb
|
71
|
+
- spec/spec_helper.rb
|