dm-taggings 0.11.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.rspec +2 -0
- data/Gemfile +25 -100
- data/Rakefile +6 -7
- data/VERSION +1 -1
- data/dm-taggings.gemspec +57 -54
- data/lib/dm-taggings.rb +5 -5
- data/lib/dm-taggings/is/taggable.rb +37 -35
- data/lib/dm-taggings/is/tagger.rb +12 -6
- data/lib/dm-taggings/is/tagging.rb +3 -3
- data/lib/dm-taggings/spec/taggable_shared_spec.rb +108 -114
- data/lib/dm-taggings/spec/tagger_shared_spec.rb +16 -15
- data/spec/fixtures/models.rb +28 -25
- data/spec/integration/post_spec.rb +5 -5
- data/spec/integration/tag_spec.rb +1 -1
- data/spec/integration/taggable_spec.rb +4 -4
- data/spec/integration/user_spec.rb +5 -8
- data/spec/spec_helper.rb +11 -1
- metadata +47 -50
- data/.gitignore +0 -9
- data/spec/spec.opts +0 -2
data/.rspec
ADDED
data/Gemfile
CHANGED
@@ -1,106 +1,23 @@
|
|
1
|
-
|
2
|
-
# recommended to create a local Gemfile and use this instead of the git
|
3
|
-
# sources. This will make sure that you are developing against your
|
4
|
-
# other local datamapper sources that you currently work on. Gemfile.local
|
5
|
-
# will behave identically to the standard Gemfile apart from the fact that
|
6
|
-
# it fetches the datamapper gems from local paths. This means that you can use
|
7
|
-
# the same environment variables, like ADAPTER(S) or PLUGIN(S) when running
|
8
|
-
# bundle commands. Gemfile.local is added to .gitignore, so you don't need to
|
9
|
-
# worry about accidentally checking local development paths into git.
|
10
|
-
# In order to create a local Gemfile, all you need to do is run:
|
11
|
-
#
|
12
|
-
# bundle exec rake local_gemfile
|
13
|
-
#
|
14
|
-
# This will give you a Gemfile.local file that points to your local clones of
|
15
|
-
# the various datamapper gems. It's assumed that all datamapper repo clones
|
16
|
-
# reside in the same directory. You can use the Gemfile.local like so for
|
17
|
-
# running any bundle command:
|
18
|
-
#
|
19
|
-
# BUNDLE_GEMFILE=Gemfile.local bundle foo
|
20
|
-
#
|
21
|
-
# You can also specify which adapter(s) should be part of the bundle by setting
|
22
|
-
# an environment variable. This of course also works when using the Gemfile.local
|
23
|
-
#
|
24
|
-
# bundle foo # dm-sqlite-adapter
|
25
|
-
# ADAPTER=mysql bundle foo # dm-mysql-adapter
|
26
|
-
# ADAPTERS=sqlite,mysql bundle foo # dm-sqlite-adapter and dm-mysql-adapter
|
27
|
-
#
|
28
|
-
# Of course you can also use the ADAPTER(S) variable when using the Gemfile.local
|
29
|
-
# and running specs against selected adapters.
|
30
|
-
#
|
31
|
-
# For easily working with adapters supported on your machine, it's recommended
|
32
|
-
# that you first install all adapters that you are planning to use or work on
|
33
|
-
# by doing something like
|
34
|
-
#
|
35
|
-
# ADAPTERS=sqlite,mysql,postgres bundle install
|
36
|
-
#
|
37
|
-
# This will clone the various repositories and make them available to bundler.
|
38
|
-
# Once you have them installed you can easily switch between adapters for the
|
39
|
-
# various development tasks. Running something like
|
40
|
-
#
|
41
|
-
# ADAPTER=mysql bundle exec rake spec
|
42
|
-
#
|
43
|
-
# will make sure that the dm-mysql-adapter is part of the bundle, and will be used
|
44
|
-
# when running the specs.
|
45
|
-
#
|
46
|
-
# You can also specify which plugin(s) should be part of the bundle by setting
|
47
|
-
# an environment variable. This also works when using the Gemfile.local
|
48
|
-
#
|
49
|
-
# bundle foo # dm-migrations
|
50
|
-
# PLUGINS=dm-validations bundle foo # dm-migrations and dm-validations
|
51
|
-
# PLUGINS=dm-validations,dm-types bundle foo # dm-migrations, dm-validations and dm-types
|
52
|
-
#
|
53
|
-
# Of course you can combine the PLUGIN(S) and ADAPTER(S) env vars to run specs
|
54
|
-
# for certain adapter/plugin combinations.
|
55
|
-
#
|
56
|
-
# Finally, to speed up running specs and other tasks, it's recommended to run
|
57
|
-
#
|
58
|
-
# bundle lock
|
59
|
-
#
|
60
|
-
# after running 'bundle install' for the first time. This will make 'bundle exec' run
|
61
|
-
# a lot faster compared to the unlocked version. With an unlocked bundle you would
|
62
|
-
# typically just run 'bundle install' from time to time to fetch the latest sources from
|
63
|
-
# upstream. When you locked your bundle, you need to run
|
64
|
-
#
|
65
|
-
# bundle install --relock
|
66
|
-
#
|
67
|
-
# to make sure to fetch the latest updates and then lock the bundle again. Gemfile.lock
|
68
|
-
# is added to the .gitignore file, so you don't need to worry about accidentally checking
|
69
|
-
# it into version control.
|
1
|
+
require 'pathname'
|
70
2
|
|
71
3
|
source 'http://rubygems.org'
|
72
4
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
if ENV['EXTLIB']
|
79
|
-
gem 'extlib', '~> 0.9.15', :git => "#{DATAMAPPER}/extlib.git"
|
80
|
-
else
|
81
|
-
gem 'activesupport', '~> 3.0.0', :git => 'git://github.com/rails/rails.git', :branch => '3-0-stable', :require => nil
|
82
|
-
end
|
83
|
-
|
84
|
-
gem 'dm-core', DM_VERSION, :git => "#{DATAMAPPER}/dm-core.git"
|
85
|
-
gem 'dm-constraints', DM_VERSION, :git => "#{DATAMAPPER}/dm-constraints.git"
|
86
|
-
gem 'dm-is-remixable', DM_VERSION, :git => "#{DATAMAPPER}/dm-is-remixable.git"
|
87
|
-
|
88
|
-
end
|
5
|
+
SOURCE = ENV['SOURCE'] ? ENV['SOURCE'].to_sym : :git
|
6
|
+
REPO_POSTFIX = SOURCE == :path ? '' : '.git'
|
7
|
+
DATAMAPPER = SOURCE == :path ? Pathname(__FILE__).dirname.parent : 'http://github.com/datamapper'
|
8
|
+
DM_VERSION = '~> 1.1.0'
|
89
9
|
|
90
10
|
group(:development) do # Development dependencies (as in the gemspec)
|
91
11
|
|
92
|
-
gem 'rake',
|
93
|
-
gem 'rspec',
|
94
|
-
gem 'jeweler',
|
12
|
+
gem 'rake', '~> 0.8.7'
|
13
|
+
gem 'rspec', '~> 2.4', :require => false
|
14
|
+
gem 'jeweler', '~> 1.5.2'
|
95
15
|
|
96
16
|
end
|
97
17
|
|
98
18
|
group :quality do # These gems contain rake tasks that check the quality of the source code
|
99
19
|
|
100
|
-
gem '
|
101
|
-
gem 'rcov', '~> 0.9.8'
|
102
|
-
gem 'reek', '~> 1.2.8'
|
103
|
-
gem 'roodi', '~> 2.1'
|
20
|
+
gem 'rcov', '~> 0.9.7', :platforms => :mri_18
|
104
21
|
gem 'yard', '~> 0.5'
|
105
22
|
gem 'yardstick', '~> 0.1'
|
106
23
|
|
@@ -108,15 +25,17 @@ end
|
|
108
25
|
|
109
26
|
group :datamapper do # We need this because we want to pin these dependencies to their git master sources
|
110
27
|
|
111
|
-
|
112
|
-
|
28
|
+
gem 'dm-taggings', '~> 1.0.0', :path => File.dirname(__FILE__) # Make ourself available to the adapters
|
29
|
+
|
30
|
+
adapters = ENV['ADAPTERS'] || ENV['ADAPTER'] || 'in_memory'
|
31
|
+
adapters = adapters.to_s.tr(',', ' ').split.uniq
|
113
32
|
|
114
33
|
DO_VERSION = '~> 0.10.2'
|
115
34
|
DM_DO_ADAPTERS = %w[ sqlite postgres mysql oracle sqlserver ]
|
116
35
|
|
117
36
|
if (do_adapters = DM_DO_ADAPTERS & adapters).any?
|
118
37
|
options = {}
|
119
|
-
options[:git] = "#{DATAMAPPER}/do
|
38
|
+
options[:git] = "#{DATAMAPPER}/do#{REPO_POSTFIX}" if ENV['DO_GIT'] == 'true'
|
120
39
|
|
121
40
|
gem 'data_objects', DO_VERSION, options.dup
|
122
41
|
|
@@ -125,18 +44,24 @@ group :datamapper do # We need this because we want to pin these dependencies to
|
|
125
44
|
gem "do_#{adapter}", DO_VERSION, options.dup
|
126
45
|
end
|
127
46
|
|
128
|
-
gem 'dm-do-adapter', DM_VERSION,
|
47
|
+
gem 'dm-do-adapter', DM_VERSION, SOURCE => "#{DATAMAPPER}/dm-do-adapter#{REPO_POSTFIX}"
|
129
48
|
end
|
130
49
|
|
131
50
|
adapters.each do |adapter|
|
132
|
-
|
51
|
+
unless adapter == 'in_memory'
|
52
|
+
gem "dm-#{adapter}-adapter", DM_VERSION, SOURCE => "#{DATAMAPPER}/dm-#{adapter}-adapter#{REPO_POSTFIX}"
|
53
|
+
end
|
133
54
|
end
|
134
55
|
|
135
56
|
plugins = ENV['PLUGINS'] || ENV['PLUGIN']
|
136
|
-
plugins = plugins.to_s.tr(',', ' ').split.push('dm-
|
57
|
+
plugins = plugins.to_s.tr(',', ' ').split.push('dm-core').uniq
|
58
|
+
|
59
|
+
%w(dm-migrations dm-validations dm-constraints dm-is-remixable).each do |plugin|
|
60
|
+
plugins.push(plugin)
|
61
|
+
end
|
137
62
|
|
138
|
-
plugins.each do |plugin|
|
139
|
-
gem plugin, DM_VERSION,
|
63
|
+
plugins.uniq.each do |plugin|
|
64
|
+
gem plugin, DM_VERSION, SOURCE => "#{DATAMAPPER}/#{plugin}#{REPO_POSTFIX}"
|
140
65
|
end
|
141
66
|
|
142
67
|
end
|
data/Rakefile
CHANGED
@@ -10,26 +10,25 @@ end
|
|
10
10
|
|
11
11
|
Bundler.require(:default, :development)
|
12
12
|
|
13
|
-
|
14
13
|
begin
|
15
|
-
|
16
14
|
require 'rake'
|
15
|
+
|
16
|
+
gem 'jeweler', '~> 1.5.2'
|
17
17
|
require 'jeweler'
|
18
18
|
|
19
19
|
Jeweler::Tasks.new do |gem|
|
20
20
|
|
21
21
|
gem.name = 'dm-taggings'
|
22
22
|
gem.summary = 'Tagging plugin for DataMapper'
|
23
|
-
gem.description = 'DataMapper plugin
|
23
|
+
gem.description = 'DataMapper plugin providing taggable and tagger models'
|
24
24
|
gem.email = 'piotr.solnica@gmail.com'
|
25
25
|
gem.homepage = 'http://github.com/solnic/dm-taggings'
|
26
26
|
gem.authors = [ 'Piotr Solnica' ]
|
27
27
|
|
28
|
-
gem.add_dependency 'dm-
|
29
|
-
gem.add_dependency 'dm-
|
30
|
-
gem.add_dependency 'dm-is-remixable', '~> 1.0.2'
|
28
|
+
gem.add_dependency 'dm-constraints', '~> 1.1.0'
|
29
|
+
gem.add_dependency 'dm-is-remixable', '~> 1.1.0'
|
31
30
|
|
32
|
-
gem.add_development_dependency 'rspec', '~>
|
31
|
+
gem.add_development_dependency 'rspec', '~> 2.4'
|
33
32
|
gem.add_development_dependency 'yard', '~> 0.5'
|
34
33
|
|
35
34
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
1.0.0
|
data/dm-taggings.gemspec
CHANGED
@@ -1,88 +1,91 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{dm-taggings}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "1.0.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Piotr Solnica"]
|
12
|
-
s.date = %q{
|
13
|
-
s.description = %q{DataMapper plugin
|
12
|
+
s.date = %q{2011-03-17}
|
13
|
+
s.description = %q{DataMapper plugin providing taggable and tagger models}
|
14
14
|
s.email = %q{piotr.solnica@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
|
-
|
18
|
-
|
17
|
+
"README.rdoc",
|
18
|
+
"TODO"
|
19
19
|
]
|
20
20
|
s.files = [
|
21
|
-
".
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
"tasks/yardstick.rake"
|
21
|
+
".rspec",
|
22
|
+
"Gemfile",
|
23
|
+
"History.txt",
|
24
|
+
"LICENSE",
|
25
|
+
"Manifest.txt",
|
26
|
+
"README.rdoc",
|
27
|
+
"Rakefile",
|
28
|
+
"TODO",
|
29
|
+
"VERSION",
|
30
|
+
"dm-taggings.gemspec",
|
31
|
+
"lib/dm-taggings.rb",
|
32
|
+
"lib/dm-taggings/is/tag.rb",
|
33
|
+
"lib/dm-taggings/is/taggable.rb",
|
34
|
+
"lib/dm-taggings/is/tagger.rb",
|
35
|
+
"lib/dm-taggings/is/tagging.rb",
|
36
|
+
"lib/dm-taggings/is/version.rb",
|
37
|
+
"lib/dm-taggings/spec/taggable_shared_spec.rb",
|
38
|
+
"lib/dm-taggings/spec/tagger_shared_spec.rb",
|
39
|
+
"spec/fixtures/models.rb",
|
40
|
+
"spec/integration/post_spec.rb",
|
41
|
+
"spec/integration/tag_spec.rb",
|
42
|
+
"spec/integration/taggable_spec.rb",
|
43
|
+
"spec/integration/user_spec.rb",
|
44
|
+
"spec/spec_helper.rb",
|
45
|
+
"tasks/hoe.rb",
|
46
|
+
"tasks/yard.rake",
|
47
|
+
"tasks/yardstick.rake"
|
49
48
|
]
|
50
49
|
s.homepage = %q{http://github.com/solnic/dm-taggings}
|
51
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
52
50
|
s.require_paths = ["lib"]
|
53
|
-
s.rubygems_version = %q{1.
|
51
|
+
s.rubygems_version = %q{1.6.2}
|
54
52
|
s.summary = %q{Tagging plugin for DataMapper}
|
55
53
|
s.test_files = [
|
54
|
+
"spec/fixtures/models.rb",
|
55
|
+
"spec/integration/post_spec.rb",
|
56
|
+
"spec/integration/tag_spec.rb",
|
56
57
|
"spec/integration/taggable_spec.rb",
|
57
|
-
|
58
|
-
|
59
|
-
"spec/integration/user_spec.rb",
|
60
|
-
"spec/fixtures/models.rb",
|
61
|
-
"spec/spec_helper.rb"
|
58
|
+
"spec/integration/user_spec.rb",
|
59
|
+
"spec/spec_helper.rb"
|
62
60
|
]
|
63
61
|
|
64
62
|
if s.respond_to? :specification_version then
|
65
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
66
63
|
s.specification_version = 3
|
67
64
|
|
68
65
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
69
|
-
s.
|
70
|
-
s.
|
71
|
-
s.
|
72
|
-
s.
|
66
|
+
s.add_development_dependency(%q<rake>, ["~> 0.8.7"])
|
67
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.4"])
|
68
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
69
|
+
s.add_runtime_dependency(%q<dm-constraints>, ["~> 1.1.0"])
|
70
|
+
s.add_runtime_dependency(%q<dm-is-remixable>, ["~> 1.1.0"])
|
71
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.4"])
|
73
72
|
s.add_development_dependency(%q<yard>, ["~> 0.5"])
|
74
73
|
else
|
75
|
-
s.add_dependency(%q<
|
76
|
-
s.add_dependency(%q<
|
77
|
-
s.add_dependency(%q<
|
78
|
-
s.add_dependency(%q<
|
74
|
+
s.add_dependency(%q<rake>, ["~> 0.8.7"])
|
75
|
+
s.add_dependency(%q<rspec>, ["~> 2.4"])
|
76
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
77
|
+
s.add_dependency(%q<dm-constraints>, ["~> 1.1.0"])
|
78
|
+
s.add_dependency(%q<dm-is-remixable>, ["~> 1.1.0"])
|
79
|
+
s.add_dependency(%q<rspec>, ["~> 2.4"])
|
79
80
|
s.add_dependency(%q<yard>, ["~> 0.5"])
|
80
81
|
end
|
81
82
|
else
|
82
|
-
s.add_dependency(%q<
|
83
|
-
s.add_dependency(%q<
|
84
|
-
s.add_dependency(%q<
|
85
|
-
s.add_dependency(%q<
|
83
|
+
s.add_dependency(%q<rake>, ["~> 0.8.7"])
|
84
|
+
s.add_dependency(%q<rspec>, ["~> 2.4"])
|
85
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
86
|
+
s.add_dependency(%q<dm-constraints>, ["~> 1.1.0"])
|
87
|
+
s.add_dependency(%q<dm-is-remixable>, ["~> 1.1.0"])
|
88
|
+
s.add_dependency(%q<rspec>, ["~> 2.4"])
|
86
89
|
s.add_dependency(%q<yard>, ["~> 0.5"])
|
87
90
|
end
|
88
91
|
end
|
data/lib/dm-taggings.rb
CHANGED
@@ -7,12 +7,12 @@ require 'dm-is-remixable'
|
|
7
7
|
|
8
8
|
# Require plugin-files
|
9
9
|
|
10
|
-
dir =
|
10
|
+
dir = File.dirname(__FILE__) + '/dm-taggings/is/'
|
11
11
|
|
12
|
-
require dir
|
13
|
-
require dir
|
14
|
-
require dir
|
15
|
-
require dir
|
12
|
+
require dir + 'taggable.rb'
|
13
|
+
require dir + 'tag.rb'
|
14
|
+
require dir + 'tagging.rb'
|
15
|
+
require dir + 'tagger.rb'
|
16
16
|
|
17
17
|
# Include the plugin in Resource
|
18
18
|
DataMapper::Model.append_extensions DataMapper::Is::Taggable
|
@@ -31,39 +31,46 @@ module DataMapper
|
|
31
31
|
|
32
32
|
class << self
|
33
33
|
attr_reader :tagging_parent_name, :tagging_relationship_name, :tagging_relationship,
|
34
|
-
:tagging_class, :taggable_relationship_name
|
34
|
+
:tagging_class, :taggable_relationship_name, :taggable_options
|
35
35
|
end
|
36
36
|
|
37
|
+
# set up options hash
|
38
|
+
@taggable_options = {}
|
39
|
+
@taggable_options[:tag_list_separator] = options.fetch(:tag_list_separator, ',')
|
40
|
+
|
37
41
|
# Make the magic happen
|
38
42
|
options[:by] ||= []
|
39
43
|
|
40
|
-
remix n, :taggings
|
44
|
+
remix n, :taggings, :constraint => :destroy!
|
45
|
+
|
46
|
+
inflector = DataMapper::Inflector
|
41
47
|
|
42
|
-
@tagging_parent_name =
|
48
|
+
@tagging_parent_name = inflector.underscore(inflector.demodulize(name)).to_sym
|
43
49
|
@tagging_relationship_name = "#{@tagging_parent_name}_tags".to_sym
|
44
50
|
@tagging_relationship = relationships[@tagging_relationship_name]
|
45
51
|
@tagging_class = @tagging_relationship.child_model
|
46
52
|
|
47
|
-
@taggable_relationship_name =
|
53
|
+
@taggable_relationship_name = inflector.pluralize(inflector.underscore(inflector.demodulize(name))).to_sym
|
48
54
|
|
49
55
|
@tagging_relationship.add_constraint_option(
|
50
56
|
@taggable_relationship_name, @tagging_class, self, :constraint => :destroy!)
|
51
57
|
|
52
58
|
tagging_parent_name = @tagging_parent_name
|
59
|
+
model_name = name
|
53
60
|
|
54
61
|
enhance :taggings do
|
55
62
|
belongs_to :tag
|
56
|
-
belongs_to tagging_parent_name
|
63
|
+
belongs_to tagging_parent_name, model_name
|
57
64
|
|
58
65
|
options[:by].each do |tagger_class|
|
59
|
-
belongs_to
|
66
|
+
belongs_to inflector.underscore(inflector.demodulize(tagger_class.name)), tagger_class.name, :required => false
|
60
67
|
end
|
61
68
|
end
|
62
69
|
|
63
|
-
has n, :tags, :through => @tagging_relationship_name
|
70
|
+
has n, :tags, :through => @tagging_relationship_name
|
64
71
|
|
65
|
-
Tag.has n, @tagging_relationship_name, :constraint => :destroy!
|
66
|
-
Tag.has n, @taggable_relationship_name, :through => @tagging_relationship_name
|
72
|
+
Tag.has n, @tagging_relationship_name, :model => tagging_class, :constraint => :destroy!
|
73
|
+
Tag.has n, @taggable_relationship_name, :model => name, :through => @tagging_relationship_name
|
67
74
|
|
68
75
|
options[:by].each do |tagger_class|
|
69
76
|
tagger_class.is :tagger, :for => [self]
|
@@ -119,14 +126,8 @@ module DataMapper
|
|
119
126
|
#
|
120
127
|
# @api public
|
121
128
|
def tag(tags_or_names)
|
122
|
-
|
123
|
-
|
124
|
-
tags.each do |tag|
|
125
|
-
next if self.tags.include?(tag)
|
126
|
-
taggings.new(:tag => tag)
|
127
|
-
end
|
128
|
-
|
129
|
-
taggings
|
129
|
+
tags_to_add = extract_tags_from_names(tags_or_names) - tags
|
130
|
+
tags.push(*tags_to_add)
|
130
131
|
end
|
131
132
|
|
132
133
|
# Add tags to a resource and persists them.
|
@@ -139,9 +140,9 @@ module DataMapper
|
|
139
140
|
#
|
140
141
|
# @api public
|
141
142
|
def tag!(tags_or_names)
|
142
|
-
|
143
|
-
|
144
|
-
|
143
|
+
added_tags = tag(tags_or_names)
|
144
|
+
save unless new?
|
145
|
+
added_tags
|
145
146
|
end
|
146
147
|
|
147
148
|
# Delete given tags from a resource collection without actually deleting
|
@@ -155,17 +156,13 @@ module DataMapper
|
|
155
156
|
#
|
156
157
|
# @api public
|
157
158
|
def untag(tags_or_names=nil)
|
158
|
-
|
159
|
-
|
160
|
-
taggings_to_destroy = if tags.blank?
|
161
|
-
taggings.all
|
159
|
+
tags_to_remove = if tags_or_names
|
160
|
+
extract_tags_from_names(tags_or_names)
|
162
161
|
else
|
163
|
-
|
162
|
+
tags.dup
|
164
163
|
end
|
165
164
|
|
166
|
-
|
167
|
-
|
168
|
-
taggings_to_destroy
|
165
|
+
tags_to_remove.each { |tag| tags.delete(tag) }
|
169
166
|
end
|
170
167
|
|
171
168
|
# Same as untag but actually delete the tags from the datastore.
|
@@ -178,9 +175,9 @@ module DataMapper
|
|
178
175
|
#
|
179
176
|
# @api public
|
180
177
|
def untag!(tags_or_names=nil)
|
181
|
-
|
182
|
-
|
183
|
-
|
178
|
+
removed_tags = untag(tags_or_names)
|
179
|
+
save unless new?
|
180
|
+
removed_tags
|
184
181
|
end
|
185
182
|
|
186
183
|
# Return a string representation of tags collection
|
@@ -190,7 +187,7 @@ module DataMapper
|
|
190
187
|
#
|
191
188
|
# @api public
|
192
189
|
def tag_list
|
193
|
-
@tag_list ||= tags.collect { |tag| tag.name }.join("
|
190
|
+
@tag_list ||= tags.collect { |tag| tag.name }.join("#{self.class.taggable_options[:tag_list_separator]} ")
|
194
191
|
end
|
195
192
|
|
196
193
|
# Tag a resource using tag names from the give list separated by commas.
|
@@ -200,14 +197,19 @@ module DataMapper
|
|
200
197
|
#
|
201
198
|
# @return [DataMapper::Associations::OneToMany::Collection]
|
202
199
|
# A DataMapper collection of resource's tags
|
200
|
+
#
|
201
|
+
# @api public
|
203
202
|
def tag_list=(list)
|
204
203
|
@tag_list = list
|
205
204
|
|
206
|
-
tag_names = list.split(
|
205
|
+
tag_names = list.split(self.class.taggable_options[:tag_list_separator]).map do |name|
|
206
|
+
name.strip!
|
207
|
+
name.size == 0 ? nil : name
|
208
|
+
end.compact
|
207
209
|
|
208
|
-
old_tag_names =
|
210
|
+
old_tag_names = tags.map { |tag| tag.name } - tag_names
|
209
211
|
|
210
|
-
untag
|
212
|
+
untag(old_tag_names)
|
211
213
|
tag(tag_names)
|
212
214
|
end
|
213
215
|
|