radiant-taggable-extension 1.2.5 → 2.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -1,60 +1,47 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: radiant-taggable-extension
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
5
- prerelease: false
4
+ hash: 15424087
5
+ prerelease: 6
6
6
  segments:
7
- - 1
8
7
  - 2
9
- - 5
10
- version: 1.2.5
8
+ - 0
9
+ - 0
10
+ - rc
11
+ - 1
12
+ version: 2.0.0.rc1
11
13
  platform: ruby
12
14
  authors:
13
- - spanner
15
+ - William Ross
14
16
  autorequire:
15
17
  bindir: bin
16
18
  cert_chain: []
17
19
 
18
- date: 2011-04-12 00:00:00 +01:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
22
- name: radiant
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 59
30
- segments:
31
- - 0
32
- - 9
33
- - 0
34
- version: 0.9.0
35
- type: :runtime
36
- version_requirements: *id001
37
- description: "General purpose tagging extension: more versatile but less focused than the tags extension"
38
- email: will@spanner.org
20
+ date: 2011-07-05 00:00:00 Z
21
+ dependencies: []
22
+
23
+ description: "General purpose tagging and retrieval extension: more versatile but less focused than the tags extension. A good way to support faceted search."
24
+ email:
25
+ - radiant@spanner.org
39
26
  executables: []
40
27
 
41
28
  extensions: []
42
29
 
43
- extra_rdoc_files:
44
- - README.md
30
+ extra_rdoc_files: []
31
+
45
32
  files:
46
- - .gitignore
47
- - README.md
48
- - Rakefile
49
- - VERSION
50
33
  - app/controllers/admin/taggings_controller.rb
51
34
  - app/controllers/admin/tags_controller.rb
52
35
  - app/helpers/taggable_helper.rb
36
+ - app/models/library_page.rb
53
37
  - app/models/tag.rb
54
38
  - app/models/tagging.rb
39
+ - app/views/admin/assets/_edit_metadata.html.haml
40
+ - app/views/admin/assets/_edit_title.html.haml
55
41
  - app/views/admin/pages/_edit_title.html.haml
56
42
  - app/views/admin/tags/_form.html.haml
57
43
  - app/views/admin/tags/_search_results.html.haml
44
+ - app/views/admin/tags/_show_assets.html.haml
58
45
  - app/views/admin/tags/cloud.html.haml
59
46
  - app/views/admin/tags/edit.html.haml
60
47
  - app/views/admin/tags/index.html.haml
@@ -66,13 +53,18 @@ files:
66
53
  - db/migrate/002_import_keywords.rb
67
54
  - db/migrate/20110316210834_structural_tags.rb
68
55
  - db/migrate/20110411075109_metaphones.rb
56
+ - lib/link_renderer.rb
69
57
  - lib/natcmp.rb
70
58
  - lib/radiant-taggable-extension.rb
71
- - lib/taggable_admin_page_controller.rb
72
- - lib/taggable_admin_ui.rb
73
- - lib/taggable_model.rb
74
- - lib/taggable_page.rb
75
- - lib/taggable_tags.rb
59
+ - lib/radius/asset_tags.rb
60
+ - lib/radius/library_tags.rb
61
+ - lib/radius/taggable_tags.rb
62
+ - lib/taggable/admin_pages_controller.rb
63
+ - lib/taggable/admin_ui.rb
64
+ - lib/taggable/asset.rb
65
+ - lib/taggable/model.rb
66
+ - lib/taggable/page.rb
67
+ - lib/taggable/site_controller.rb
76
68
  - lib/tasks/taggable_extension_tasks.rake
77
69
  - lib/text/double_metaphone.rb
78
70
  - lib/text/metaphone.rb
@@ -83,20 +75,23 @@ files:
83
75
  - public/stylesheets/sass/admin/taggable.sass
84
76
  - public/stylesheets/sass/tagcloud.sass
85
77
  - radiant-taggable-extension.gemspec
