radiant-taggable-extension 1.2.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.
Files changed (39) hide show
  1. data/README.md +125 -0
  2. data/Rakefile +136 -0
  3. data/VERSION +1 -0
  4. data/app/controllers/admin/taggings_controller.rb +8 -0
  5. data/app/controllers/admin/tags_controller.rb +17 -0
  6. data/app/models/tag.rb +200 -0
  7. data/app/models/tagging.rb +50 -0
  8. data/app/views/admin/pages/_edit_title.html.haml +28 -0
  9. data/app/views/admin/tags/_form.html.haml +23 -0
  10. data/app/views/admin/tags/_search_results.html.haml +10 -0
  11. data/app/views/admin/tags/cloud.html.haml +17 -0
  12. data/app/views/admin/tags/edit.html.haml +14 -0
  13. data/app/views/admin/tags/index.html.haml +53 -0
  14. data/app/views/admin/tags/new.html.haml +13 -0
  15. data/app/views/admin/tags/show.html.haml +32 -0
  16. data/config/routes.rb +6 -0
  17. data/db/migrate/001_create_tags.rb +26 -0
  18. data/db/migrate/002_import_keywords.rb +11 -0
  19. data/lib/taggable_admin_page_controller.rb +18 -0
  20. data/lib/taggable_admin_ui.rb +41 -0
  21. data/lib/taggable_model.rb +128 -0
  22. data/lib/taggable_page.rb +48 -0
  23. data/lib/taggable_tags.rb +456 -0
  24. data/lib/tasks/taggable_extension_tasks.rake +55 -0
  25. data/pkg/radiant-taggable-extension-1.2.0.gem +0 -0
  26. data/public/images/admin/new-tag.png +0 -0
  27. data/public/images/admin/tag.png +0 -0
  28. data/public/images/furniture/detag.png +0 -0
  29. data/public/stylesheets/admin/tags.css +20 -0
  30. data/public/stylesheets/sass/tagcloud.sass +29 -0
  31. data/radiant-taggable-extension.gemspec +84 -0
  32. data/spec/datasets/tag_sites_dataset.rb +9 -0
  33. data/spec/datasets/tags_dataset.rb +43 -0
  34. data/spec/lib/taggable_page_spec.rb +93 -0
  35. data/spec/models/tag_spec.rb +39 -0
  36. data/spec/spec.opts +6 -0
  37. data/spec/spec_helper.rb +36 -0
  38. data/taggable_extension.rb +36 -0
  39. metadata +123 -0
