dm-taggings 0.11.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|