friendly-attributes 0.2.0 → 0.3.1
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/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
|