@@ -0,0 +1,43 @@
1
+ require 'digest/sha1'
2
+
3
+ class TagsDataset < Dataset::Base
4
+ datasets = [:pages]
5
+ datasets << :tag_sites if defined? Site
6
+ uses *datasets
7
+
8
+ def load
9
+ create_tag "colourless"
10
+ create_tag "green"
11
+ create_tag "ideas"
12
+ create_tag "sleep"
13
+ create_tag "furiously"
14
+
15
+ apply_tag :colourless, pages(:first)
16
+ apply_tag :ideas, pages(:first), pages(:another), pages(:grandchild)
17
+ apply_tag :sleep, pages(:first)
18
+ apply_tag :furiously, pages(:first)
19
+ end
20
+
21
+ helpers do
22
+ def create_tag(title, attributes={})
23
+ attributes = tag_attributes(attributes.update(:title => title))
24
+ tag = create_model Tag, title.symbolize, attributes
25
+ end
26
+
27
+ def tag_attributes(attributes={})
28
+ title = attributes[:name] || "Tag"
29
+ attributes = {
30
+ :title => title
31
+ }.merge(attributes)
32
+ attributes[:site] = sites(:test) if defined? Site
33
+ attributes
34
+ end
35
+
36
+ def apply_tag(tag, *items)
37
+ tag = tag.is_a?(Tag) ? tag : tags(tag)
38
+ items.each { |i| i.attached_tags << tag }
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,93 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe Page do
4
+ dataset :tags
5
+
6
+ it "should report itself taggable" do
7
+ Page.is_taggable?.should be_true
8
+ end
9
+
10
+ it "should return a list of pages form tag list" do
11
+ Page.tagged_with("colourless").should == [pages(:first)]
12
+ end
13
+
14
+ it "should return a weighted list of tags from page list" do
15
+ Page.tags_for_cloud_from([pages(:first)]).should == Tag.from_list("colourless, ideas, sleep, furiously")
16
+ end
17
+
18
+ describe "instantiated with tags" do
19
+ before do
20
+ @page = pages(:first)
21
+ end
22
+
23
+ it "should return tag list" do
24
+ @page.attached_tags.should == Tag.from_list("colourless, ideas, sleep, furiously")
25
+ end
26
+
27
+ it "should add and remove tags" do
28
+ @page.add_tag("howdy")
29
+ @page.attached_tags.should == Tag.from_list("colourless, ideas, sleep, furiously, howdy")
30
+ @page.remove_tag("howdy")
31
+ @page.attached_tags.should == Tag.from_list("colourless, ideas, sleep, furiously")
32
+ Tag.for('Howdy').pages.include?(@page).should be_false
33
+ end
34
+
35
+ it "should return tags string as keywords" do
36
+ @page.keywords.should == "colourless, ideas, sleep, furiously"
37
+ end
38
+
39
+ it "should accept tags string as keywords=" do
40
+ @page.keywords = "Lovable, Rogue"
41
+ @page.attached_tags.should == [Tag.for("Lovable"), Tag.for("Rogue")]
42
+ @page.keywords.should == "Lovable, Rogue"
43
+ end
44
+
45
+ it "should return keywords string to keywords_before_type_cast (for form helpers)" do
46
+ @page.keywords_before_type_cast.should == "colourless, ideas, sleep, furiously"
47
+ end
48
+
49
+ it "should return a list of related pages" do
50
+ @page.related.include?(pages(:another)).should be_true
51
+ @page.related.include?(pages(:child)).should be_false
52
+ @page.related.include?(pages(:grandchild)).should be_true
53
+ end
54
+
55
+ it "should have related_pages methods" do
56
+ @page.respond_to?(:related_pages).should be_true
57
+ @page.respond_to?(:closely_related_pages).should be_true
58
+ end
59
+
60
+ end
61
+
62
+ describe "when cloud-building" do
63
+ describe "across the whole collection" do
64
+ before do
65
+ @tags = Tag.sized(Tag.most_popular(10))
66
+ end
67
+
68
+ it "should weight the tags" do
69
+ tag = @tags.select{|t| t.title = "Ideas"}.first
70
+ tag.cloud_size.should_not be_nil
71
+ tag.use_count.should == "3" # counting every use
72
+ end
73
+ end
74
+
75
+ before do
76
+ @page = pages(:parent)
77
+ @tags = @page.tags_for_cloud
78
+ end
79
+
80
+ it "should gather its descendants" do
81
+ @page.with_children.length.should == 6
82
+ @page.with_children.include?(pages(:child_2)).should be_true
83
+ @page.with_children.include?(pages(:great_grandchild)).should be_true
84
+ end
85
+
86
+ it "should return a weighted list of tags attached to itself and descendants" do
87
+ @tags.first.should == tags(:ideas)
88
+ @tags.first.cloud_size.should_not be_nil
89
+ @tags.first.use_count.should == "1" # counting only within this family tree
90
+ end
91
+
92
+ end
93
+ end
@@ -0,0 +1,39 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe Tag do
4
+ dataset :tags
5
+
6
+ it "should reuse an existing tag if possible" do
7
+ tag = Tag.for('colourless')
8
+ tag.should == tags(:colourless)
9
+ end
10
+
11
+ it "should create a tag where none exists" do
12
+ tag = Tag.for('calumny')
13
+ tag.should be_valid
14
+ tag.new_record?.should be_false
15
+ end
16
+
17
+ it "should find_or_create tags from a list" do
18
+ tags = Tag.from_list('colourless,ideas,lifebelt')
19
+ tags[0].should == tags(:colourless)
20
+ tags[1].should == tags(:ideas)
21
+ tags[2].created_at.should be_close((Time.now).utc, 10.seconds)
22
+ end
23
+
24
+ describe "instantiated" do
25
+ before do
26
+ @tag = tags(:sleep)
27
+ end
28
+
29
+ it "should have retrieval methods for taggable models" do
30
+ @tag.respond_to?(:page_taggings).should be_true
31
+ @tag.respond_to?(:pages).should be_true
32
+ end
33
+
34
+ it "should return its list of pages" do
35
+ @tag.pages.should == [pages(:first)]
36
+ end
37
+
38
+ end
39
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,6 @@
1
+ --colour
2
+ --format
3
+ profile
4
+ --loadby
5
+ mtime
6
+ --reverse
@@ -0,0 +1,36 @@
1
+ unless defined? RADIANT_ROOT
2
+ ENV["RAILS_ENV"] = "test"
3
+ case
4
+ when ENV["RADIANT_ENV_FILE"]
5
+ require ENV["RADIANT_ENV_FILE"]
6
+ when File.dirname(__FILE__) =~ %r{vendor/radiant/vendor/extensions}
7
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../../")}/config/environment"
8
+ else
9
+ require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../")}/config/environment"
10
+ end
11
+ end
12
+ require "#{RADIANT_ROOT}/spec/spec_helper"
13
+
14
+ Dataset::Resolver.default << (File.dirname(__FILE__) + "/datasets")
15
+
16
+ if File.directory?(File.dirname(__FILE__) + "/matchers")
17
+ Dir[File.dirname(__FILE__) + "/matchers/*.rb"].each {|file| require file }
18
+ end
19
+
20
+ Spec::Runner.configure do |config|
21
+ # config.use_transactional_fixtures = true
22
+ # config.use_instantiated_fixtures = false
23
+ # config.fixture_path = RAILS_ROOT + '/spec/fixtures'
24
+
25
+ # You can declare fixtures for each behaviour like this:
26
+ # describe "...." do
27
+ # fixtures :table_a, :table_b
28
+ #
29
+ # Alternatively, if you prefer to declare them only once, you can
30
+ # do so here, like so ...
31
+ #
32
+ # config.global_fixtures = :table_a, :table_b
33
+ #
34
+ # If you declare global fixtures, be aware that they will be declared
35
+ # for all of your examples, even those that don't use them.
36
+ end
@@ -0,0 +1,36 @@
1
+ class TaggableExtension < Radiant::Extension
2
+ version "1.2.0"
3
+ description "General purpose tagging and retrieval extension: more versatile but less focused than the tags extension"
4
+ url "http://github.com/spanner/radiant-taggable-extension"
5
+
6
+ def activate
7
+ ActiveRecord::Base.send :include, TaggableModel # provide is_taggable for everything but don't call it for anything
8
+ Page.send :is_taggable # make pages taggable
9
+ Page.send :include, TaggablePage # then fake the keywords column and add some inheritance
10
+ Page.send :include, TaggableTags # and the basic radius tags for showing page tags and tag pages
11
+ Admin::PagesController.send :include, TaggableAdminPageController # tweak the admin interface to make page tags more prominent
12
+ UserActionObserver.instance.send :add_observer!, Tag # tags get creator-stamped
13
+
14
+ unless defined? admin.tag
15
+ Radiant::AdminUI.send :include, TaggableAdminUI
16
+ admin.tag = Radiant::AdminUI.load_default_tag_regions
17
+ end
18
+
19
+ if respond_to?(:tab)
20
+ tab("Content") do
21
+ add_item("Tags", "/admin/tags")
22
+ end
23
+ else
24
+ admin.tabs.add "Tags", "/admin/tags", :after => "Layouts", :visibility => [:all]
25
+ if admin.tabs['Tags'].respond_to?(:add_link)
26
+ admin.tabs['Tags'].add_link('tag list', '/admin/tags')
27
+ admin.tabs['Tags'].add_link('tag cloud', '/admin/tags/cloud')
28
+ admin.tabs['Tags'].add_link('new tag', '/admin/tags/new')
29
+ end
30
+ end
31
+ end
32
+
33
+ def deactivate
34
+ admin.tabs.remove "Tags" unless respond_to?(:tab)
35
+ end
36
+ end
metadata ADDED
@@ -0,0 +1,123 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: radiant-taggable-extension
3
+ version: !ruby/object:Gem::Version
4
+ hash: 31
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 2
9
+ - 0
10
+ version: 1.2.0
11
+ platform: ruby
12
+ authors:
13
+ - spanner
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-09-10 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
39
+ executables: []
40
+
41
+ extensions: []
42
+
43
+ extra_rdoc_files:
44
+ - README.md
45
+ files:
46
+ - README.md
47
+ - Rakefile
48
+ - VERSION
49
+ - app/controllers/admin/taggings_controller.rb
50
+ - app/controllers/admin/tags_controller.rb
51
+ - app/models/tag.rb
52
+ - app/models/tagging.rb
53
+ - app/views/admin/pages/_edit_title.html.haml
54
+ - app/views/admin/tags/_form.html.haml
55
+ - app/views/admin/tags/_search_results.html.haml
56
+ - app/views/admin/tags/cloud.html.haml
57
+ - app/views/admin/tags/edit.html.haml
58
+ - app/views/admin/tags/index.html.haml
59
+ - app/views/admin/tags/new.html.haml
60
+ - app/views/admin/tags/show.html.haml
61
+ - config/routes.rb
62
+ - db/migrate/001_create_tags.rb
63
+ - db/migrate/002_import_keywords.rb
64
+ - lib/taggable_admin_page_controller.rb
65
+ - lib/taggable_admin_ui.rb
66
+ - lib/taggable_model.rb
67
+ - lib/taggable_page.rb
68
+ - lib/taggable_tags.rb
69
+ - lib/tasks/taggable_extension_tasks.rake
70
+ - pkg/radiant-taggable-extension-1.2.0.gem
71
+ - public/images/admin/new-tag.png
72
+ - public/images/admin/tag.png
73
+ - public/images/furniture/detag.png
74
+ - public/stylesheets/admin/tags.css
75
+ - public/stylesheets/sass/tagcloud.sass
76
+ - radiant-taggable-extension.gemspec
77
+ - spec/datasets/tag_sites_dataset.rb
78
+ - spec/datasets/tags_dataset.rb
79
+ - spec/lib/taggable_page_spec.rb
80
+ - spec/models/tag_spec.rb
81
+ - spec/spec.opts
82
+ - spec/spec_helper.rb
83
+ - taggable_extension.rb
84
+ has_rdoc: true
85
+ homepage: http://github.com/spanner/radiant-taggable-extension
86
+ licenses: []
87
+
88
+ post_install_message:
89
+ rdoc_options:
90
+ - --charset=UTF-8
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ hash: 3
99
+ segments:
100
+ - 0
101
+ version: "0"
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ hash: 3
108
+ segments:
109
+ - 0
110
+ version: "0"
111
+ requirements: []
112
+
113
+ rubyforge_project:
114
+ rubygems_version: 1.3.7
115
+ signing_key:
116
+ specification_version: 3
117
+ summary: Taggable Extension for Radiant CMS
118
+ test_files:
119
+ - spec/datasets/tag_sites_dataset.rb
120
+ - spec/datasets/tags_dataset.rb
121
+ - spec/lib/taggable_page_spec.rb
122
+ - spec/models/tag_spec.rb
123
+ - spec/spec_helper.rb