friendly-attributes 0.2.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +5 -1
- data/lib/friendly_attributes.rb +4 -0
- data/lib/friendly_attributes/details_delegator.rb +5 -1
- data/lib/friendly_attributes/test/matchers.rb +35 -0
- metadata +7 -28
- data/.document +0 -5
- data/Gemfile +0 -15
- data/Gemfile.lock +0 -49
- data/Rakefile +0 -58
- data/VERSION +0 -1
- data/friendly-attributes.gemspec +0 -131
- data/spec/config.yml.example +0 -6
- data/spec/friendly_attributes/class_methods_spec.rb +0 -107
- data/spec/friendly_attributes/details_delegator_spec.rb +0 -129
- data/spec/friendly_attributes/details_spec.rb +0 -27
- data/spec/friendly_attributes/instance_methods_spec.rb +0 -113
- data/spec/friendly_attributes_spec.rb +0 -73
- data/spec/spec_helper.rb +0 -56
- data/spec/support/active_record_fake.rb +0 -18
- data/spec/support/database_cleaner_helpers.rb +0 -11
data/CHANGELOG.md
CHANGED
data/lib/friendly_attributes.rb
CHANGED
@@ -7,6 +7,10 @@ module FriendlyAttributes
|
|
7
7
|
autoload :Details, 'friendly_attributes/details'
|
8
8
|
autoload :DetailsDelegator, 'friendly_attributes/details_delegator'
|
9
9
|
|
10
|
+
module Test
|
11
|
+
autoload :Matchers, 'friendly_attributes/test/matchers'
|
12
|
+
end
|
13
|
+
|
10
14
|
def self.included(base)
|
11
15
|
base.extend ClassMethods
|
12
16
|
base.send(:include, InstanceMethods)
|
@@ -16,14 +16,18 @@ module FriendlyAttributes
|
|
16
16
|
end
|
17
17
|
|
18
18
|
ar_model.class_eval do
|
19
|
+
cattr_accessor :friendly_model
|
20
|
+
|
19
21
|
after_save :update_friendly_details
|
20
22
|
after_destroy :destroy_friendly_details
|
21
|
-
|
23
|
+
|
22
24
|
define_method(:details) do
|
23
25
|
@details ||= friendly_model.find_or_build_by_active_record_id(id)
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
29
|
+
ar_model.friendly_model = friendly_model
|
30
|
+
|
27
31
|
self.instance_eval(&block) if block_given?
|
28
32
|
end
|
29
33
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module FriendlyAttributes
|
2
|
+
module Test
|
3
|
+
module Matchers
|
4
|
+
class HaveFriendlyAttribute
|
5
|
+
def initialize(example, type, *attributes)
|
6
|
+
@example = example
|
7
|
+
@type = type
|
8
|
+
@attributes = attributes
|
9
|
+
end
|
10
|
+
|
11
|
+
def matches?(actual)
|
12
|
+
@actual = actual
|
13
|
+
actual = Class === actual ? actual : actual.class
|
14
|
+
|
15
|
+
result = actual.ancestors.include?(FriendlyAttributes) && @attributes.all? { |attr|
|
16
|
+
actual.friendly_model.attributes.include?(attr) && actual.friendly_model.attributes[attr].type == @type
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def failure_message
|
21
|
+
"expected #{@actual.inspect} to have friendly attributes #{@attributes.inspect} of type #{@type}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def negative_failure_message
|
25
|
+
"expected #{@actual.inspect} not to have friendly attributes #{@attributes.inspect}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def have_friendly_attributes(*args)
|
30
|
+
HaveFriendlyAttribute.new(self, *args)
|
31
|
+
end
|
32
|
+
alias_method :have_friendly_attribute, :have_friendly_attributes
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: friendly-attributes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 1
|
10
|
+
version: 0.3.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Istvan Hoka
|
@@ -344,30 +344,16 @@ extra_rdoc_files:
|
|
344
344
|
- LICENSE.txt
|
345
345
|
- README.rdoc
|
346
346
|
files:
|
347
|
-
- .document
|
348
347
|
- CHANGELOG.md
|
349
|
-
- Gemfile
|
350
|
-
- Gemfile.lock
|
351
348
|
- LICENSE.txt
|
352
349
|
- README.rdoc
|
353
|
-
- Rakefile
|
354
|
-
- VERSION
|
355
|
-
- friendly-attributes.gemspec
|
356
350
|
- lib/friendly-attributes.rb
|
357
351
|
- lib/friendly_attributes.rb
|
358
352
|
- lib/friendly_attributes/class_methods.rb
|
359
353
|
- lib/friendly_attributes/details.rb
|
360
354
|
- lib/friendly_attributes/details_delegator.rb
|
361
355
|
- lib/friendly_attributes/instance_methods.rb
|
362
|
-
-
|
363
|
-
- spec/friendly_attributes/class_methods_spec.rb
|
364
|
-
- spec/friendly_attributes/details_delegator_spec.rb
|
365
|
-
- spec/friendly_attributes/details_spec.rb
|
366
|
-
- spec/friendly_attributes/instance_methods_spec.rb
|
367
|
-
- spec/friendly_attributes_spec.rb
|
368
|
-
- spec/spec_helper.rb
|
369
|
-
- spec/support/active_record_fake.rb
|
370
|
-
- spec/support/database_cleaner_helpers.rb
|
356
|
+
- lib/friendly_attributes/test/matchers.rb
|
371
357
|
has_rdoc: true
|
372
358
|
homepage: http://github.com/ihoka/friendly-attributes
|
373
359
|
licenses:
|
@@ -402,12 +388,5 @@ rubygems_version: 1.3.7
|
|
402
388
|
signing_key:
|
403
389
|
specification_version: 3
|
404
390
|
summary: Extend ActiveRecord models using Friendly ORM delegate models
|
405
|
-
test_files:
|
406
|
-
|
407
|
-
- spec/friendly_attributes/details_delegator_spec.rb
|
408
|
-
- spec/friendly_attributes/details_spec.rb
|
409
|
-
- spec/friendly_attributes/instance_methods_spec.rb
|
410
|
-
- spec/friendly_attributes_spec.rb
|
411
|
-
- spec/spec_helper.rb
|
412
|
-
- spec/support/active_record_fake.rb
|
413
|
-
- spec/support/database_cleaner_helpers.rb
|
391
|
+
test_files: []
|
392
|
+
|
data/.document
DELETED
data/Gemfile
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
source 'http://rubygems.org'
|
2
|
-
|
3
|
-
gem 'activerecord', '~> 2.3.5'
|
4
|
-
gem 'friendly', '~> 0.6.0'
|
5
|
-
gem 'yajl-ruby', '~> 0.7.7'
|
6
|
-
gem 'memcached', '~> 0.20.1'
|
7
|
-
|
8
|
-
group :development do
|
9
|
-
gem 'mysql', '~> 2.8.1'
|
10
|
-
gem 'rspec', '~> 2.1.0'
|
11
|
-
gem 'bundler', '~> 1.0.0'
|
12
|
-
gem 'jeweler', '~> 1.5.1'
|
13
|
-
gem 'rcov', '>= 0'
|
14
|
-
gem 'database_cleaner', '~> 0.5.0'
|
15
|
-
end
|
data/Gemfile.lock
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: http://rubygems.org/
|
3
|
-
specs:
|
4
|
-
activerecord (2.3.5)
|
5
|
-
activesupport (= 2.3.5)
|
6
|
-
activesupport (2.3.5)
|
7
|
-
database_cleaner (0.5.2)
|
8
|
-
diff-lcs (1.1.2)
|
9
|
-
friendly (0.6.0)
|
10
|
-
activesupport (= 2.3.5)
|
11
|
-
rufus-json (= 0.2.3)
|
12
|
-
sequel (>= 3.7.0)
|
13
|
-
will_paginate
|
14
|
-
git (1.2.5)
|
15
|
-
jeweler (1.5.1)
|
16
|
-
bundler (~> 1.0.0)
|
17
|
-
git (>= 1.2.5)
|
18
|
-
rake
|
19
|
-
memcached (0.20.1)
|
20
|
-
mysql (2.8.1)
|
21
|
-
rake (0.8.7)
|
22
|
-
rcov (0.9.9)
|
23
|
-
rspec (2.1.0)
|
24
|
-
rspec-core (~> 2.1.0)
|
25
|
-
rspec-expectations (~> 2.1.0)
|
26
|
-
rspec-mocks (~> 2.1.0)
|
27
|
-
rspec-core (2.1.0)
|
28
|
-
rspec-expectations (2.1.0)
|
29
|
-
diff-lcs (~> 1.1.2)
|
30
|
-
rspec-mocks (2.1.0)
|
31
|
-
rufus-json (0.2.3)
|
32
|
-
sequel (3.17.0)
|
33
|
-
will_paginate (2.3.15)
|
34
|
-
yajl-ruby (0.7.8)
|
35
|
-
|
36
|
-
PLATFORMS
|
37
|
-
ruby
|
38
|
-
|
39
|
-
DEPENDENCIES
|
40
|
-
activerecord (~> 2.3.5)
|
41
|
-
bundler (~> 1.0.0)
|
42
|
-
database_cleaner (~> 0.5.0)
|
43
|
-
friendly (~> 0.6.0)
|
44
|
-
jeweler (~> 1.5.1)
|
45
|
-
memcached (~> 0.20.1)
|
46
|
-
mysql (~> 2.8.1)
|
47
|
-
rcov
|
48
|
-
rspec (~> 2.1.0)
|
49
|
-
yajl-ruby (~> 0.7.7)
|
data/Rakefile
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'bundler'
|
3
|
-
begin
|
4
|
-
Bundler.setup(:default, :development)
|
5
|
-
rescue Bundler::BundlerError => e
|
6
|
-
$stderr.puts e.message
|
7
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
-
exit e.status_code
|
9
|
-
end
|
10
|
-
require 'rake'
|
11
|
-
|
12
|
-
require 'jeweler'
|
13
|
-
Jeweler::Tasks.new do |gem|
|
14
|
-
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
15
|
-
gem.name = "friendly-attributes"
|
16
|
-
gem.homepage = "http://github.com/ihoka/friendly-attributes"
|
17
|
-
gem.license = "MIT"
|
18
|
-
gem.summary = %Q{Extend ActiveRecord models using Friendly ORM delegate models}
|
19
|
-
gem.description = %Q{Pattern to add fields to ActiveRecord models, using an associated document, without needing schema migrations.}
|
20
|
-
gem.email = "istvan.hoka@gmail.com"
|
21
|
-
gem.authors = ["Istvan Hoka"]
|
22
|
-
gem.add_runtime_dependency 'activerecord', '~> 2.3.5'
|
23
|
-
gem.add_runtime_dependency 'friendly', '~> 0.6.0'
|
24
|
-
gem.add_runtime_dependency 'yajl-ruby', '~> 0.7.7'
|
25
|
-
gem.add_runtime_dependency 'memcached', '~> 0.20.1'
|
26
|
-
|
27
|
-
gem.add_development_dependency 'mysql', '~> 2.8.1'
|
28
|
-
gem.add_development_dependency 'rspec', '~> 2.1.0'
|
29
|
-
gem.add_development_dependency 'bundler', '~> 1.0.0'
|
30
|
-
gem.add_development_dependency 'jeweler', '~> 1.5.1'
|
31
|
-
gem.add_development_dependency 'rcov', '>= 0'
|
32
|
-
gem.add_development_dependency 'database_cleaner', '~> 0.5.0'
|
33
|
-
end
|
34
|
-
Jeweler::RubygemsDotOrgTasks.new
|
35
|
-
|
36
|
-
require 'rspec/core'
|
37
|
-
require 'rspec/core/rake_task'
|
38
|
-
RSpec::Core::RakeTask.new(:spec) do |spec|
|
39
|
-
spec.pattern = FileList['spec/**/*_spec.rb']
|
40
|
-
end
|
41
|
-
|
42
|
-
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
43
|
-
spec.pattern = FileList['spec/**/*_spec.rb']
|
44
|
-
spec.rcov = true
|
45
|
-
spec.rcov_opts = %w{-I spec:lib --exclude gems\/,spec\/}
|
46
|
-
end
|
47
|
-
|
48
|
-
task :default => :spec
|
49
|
-
|
50
|
-
require 'rake/rdoctask'
|
51
|
-
Rake::RDocTask.new do |rdoc|
|
52
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
53
|
-
|
54
|
-
rdoc.rdoc_dir = 'rdoc'
|
55
|
-
rdoc.title = "friendly-attributes #{version}"
|
56
|
-
rdoc.rdoc_files.include('README*')
|
57
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
58
|
-
end
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.2.0
|
data/friendly-attributes.gemspec
DELETED
@@ -1,131 +0,0 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
-
# -*- encoding: utf-8 -*-
|
5
|
-
|
6
|
-
Gem::Specification.new do |s|
|
7
|
-
s.name = %q{friendly-attributes}
|
8
|
-
s.version = "0.2.0"
|
9
|
-
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Istvan Hoka"]
|
12
|
-
s.date = %q{2010-11-20}
|
13
|
-
s.description = %q{Pattern to add fields to ActiveRecord models, using an associated document, without needing schema migrations.}
|
14
|
-
s.email = %q{istvan.hoka@gmail.com}
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"LICENSE.txt",
|
17
|
-
"README.rdoc"
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
".document",
|
21
|
-
"CHANGELOG.md",
|
22
|
-
"Gemfile",
|
23
|
-
"Gemfile.lock",
|
24
|
-
"LICENSE.txt",
|
25
|
-
"README.rdoc",
|
26
|
-
"Rakefile",
|
27
|
-
"VERSION",
|
28
|
-
"friendly-attributes.gemspec",
|
29
|
-
"lib/friendly-attributes.rb",
|
30
|
-
"lib/friendly_attributes.rb",
|
31
|
-
"lib/friendly_attributes/class_methods.rb",
|
32
|
-
"lib/friendly_attributes/details.rb",
|
33
|
-
"lib/friendly_attributes/details_delegator.rb",
|
34
|
-
"lib/friendly_attributes/instance_methods.rb",
|
35
|
-
"spec/config.yml.example",
|
36
|
-
"spec/friendly_attributes/class_methods_spec.rb",
|
37
|
-
"spec/friendly_attributes/details_delegator_spec.rb",
|
38
|
-
"spec/friendly_attributes/details_spec.rb",
|
39
|
-
"spec/friendly_attributes/instance_methods_spec.rb",
|
40
|
-
"spec/friendly_attributes_spec.rb",
|
41
|
-
"spec/spec_helper.rb",
|
42
|
-
"spec/support/active_record_fake.rb",
|
43
|
-
"spec/support/database_cleaner_helpers.rb"
|
44
|
-
]
|
45
|
-
s.homepage = %q{http://github.com/ihoka/friendly-attributes}
|
46
|
-
s.licenses = ["MIT"]
|
47
|
-
s.require_paths = ["lib"]
|
48
|
-
s.rubygems_version = %q{1.3.7}
|
49
|
-
s.summary = %q{Extend ActiveRecord models using Friendly ORM delegate models}
|
50
|
-
s.test_files = [
|
51
|
-
"spec/friendly_attributes/class_methods_spec.rb",
|
52
|
-
"spec/friendly_attributes/details_delegator_spec.rb",
|
53
|
-
"spec/friendly_attributes/details_spec.rb",
|
54
|
-
"spec/friendly_attributes/instance_methods_spec.rb",
|
55
|
-
"spec/friendly_attributes_spec.rb",
|
56
|
-
"spec/spec_helper.rb",
|
57
|
-
"spec/support/active_record_fake.rb",
|
58
|
-
"spec/support/database_cleaner_helpers.rb"
|
59
|
-
]
|
60
|
-
|
61
|
-
if s.respond_to? :specification_version then
|
62
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
63
|
-
s.specification_version = 3
|
64
|
-
|
65
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
66
|
-
s.add_runtime_dependency(%q<activerecord>, ["~> 2.3.5"])
|
67
|
-
s.add_runtime_dependency(%q<friendly>, ["~> 0.6.0"])
|
68
|
-
s.add_runtime_dependency(%q<yajl-ruby>, ["~> 0.7.7"])
|
69
|
-
s.add_runtime_dependency(%q<memcached>, ["~> 0.20.1"])
|
70
|
-
s.add_development_dependency(%q<mysql>, ["~> 2.8.1"])
|
71
|
-
s.add_development_dependency(%q<rspec>, ["~> 2.1.0"])
|
72
|
-
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
73
|
-
s.add_development_dependency(%q<jeweler>, ["~> 1.5.1"])
|
74
|
-
s.add_development_dependency(%q<rcov>, [">= 0"])
|
75
|
-
s.add_development_dependency(%q<database_cleaner>, ["~> 0.5.0"])
|
76
|
-
s.add_runtime_dependency(%q<activerecord>, ["~> 2.3.5"])
|
77
|
-
s.add_runtime_dependency(%q<friendly>, ["~> 0.6.0"])
|
78
|
-
s.add_runtime_dependency(%q<yajl-ruby>, ["~> 0.7.7"])
|
79
|
-
s.add_runtime_dependency(%q<memcached>, ["~> 0.20.1"])
|
80
|
-
s.add_development_dependency(%q<mysql>, ["~> 2.8.1"])
|
81
|
-
s.add_development_dependency(%q<rspec>, ["~> 2.1.0"])
|
82
|
-
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
83
|
-
s.add_development_dependency(%q<jeweler>, ["~> 1.5.1"])
|
84
|
-
s.add_development_dependency(%q<rcov>, [">= 0"])
|
85
|
-
s.add_development_dependency(%q<database_cleaner>, ["~> 0.5.0"])
|
86
|
-
else
|
87
|
-
s.add_dependency(%q<activerecord>, ["~> 2.3.5"])
|
88
|
-
s.add_dependency(%q<friendly>, ["~> 0.6.0"])
|
89
|
-
s.add_dependency(%q<yajl-ruby>, ["~> 0.7.7"])
|
90
|
-
s.add_dependency(%q<memcached>, ["~> 0.20.1"])
|
91
|
-
s.add_dependency(%q<mysql>, ["~> 2.8.1"])
|
92
|
-
s.add_dependency(%q<rspec>, ["~> 2.1.0"])
|
93
|
-
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
94
|
-
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
95
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
96
|
-
s.add_dependency(%q<database_cleaner>, ["~> 0.5.0"])
|
97
|
-
s.add_dependency(%q<activerecord>, ["~> 2.3.5"])
|
98
|
-
s.add_dependency(%q<friendly>, ["~> 0.6.0"])
|
99
|
-
s.add_dependency(%q<yajl-ruby>, ["~> 0.7.7"])
|
100
|
-
s.add_dependency(%q<memcached>, ["~> 0.20.1"])
|
101
|
-
s.add_dependency(%q<mysql>, ["~> 2.8.1"])
|
102
|
-
s.add_dependency(%q<rspec>, ["~> 2.1.0"])
|
103
|
-
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
104
|
-
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
105
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
106
|
-
s.add_dependency(%q<database_cleaner>, ["~> 0.5.0"])
|
107
|
-
end
|
108
|
-
else
|
109
|
-
s.add_dependency(%q<activerecord>, ["~> 2.3.5"])
|
110
|
-
s.add_dependency(%q<friendly>, ["~> 0.6.0"])
|
111
|
-
s.add_dependency(%q<yajl-ruby>, ["~> 0.7.7"])
|
112
|
-
s.add_dependency(%q<memcached>, ["~> 0.20.1"])
|
113
|
-
s.add_dependency(%q<mysql>, ["~> 2.8.1"])
|
114
|
-
s.add_dependency(%q<rspec>, ["~> 2.1.0"])
|
115
|
-
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
116
|
-
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
117
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
118
|
-
s.add_dependency(%q<database_cleaner>, ["~> 0.5.0"])
|
119
|
-
s.add_dependency(%q<activerecord>, ["~> 2.3.5"])
|
120
|
-
s.add_dependency(%q<friendly>, ["~> 0.6.0"])
|
121
|
-
s.add_dependency(%q<yajl-ruby>, ["~> 0.7.7"])
|
122
|
-
s.add_dependency(%q<memcached>, ["~> 0.20.1"])
|
123
|
-
s.add_dependency(%q<mysql>, ["~> 2.8.1"])
|
124
|
-
s.add_dependency(%q<rspec>, ["~> 2.1.0"])
|
125
|
-
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
126
|
-
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
127
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
128
|
-
s.add_dependency(%q<database_cleaner>, ["~> 0.5.0"])
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
data/spec/config.yml.example
DELETED
@@ -1,107 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe FriendlyAttributes::ClassMethods do
|
4
|
-
let(:friendly_model) { Class.new }
|
5
|
-
let(:ar_model) {
|
6
|
-
Class.new {
|
7
|
-
include ActiveRecordFake
|
8
|
-
extend FriendlyAttributes::ClassMethods
|
9
|
-
}
|
10
|
-
}
|
11
|
-
let(:initializer) { proc {} }
|
12
|
-
let(:details_delegator) { mock(FriendlyAttributes::DetailsDelegator) }
|
13
|
-
|
14
|
-
class FakeUploader; end
|
15
|
-
|
16
|
-
describe ".friendly_details" do
|
17
|
-
let(:options) do
|
18
|
-
{
|
19
|
-
String => :foo,
|
20
|
-
Integer => [:bar, :baz]
|
21
|
-
}
|
22
|
-
end
|
23
|
-
|
24
|
-
before(:each) do
|
25
|
-
details_delegator.stub(:delegated_attribute)
|
26
|
-
end
|
27
|
-
|
28
|
-
context "with an initializer block" do
|
29
|
-
it "instantiates a new DetailsDelegator" do
|
30
|
-
FriendlyAttributes::DetailsDelegator.should_receive(:new).with(friendly_model, ar_model, &initializer).and_return(details_delegator)
|
31
|
-
ar_model.friendly_details(friendly_model, &initializer).should == details_delegator
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context "with an initializer block and options" do
|
36
|
-
before(:each) do
|
37
|
-
FriendlyAttributes::DetailsDelegator.stub(:new => details_delegator)
|
38
|
-
end
|
39
|
-
|
40
|
-
def do_details
|
41
|
-
ar_model.friendly_details(friendly_model, options, &initializer).should == details_delegator
|
42
|
-
end
|
43
|
-
|
44
|
-
it "instantiates a new DetailsDelegator" do
|
45
|
-
FriendlyAttributes::DetailsDelegator.should_receive(:new).with(friendly_model, ar_model, &initializer).and_return(details_delegator)
|
46
|
-
do_details
|
47
|
-
end
|
48
|
-
|
49
|
-
it "delegates the attributes passed in the options" do
|
50
|
-
details_delegator.should_receive(:delegated_attribute).with(:foo, String)
|
51
|
-
details_delegator.should_receive(:delegated_attribute).with(:bar, Integer)
|
52
|
-
details_delegator.should_receive(:delegated_attribute).with(:baz, Integer)
|
53
|
-
do_details
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
context "without a block" do
|
58
|
-
it "instantiates a new DetailsDelegator" do
|
59
|
-
FriendlyAttributes::DetailsDelegator.should_receive(:new).with(friendly_model, ar_model).and_return(details_delegator)
|
60
|
-
ar_model.friendly_details(friendly_model, options).should == details_delegator
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe ".friendly_mount_uploader" do
|
66
|
-
let(:foo_value) { mock("Friendly attribute value") }
|
67
|
-
|
68
|
-
before(:each) do
|
69
|
-
ar_model.stub(:mount_uploader => nil)
|
70
|
-
|
71
|
-
foo = foo_value
|
72
|
-
|
73
|
-
ar_model.class_eval do
|
74
|
-
define_method(:read_friendly_attribute) do |attribute|
|
75
|
-
attribute.should == :foo
|
76
|
-
foo
|
77
|
-
end
|
78
|
-
|
79
|
-
define_method(:write_friendly_attribute) do |attribute, value|
|
80
|
-
value.tap do
|
81
|
-
attribute.should == :foo
|
82
|
-
value.should == foo
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
it "mounts the uploader" do
|
89
|
-
ar_model.should_receive(:mount_uploader).with(:foo, FakeUploader)
|
90
|
-
ar_model.friendly_mount_uploader :foo, FakeUploader
|
91
|
-
end
|
92
|
-
|
93
|
-
it "aliases #read_friendly_attribute to #read_uploader" do
|
94
|
-
ar_model.friendly_mount_uploader :foo, FakeUploader
|
95
|
-
ar_object = ar_model.new
|
96
|
-
|
97
|
-
ar_object.read_uploader(:foo).should == foo_value
|
98
|
-
end
|
99
|
-
|
100
|
-
it "aliases #read_friendly_attribute to #read_uploader" do
|
101
|
-
ar_model.friendly_mount_uploader :foo, FakeUploader
|
102
|
-
ar_object = ar_model.new
|
103
|
-
|
104
|
-
ar_object.write_uploader(:foo, foo_value).should == foo_value
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
@@ -1,129 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe FriendlyAttributes::DetailsDelegator do
|
4
|
-
let(:details_delegator) { FriendlyAttributes::DetailsDelegator.new(friendly_model, ar_model, &initializer) }
|
5
|
-
let(:initializer) { proc {} }
|
6
|
-
|
7
|
-
let(:friendly_model) { Class.new }
|
8
|
-
let(:ar_model) { Class.new { include ActiveRecordFake } }
|
9
|
-
|
10
|
-
let(:ar_instance) { ar_model.new(:id => 42) }
|
11
|
-
let(:friendly_instance) { mock(friendly_model) }
|
12
|
-
|
13
|
-
describe "initialization" do
|
14
|
-
shared_examples_for "DetailsDelegator initialization" do
|
15
|
-
context "the Friendly model" do
|
16
|
-
before(:each) do
|
17
|
-
details_delegator
|
18
|
-
end
|
19
|
-
|
20
|
-
it "includes Friendly::Document" do
|
21
|
-
friendly_model.ancestors.should include(Friendly::Document)
|
22
|
-
end
|
23
|
-
|
24
|
-
it "adds the active_record_id attribute" do
|
25
|
-
friendly_model.attributes.should include(:active_record_id)
|
26
|
-
end
|
27
|
-
|
28
|
-
it "adds an index to active_record_id" do
|
29
|
-
friendly_model.storage_proxy.index_for_fields([:active_record_id]).should be_an_instance_of(Friendly::Index)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
context "the ActiveRecord model" do
|
34
|
-
it "installs the update_friendly_details callback after_save" do
|
35
|
-
ar_model.should_receive(:after_save).with(:update_friendly_details)
|
36
|
-
details_delegator
|
37
|
-
end
|
38
|
-
|
39
|
-
it "installs the destroy_friendly_details callback after_destroy" do
|
40
|
-
ar_model.should_receive(:after_destroy).with(:destroy_friendly_details)
|
41
|
-
details_delegator
|
42
|
-
end
|
43
|
-
|
44
|
-
context ".details" do
|
45
|
-
before(:each) do
|
46
|
-
details_delegator
|
47
|
-
end
|
48
|
-
|
49
|
-
it "is defined" do
|
50
|
-
ar_instance.should respond_to(:details)
|
51
|
-
end
|
52
|
-
|
53
|
-
it "finds and memoizes the associated Friendly model" do
|
54
|
-
friendly_model.should_receive(:find_or_build_by_active_record_id).with(ar_instance.id).once.and_return(friendly_instance)
|
55
|
-
ar_instance.details.should == friendly_instance
|
56
|
-
ar_instance.details.should == friendly_instance
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
context "missing initialization block" do
|
63
|
-
let(:details_delegator) { FriendlyAttributes::DetailsDelegator.new(friendly_model, ar_model) }
|
64
|
-
it_should_behave_like "DetailsDelegator initialization"
|
65
|
-
end
|
66
|
-
|
67
|
-
context "with initialization block" do
|
68
|
-
it_should_behave_like "DetailsDelegator initialization"
|
69
|
-
|
70
|
-
context "the initialization block" do
|
71
|
-
def yielded_inside(instance)
|
72
|
-
@yielded_instance = instance
|
73
|
-
end
|
74
|
-
|
75
|
-
let(:initializer) do
|
76
|
-
example = self
|
77
|
-
|
78
|
-
proc {
|
79
|
-
example.yielded_inside(self)
|
80
|
-
}
|
81
|
-
end
|
82
|
-
|
83
|
-
it "is instance evaled" do
|
84
|
-
details_delegator
|
85
|
-
@yielded_instance.should == details_delegator
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
describe "#delegated_method" do
|
92
|
-
before(:each) do
|
93
|
-
details_delegator
|
94
|
-
details_delegator.delegated_method(:some_method)
|
95
|
-
ar_instance.stub(:details => friendly_instance)
|
96
|
-
end
|
97
|
-
|
98
|
-
it "delegates the method to Friendly model" do
|
99
|
-
bar = mock
|
100
|
-
friendly_instance.should_receive(:some_method).with(:foo).and_return(bar)
|
101
|
-
ar_instance.some_method(:foo).should == bar
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
describe "#delegated_attribute" do
|
106
|
-
before(:each) do
|
107
|
-
details_delegator
|
108
|
-
details_delegator.delegated_attribute(:some_attribute, String)
|
109
|
-
ar_instance.stub(:details => friendly_instance)
|
110
|
-
end
|
111
|
-
|
112
|
-
it "adds an attribute to the Friendly model" do
|
113
|
-
friendly_model.attributes.should include(:some_attribute)
|
114
|
-
friendly_model.attributes[:some_attribute].type.should == String
|
115
|
-
end
|
116
|
-
|
117
|
-
it "delegates the reader to Friendly model" do
|
118
|
-
bar = mock
|
119
|
-
friendly_instance.should_receive(:some_attribute).and_return(bar)
|
120
|
-
ar_instance.some_attribute.should == bar
|
121
|
-
end
|
122
|
-
|
123
|
-
it "delegates the writer to Friendly model" do
|
124
|
-
bar = mock
|
125
|
-
friendly_instance.should_receive(:some_attribute=).with(:value)
|
126
|
-
ar_instance.some_attribute = :value
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe FriendlyAttributes::Details do
|
4
|
-
use_database_cleanup
|
5
|
-
|
6
|
-
describe ".find_or_build_by_active_record_id" do
|
7
|
-
context "when the record does not exist" do
|
8
|
-
it "builds a new record with the active_record_id" do
|
9
|
-
details = UserDetails.find_or_build_by_active_record_id(42)
|
10
|
-
details.should be_new_record
|
11
|
-
details.active_record_id.should == 42
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
context "when the record exists" do
|
16
|
-
let(:details) { UserDetails.create(:active_record_id => 42) }
|
17
|
-
|
18
|
-
before(:each) do
|
19
|
-
details.should_not be_new_record
|
20
|
-
end
|
21
|
-
|
22
|
-
it "finds the record" do
|
23
|
-
UserDetails.find_or_build_by_active_record_id(42).should == details
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,113 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe FriendlyAttributes::InstanceMethods do
|
4
|
-
let(:object) { klass.new.tap { |o| o.stub(:details => details) } }
|
5
|
-
let(:klass) {
|
6
|
-
Class.new {
|
7
|
-
include ActiveRecordFake
|
8
|
-
include FriendlyAttributes::InstanceMethods
|
9
|
-
}
|
10
|
-
}
|
11
|
-
let(:details) { mock("details") }
|
12
|
-
|
13
|
-
describe "#read_friendly_attribute" do
|
14
|
-
it "reads the attribute from details" do
|
15
|
-
foo = mock
|
16
|
-
|
17
|
-
details.should_receive(:foo).and_return(foo)
|
18
|
-
object.read_friendly_attribute(:foo).should == foo
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe "#write_friendly_attribute" do
|
23
|
-
it "writes the attribute to details" do
|
24
|
-
foo = mock
|
25
|
-
|
26
|
-
details.should_receive(:foo=).with(:value)
|
27
|
-
object.write_friendly_attribute(:foo, :value)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
describe "#details_present?" do
|
32
|
-
subject { object.details_present? }
|
33
|
-
|
34
|
-
context "when @details is present" do
|
35
|
-
before(:each) do
|
36
|
-
object.instance_variable_set(:"@details", mock)
|
37
|
-
end
|
38
|
-
|
39
|
-
it { should be_true }
|
40
|
-
end
|
41
|
-
|
42
|
-
context "when @details is not present" do
|
43
|
-
it { should be_false }
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe "#update_friendly_details" do
|
48
|
-
context "details are present" do
|
49
|
-
before(:each) do
|
50
|
-
object.id = 42
|
51
|
-
object.should_receive(:details_present?).and_return(true)
|
52
|
-
details.stub(:changed? => false, :active_record_id => object.id)
|
53
|
-
end
|
54
|
-
|
55
|
-
context "details.active_record_id does not equal object.id" do
|
56
|
-
before(:each) do
|
57
|
-
details.should_receive(:active_record_id).and_return(nil)
|
58
|
-
end
|
59
|
-
|
60
|
-
it "sets the active_record_id" do
|
61
|
-
details.should_receive(:active_record_id=).with(object.id)
|
62
|
-
object.update_friendly_details
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
context "details.active_record_id equals object.id" do
|
67
|
-
before(:each) do
|
68
|
-
details.should_receive(:active_record_id).and_return(object.id)
|
69
|
-
end
|
70
|
-
|
71
|
-
it "sets the active_record_id" do
|
72
|
-
details.should_not_receive(:active_record_id=)
|
73
|
-
object.update_friendly_details
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
context "the details have changed" do
|
78
|
-
before(:each) do
|
79
|
-
details.should_receive(:changed?).and_return(true)
|
80
|
-
end
|
81
|
-
|
82
|
-
it "saves the details" do
|
83
|
-
details.should_receive(:save)
|
84
|
-
object.update_friendly_details
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
context "the details have NOT changed" do
|
89
|
-
before(:each) do
|
90
|
-
details.should_receive(:changed?).and_return(false)
|
91
|
-
end
|
92
|
-
|
93
|
-
it "saves the details" do
|
94
|
-
details.should_not_receive(:save)
|
95
|
-
object.update_friendly_details
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
context "details are NOT present" do
|
101
|
-
before(:each) do
|
102
|
-
object.should_receive(:details_present?).and_return(false)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
describe "#destroy_friendly_details" do
|
108
|
-
it "destroys the details" do
|
109
|
-
details.should_receive(:destroy)
|
110
|
-
object.destroy_friendly_details
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe FriendlyAttributes do
|
4
|
-
use_database_cleanup
|
5
|
-
|
6
|
-
describe "creating" do
|
7
|
-
context "with Friendly attributes" do
|
8
|
-
let(:user) { User.create(:name => "Stan", :email => "stan@example.com", :birth_year => 1984, :shoe_size => 42, :subscribed => true) }
|
9
|
-
|
10
|
-
it "creates an associated Details model with the AR model" do
|
11
|
-
expect do
|
12
|
-
user
|
13
|
-
end.to change { UserDetails.count({}) }
|
14
|
-
|
15
|
-
user_detail = user.details
|
16
|
-
user_detail.name.should == "Stan"
|
17
|
-
user_detail.birth_year.should == 1984
|
18
|
-
user_detail.shoe_size.should == 42
|
19
|
-
user_detail.subscribed.should be_true
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
context "without Friendly attributes" do
|
24
|
-
let(:user) { User.create(:email => "stan@example.com") }
|
25
|
-
|
26
|
-
it "does not create an associated Details model" do
|
27
|
-
expect do
|
28
|
-
user
|
29
|
-
end.to_not change { UserDetails.count({}) }
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe "updating" do
|
35
|
-
context "with Friendly attributes" do
|
36
|
-
let(:user) { User.create(:name => "Stan", :email => "stan@example.com") }
|
37
|
-
|
38
|
-
it "updates the attributes" do
|
39
|
-
user.update_attributes(:name => "Eric")
|
40
|
-
UserDetails.first({}).name.should == "Eric"
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
context "without Friendly attributes" do
|
45
|
-
let(:user) { User.create(:email => "stan@example.com") }
|
46
|
-
|
47
|
-
it "does not create an associated Details model, if no delegated attributes are updated" do
|
48
|
-
expect do
|
49
|
-
user.update_attributes(:email => "eric@example.com")
|
50
|
-
end.to_not change { UserDetails.count({}) }
|
51
|
-
end
|
52
|
-
|
53
|
-
it "creates an associated Details model, if delegated attributes are updated" do
|
54
|
-
expect do
|
55
|
-
user.update_attributes(:name => "Eric")
|
56
|
-
end.to change { UserDetails.count({}) }
|
57
|
-
user.name.should == "Eric"
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
describe "destroying" do
|
63
|
-
let(:user) { User.create(:name => "Stan", :email => "stan@example.com") }
|
64
|
-
|
65
|
-
it "destroys the associated Details model" do
|
66
|
-
user # create it first
|
67
|
-
|
68
|
-
expect do
|
69
|
-
user.destroy
|
70
|
-
end.to change { UserDetails.count({}) }.by(-1)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
-
require 'rspec'
|
4
|
-
require 'memcached'
|
5
|
-
require 'yajl'
|
6
|
-
require 'friendly_attributes'
|
7
|
-
require 'database_cleaner'
|
8
|
-
|
9
|
-
# Requires supporting files with custom matchers and macros, etc,
|
10
|
-
# in ./support/ and its subdirectories.
|
11
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
12
|
-
|
13
|
-
RSpec.configure do |config|
|
14
|
-
yaml = YAML.load(File.read(File.dirname(__FILE__) + "/config.yml"))
|
15
|
-
Friendly.configure yaml['test']
|
16
|
-
|
17
|
-
$db = Friendly.db
|
18
|
-
|
19
|
-
%w[user_details index_user_details_on_active_record_id].each do |table|
|
20
|
-
$db.drop_table(table) if $db.table_exists?(table)
|
21
|
-
end
|
22
|
-
|
23
|
-
datastore = Friendly::DataStore.new($db)
|
24
|
-
Friendly.datastore = datastore
|
25
|
-
$cache = Memcached.new
|
26
|
-
Friendly.cache = Friendly::Memcached.new($cache)
|
27
|
-
|
28
|
-
ActiveRecord::Base.logger = Friendly.db.logger = Logger.new(File.dirname(__FILE__) + "/../log/test.log")
|
29
|
-
|
30
|
-
ActiveRecord::Base.configurations = yaml
|
31
|
-
ActiveRecord::Base.establish_connection 'test'
|
32
|
-
ActiveRecord::Schema.define do
|
33
|
-
create_table :users, :force => true do |t|
|
34
|
-
t.string :email
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
class ::UserDetails < FriendlyAttributes::Details
|
39
|
-
end
|
40
|
-
|
41
|
-
class ::User < ActiveRecord::Base
|
42
|
-
include FriendlyAttributes
|
43
|
-
|
44
|
-
friendly_details(UserDetails, { Integer => [:birth_year, :shoe_size], Friendly::Boolean => :subscribed }) do
|
45
|
-
delegated_attribute :name, String
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
Friendly::Document.create_tables!
|
50
|
-
|
51
|
-
DatabaseCleaner.strategy = :truncation
|
52
|
-
DatabaseCleaner.clean_with(:truncation)
|
53
|
-
|
54
|
-
config.extend DatabaseCleanerHelpers
|
55
|
-
end
|
56
|
-
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module ActiveRecordFake
|
2
|
-
def self.included(base)
|
3
|
-
base.instance_eval do
|
4
|
-
attr_accessor :id
|
5
|
-
end
|
6
|
-
|
7
|
-
(class << base; self; end).class_eval do
|
8
|
-
def after_save(*args); end
|
9
|
-
def after_destroy(*args); end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def initialize(attributes={})
|
14
|
-
attributes.each do |k, v|
|
15
|
-
send(:"#{k}=", v)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|