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 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