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 CHANGED
@@ -1,6 +1,10 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
- ### 0.2.0
4
+ ### 0.3.1
5
+
6
+ * (ihoka) added spec matchers
7
+
8
+ ### 0.3.0
5
9
 
6
10
  * (ihoka) Extended the DSL to allow passing a hash of options when defining friendly_attributes.
@@ -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: 23
4
+ hash: 17
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 0
10
- version: 0.2.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
- - spec/config.yml.example
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
- - spec/friendly_attributes/class_methods_spec.rb
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
@@ -1,5 +0,0 @@
1
- lib/**/*.rb
2
- bin/*
3
- -
4
- features/**/*.feature
5
- LICENSE.txt
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
@@ -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
-
@@ -1,6 +0,0 @@
1
- test:
2
- :adapter: "mysql"
3
- :host: "localhost"
4
- :user: "root"
5
- :password:
6
- :database: "friendly_attributes_test"
@@ -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
@@ -1,11 +0,0 @@
1
- module DatabaseCleanerHelpers
2
- def use_database_cleanup
3
- before(:each) do
4
- DatabaseCleaner.start
5
- end
6
-
7
- after(:each) do
8
- DatabaseCleaner.clean
9
- end
10
- end
11
- end