78
+ - Rakefile
79
+ - README.md
80
+ - spec/controllers/site_controller_spec.rb
86
81
  - spec/datasets/tag_sites_dataset.rb
87
82
  - spec/datasets/tags_dataset.rb
88
83
  - spec/lib/taggable_page_spec.rb
84
+ - spec/models/library_page_spec.rb
89
85
  - spec/models/tag_spec.rb
90
86
  - spec/spec.opts
91
87
  - spec/spec_helper.rb
92
88
  - taggable_extension.rb
93
- has_rdoc: true
94
- homepage: http://github.com/spanner/radiant-taggable-extension
89
+ homepage: http://spanner.org/radiant/taggable
95
90
  licenses: []
96
91
 
97
- post_install_message:
98
- rdoc_options:
99
- - --charset=UTF-8
92
+ post_install_message: "\n Add this to your radiant project with:\n\n config.gem 'radiant-taggable-extension', :version => '~> 2.0.0.rc1'\n\n "
93
+ rdoc_options: []
94
+
100
95
  require_paths:
101
96
  - lib
102
97
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -111,22 +106,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
111
106
  required_rubygems_version: !ruby/object:Gem::Requirement
112
107
  none: false
113
108
  requirements:
114
- - - ">="
109
+ - - ">"
115
110
  - !ruby/object:Gem::Version
116
- hash: 3
111
+ hash: 25
117
112
  segments:
118
- - 0
119
- version: "0"
113
+ - 1
114
+ - 3
115
+ - 1
116
+ version: 1.3.1
120
117
  requirements: []
121
118
 
122
119
  rubyforge_project:
123
- rubygems_version: 1.3.7
120
+ rubygems_version: 1.7.2
124
121
  signing_key:
125
122
  specification_version: 3
126
- summary: Taggable Extension for Radiant CMS
123
+ summary: Tagging, clouding and faceting extension for Radiant CMS
127
124
  test_files:
125
+ - spec/controllers/site_controller_spec.rb
128
126
  - spec/datasets/tag_sites_dataset.rb
129
127
  - spec/datasets/tags_dataset.rb
130
128
  - spec/lib/taggable_page_spec.rb
129
+ - spec/models/library_page_spec.rb
131
130
  - spec/models/tag_spec.rb
131
+ - spec/spec.opts
132
132
  - spec/spec_helper.rb
data/.gitignore DELETED
@@ -1 +0,0 @@
1
- pkg/*
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 1.2.5
@@ -1,18 +0,0 @@
1
- module TaggableAdminPageController # for inclusion into Admin::PagesController
2
-
3
- # here we have a few more special cases for page tags.
4
- # mostly just interface niceties
5
-
6
- def self.included(base)
7
-
8
- base.class_eval {
9
-
10
- def initialize_meta_rows_and_buttons_with_tags
11
- initialize_meta_rows_and_buttons_without_tags
12
- @meta.delete(@meta.find{|m| m[:field] == 'keywords'})
13
- end
14
- alias_method_chain :initialize_meta_rows_and_buttons, :tags
15
-
16
- }
17
- end
18
- end
@@ -1,41 +0,0 @@
1
- module TaggableAdminUI
2
-
3
- def self.included(base)
4
- base.class_eval do
5
-
6
- attr_accessor :tag
7
- alias_method :tags, :tag
8
-
9
- def load_default_regions_with_tags
10
- load_default_regions_without_tags
11
- @tag = load_default_tag_regions
12
- end
13
-
14
- alias_method_chain :load_default_regions, :tags
15
-
16
- protected
17
-
18
- def load_default_tag_regions
19
- returning OpenStruct.new do |tag|
20
- tag.edit = Radiant::AdminUI::RegionSet.new do |edit|
21
- edit.main.concat %w{edit_header edit_form}
22
- edit.form.concat %w{edit_name edit_role edit_description}
23
- edit.form_bottom.concat %w{edit_timestamp edit_buttons}
24
- end
25
- tag.show = Radiant::AdminUI::RegionSet.new do |show|
26
- show.main.concat %w{show_header show_pages}
27
- end
28
- tag.index = Radiant::AdminUI::RegionSet.new do |index|
29
- index.thead.concat %w{title_header link_header description_header usage_header modify_header}
30
- index.tbody.concat %w{title_cell link_cell description_cell usage_cell modify_cell}
31
- index.bottom.concat %w{new_button}
32
- end
33
- tag.remove = tag.index
34
- tag.new = tag.edit
35
- end
36
- end
37
-
38
- end
39
- end
40
- end
41
-
@@ -1,139 +0,0 @@
1
- module TaggableModel # for inclusion into ActiveRecord::Base
2
-
3
- def self.included(base)
4
- base.extend ClassMethods
5
- base.class_eval {
6
- @@taggable_models = []
7
- cattr_accessor :taggable_models
8
- }
9
- end
10
-
11
- module ClassMethods
12
- def is_taggable?
13
- false
14
- end
15
-
16
- def is_taggable
17
- return if is_taggable?
18
-
19
- has_many :taggings, :as => :tagged
20
- has_many :attached_tags, :through => :taggings, :source => :tag # can't be just has_many :tags because that stomps on the radius tags in Page.
21
-
22
- named_scope :from_tag, lambda { |tag|
23
- tag = Tag.find_by_title(tag) unless tag.is_a? Tag
24
- {
25
- :joins => "INNER JOIN taggings as tt on tt.tagged_id = #{self.table_name}.id AND tt.tagged_type = '#{self.to_s}'",
26
- :conditions => ["tt.tag_id = ?", tag.id],
27
- :readonly => false
28
- }
29
- }
30
-
31
- named_scope :from_tags, lambda { |tags|
32
- {
33
- :joins => "INNER JOIN taggings as tt on tt.tagged_id = #{self.table_name}.id AND tt.tagged_type = '#{self.to_s}'",
34
- :conditions => ["tt.tag_id in(#{tags.map{ '?' }.join(',')})"] + tags.map(&:id),
35
- :group => column_names.map { |n| table_name + '.' + n }.join(','), # postgres is strict and requires that we group by all selected (but not aggregated) columns
36
- :order => "count(tt.id) DESC",
37
- :readonly => false
38
- }
39
- }
40
-
41
- named_scope :from_all_tags, lambda { |tags|
42
- {
43
- :joins => "INNER JOIN taggings as tt on tt.tagged_id = #{self.table_name}.id AND tt.tagged_type = '#{self.to_s}'",
44
- :conditions => ["tt.tag_id in(#{tags.map{ '?' }.join(',')})"] + tags.map(&:id),
45
- :group => column_names.map { |n| table_name + '.' + n }.join(','), # postgres is strict and requires that we group by all selected (but not aggregated) columns
46
- :having => "count(tt.id) >= #{tags.length}",
47
- :readonly => false
48
- }
49
- } do
50
- # count is badly sugared here: it omits the group and having clauses.
51
- # length performs the query and looks at the array: less neat, but more right
52
- # this gives us back any? and empty? as well.
53
- def count
54
- length
55
- end
56
- end
57
-
58
- # creates eg. tag.pages, tag.assets
59
- # (returning the from_tag scope defined above)
60
- Tag.define_retrieval_methods(self.to_s)
61
-
62
- class_eval {
63
- extend TaggableModel::TaggableClassMethods
64
- include TaggableModel::TaggableInstanceMethods
65
- alias_method "related_#{self.to_s.underscore.pluralize}".intern, :related
66
- alias_method "closely_related_#{self.to_s.underscore.pluralize}".intern, :closely_related
67
- }
68
-
69
- ActiveRecord::Base.taggable_models.push(self.to_s.intern)
70
- end
71
- end
72
-
73
- module TaggableClassMethods
74
- def tagged_with(somewords=[])
75
- if somewords.is_a?(Tag)
76
- self.from_tag(somewords)
77
- elsif somewords.is_a?(Array)
78
- self.from_all_tags(somewords)
79
- else
80
- self.from_all_tags( Tag.from_list(somewords) )
81
- end
82
- end
83
-
84
- def is_taggable?
85
- true
86
- end
87
-
88
- def tags_for_cloud_from(these, limit=50)
89
- Tag.attached_to(these).most_popular(limit) # here popularity is use-count *within the group*
90
- end
91
- end
92
-
93
- module TaggableInstanceMethods
94
-
95
- def add_tag(word=nil)
96
- self.attached_tags << Tag.for(word) if word && !word.blank?
97
- end
98
-
99
- def remove_tag(word=nil)
100
- tag = Tag.find_by_title(word) if word && !word.blank?
101
- self.attached_tags.delete(tag) if tag
102
- end
103
-
104
- def related
105
- self.attached_tags.empty? ? [] : self.class.from_tags(self.attached_tags) - [self]
106
- end
107
-
108
- def closely_related
109
- self.attached_tags.empty? ? [] : self.class.from_all_tags(self.attached_tags) - [self]
110
- end
111
-
112
- # in the case of pages and anything else that keywords in the same way this overrides the existing column
113
- # the rest of the time it's just another way of specifying tags.
114
-
115
- def keywords
116
- self.attached_tags.map {|t| t.title}.join(', ')
117
- end
118
-
119
- def keywords=(somewords="")
120
- if somewords.blank?
121
- self.attached_tags.clear
122
- else
123
- self.attached_tags = Tag.from_list(somewords)
124
- end
125
- end
126
-
127
- def keywords_before_type_cast # for form_helper
128
- keywords
129
- end
130
-
131
- def tags_from_keywords
132
- if self.class.column_names.include?('keywords') && keys = read_attribute(:keywords)
133
- self.attached_tags = Tag.from_list(keys)
134
- end
135
- end
136
-
137
- end
138
- end
139
-
data/lib/taggable_page.rb DELETED
@@ -1,51 +0,0 @@
1
- module TaggablePage # for inclusion into Page
2
-
3
- # here we have a few special cases for page tags.
4
- # because of the page tree
5
-
6
- def self.included(base)
7
- base.class_eval {
8
- has_one :pointer, :class_name => 'Tag'
9
- named_scope :children_of, lambda { |these|
10
- { :conditions => ["parent_id IN (#{these.map{'?'}.join(',')})", *these.map{|t| t.id}] }
11
- }
12
- extend TaggablePage::ClassMethods
13
- include TaggablePage::InstanceMethods
14
- }
15
- end
16
-
17
- module ClassMethods
18
- end
19
-
20
- module InstanceMethods
21
-
22
- def has_pointer?
23
- !pointer.nil?
24
- end
25
-
26
- # note varying logic here: tag clouds are used differently when describing a group.
27
- # if only one object is relevant, all of its tags will be equally (locally) important.
28
- # Presumably that cloud should show global tag importance.
29
- # If several objects are relevant, either from a list or a tree of descendants, we
30
- # probably want to show local tag importance, ie prominence within that list.
31
-
32
- def tags_for_cloud(limit=50, bands=6)
33
- tags = Tag.attached_to(self.with_children).visible.most_popular(limit)
34
- Tag.sized(tags, bands)
35
- end
36
-
37
- # the family-tree builder works with generations instead of individuals to cut down the number of retrieval steps
38
-
39
- def with_children
40
- this_generation = [self]
41
- return this_generation unless self.respond_to?(:children) && self.children.any?
42
- family = [self]
43
- while this_generation.any? && next_generation = self.class.children_of(this_generation)
44
- family.push(*next_generation)
45
- this_generation = next_generation
46
- end
47
- family
48
- end
49
-
50
- end
51
- end