site_map 0.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.
- data/README.rdoc +29 -0
- data/Rakefile +63 -0
- data/lib/site_map/helpers/mapping.rb +21 -0
- data/lib/site_map/helpers.rb +3 -0
- data/lib/site_map/map.rb +42 -0
- data/lib/site_map/version.rb +13 -0
- data/lib/site_map/view_helpers.rb +26 -0
- data/lib/site_map/view_node.rb +63 -0
- data/lib/site_map.rb +37 -0
- metadata +64 -0
data/README.rdoc
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
= SiteMap
|
2
|
+
|
3
|
+
== Description
|
4
|
+
|
5
|
+
SiteMap provides a way to model out your site's views in a hierarchal fashion. You configure your views and then it builds a tree structure from it that is easy to lookup specific nodes and also traverse their relationships, such as parent or children.
|
6
|
+
|
7
|
+
== Installation
|
8
|
+
|
9
|
+
sudo gem install site_map
|
10
|
+
|
11
|
+
== Basic Usage
|
12
|
+
|
13
|
+
SiteMap by default looks for "config/site_map.rb" to try and load configurations from. Defining your site map is easy with a syntax similar to Rails routes:
|
14
|
+
|
15
|
+
SiteMap.define do |map|
|
16
|
+
map.view :user
|
17
|
+
end
|
18
|
+
|
19
|
+
This creates a single view in your map that can be found with the index :user. Finding view node's is easy as well:
|
20
|
+
|
21
|
+
SiteMap[:user]
|
22
|
+
|
23
|
+
If the a view node with the index :user exists in the site map, then it will return it and can be used as needed.
|
24
|
+
|
25
|
+
Copyright (c) 2009 John Collin Redding
|
26
|
+
See the attached MIT License.
|
27
|
+
|
28
|
+
|
29
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake/gempackagetask'
|
3
|
+
require 'rake/testtask'
|
4
|
+
|
5
|
+
require 'lib/site_map/version'
|
6
|
+
|
7
|
+
spec = Gem::Specification.new do |s|
|
8
|
+
s.name = 'site_map'
|
9
|
+
s.version = SiteMap::Version.to_s
|
10
|
+
s.has_rdoc = true
|
11
|
+
s.extra_rdoc_files = %w(README.rdoc)
|
12
|
+
s.rdoc_options = %w(--main README.rdoc)
|
13
|
+
s.summary = "SiteMap provides a way to model out your site's views in a hierarchal fashion."
|
14
|
+
s.author = 'Collin Redding'
|
15
|
+
s.email = 'TempestTTU@gmail.com'
|
16
|
+
s.homepage = 'http://github.com/jcredding/site_map'
|
17
|
+
s.files = %w(README.rdoc Rakefile) + Dir.glob("{lib}/**/*")
|
18
|
+
# s.executables = ['site_map']
|
19
|
+
|
20
|
+
# s.add_dependency('gem_name', '~> 0.0.1')
|
21
|
+
end
|
22
|
+
|
23
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
24
|
+
pkg.gem_spec = spec
|
25
|
+
end
|
26
|
+
|
27
|
+
Rake::TestTask.new do |t|
|
28
|
+
t.libs << 'test'
|
29
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
30
|
+
t.verbose = true
|
31
|
+
end
|
32
|
+
|
33
|
+
begin
|
34
|
+
require 'rcov/rcovtask'
|
35
|
+
|
36
|
+
Rcov::RcovTask.new(:coverage) do |t|
|
37
|
+
t.libs = ['test']
|
38
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
39
|
+
t.verbose = true
|
40
|
+
t.rcov_opts = ['--text-report', "-x #{Gem.path}", '-x /Library/Ruby', '-x /usr/lib/ruby']
|
41
|
+
end
|
42
|
+
|
43
|
+
task :default => :coverage
|
44
|
+
|
45
|
+
rescue LoadError
|
46
|
+
warn "\n**** Install rcov (sudo gem install relevance-rcov) to get coverage stats ****\n"
|
47
|
+
task :default => :test
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
desc 'Generate the gemspec to serve this gem'
|
52
|
+
task :gemspec do
|
53
|
+
file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
|
54
|
+
File.open(file, 'w') {|f| f << spec.to_ruby }
|
55
|
+
puts "Created gemspec: #{file}"
|
56
|
+
end
|
57
|
+
|
58
|
+
require 'cucumber'
|
59
|
+
require 'cucumber/rake/task'
|
60
|
+
|
61
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
62
|
+
t.cucumber_opts = "test/features --format pretty"
|
63
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module SiteMap
|
2
|
+
module Helpers
|
3
|
+
|
4
|
+
module Mapping
|
5
|
+
|
6
|
+
def group(new_index, options={})
|
7
|
+
view_node = SiteMap::ViewNode.new(*view_node_params(new_index, options))
|
8
|
+
self.add_to_children(view_node)
|
9
|
+
yield view_node if block_given?
|
10
|
+
end
|
11
|
+
def view(new_index, options={})
|
12
|
+
view_node = SiteMap::ViewNode.new(*view_node_params(new_index, options))
|
13
|
+
self.add_to_children(view_node)
|
14
|
+
self.map.add_to_index(view_node)
|
15
|
+
yield view_node if block_given?
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
data/lib/site_map/map.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require File.join('site_map', 'helpers', 'mapping')
|
2
|
+
module SiteMap
|
3
|
+
|
4
|
+
class Map
|
5
|
+
include SiteMap::Helpers::Mapping
|
6
|
+
ATTRIBUTES = [:view_nodes, :index_of_nodes]
|
7
|
+
ATTRIBUTES.each{|attribute| attr_reader attribute }
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
self.clear_nodes!
|
11
|
+
end
|
12
|
+
|
13
|
+
def find(view_node_index)
|
14
|
+
self.index_of_nodes[view_node_index.to_sym]
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_to_children(view_node)
|
18
|
+
@view_nodes.push(view_node)
|
19
|
+
end
|
20
|
+
def add_to_index(view_node)
|
21
|
+
@index_of_nodes[view_node.index.to_sym] = view_node
|
22
|
+
end
|
23
|
+
|
24
|
+
def clear_nodes!
|
25
|
+
@view_nodes = []
|
26
|
+
@index_of_nodes = {}
|
27
|
+
end
|
28
|
+
|
29
|
+
# convenience method
|
30
|
+
def map
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
|
36
|
+
def view_node_params(index, options)
|
37
|
+
[index, self, options]
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module SiteMap
|
2
|
+
module ViewHelpers
|
3
|
+
|
4
|
+
# Override in view scope to resolve against your labels
|
5
|
+
def view_node_label_options
|
6
|
+
{}
|
7
|
+
end
|
8
|
+
|
9
|
+
# subbing hash options into view node label code thanks to kelredd-useful
|
10
|
+
def view_node_label(view_node)
|
11
|
+
label_string = view_node.label
|
12
|
+
view_node_label_options.each do |label_key, value|
|
13
|
+
label_string.gsub!(":#{label_key}", value.to_s)
|
14
|
+
end
|
15
|
+
label_string
|
16
|
+
end
|
17
|
+
def view_node_url(view_node)
|
18
|
+
eval(view_node.url)
|
19
|
+
end
|
20
|
+
def view_node_visible(view_node)
|
21
|
+
eval(view_node.visible)
|
22
|
+
end
|
23
|
+
alias :view_node_visible? :view_node_visible
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require File.join('site_map', 'helpers', 'mapping')
|
2
|
+
module SiteMap
|
3
|
+
|
4
|
+
class ViewNode
|
5
|
+
include SiteMap::Helpers::Mapping
|
6
|
+
ATTRIBUTES = [ :map, :index, :label, :url, :visible, :parent ]
|
7
|
+
ATTRIBUTES.each{|attribute| attr_reader attribute }
|
8
|
+
|
9
|
+
def initialize(index, map, options={})
|
10
|
+
raise(ArgumentError, "index and map arguements required") unless index && map
|
11
|
+
@index = index
|
12
|
+
@map = map
|
13
|
+
options.each do |method, value|
|
14
|
+
instance_variable_set("@#{method}", value)
|
15
|
+
end
|
16
|
+
@view_nodes = []
|
17
|
+
end
|
18
|
+
|
19
|
+
def [](attribute_sym)
|
20
|
+
instance_variable_get("@#{attribute_sym}")
|
21
|
+
end
|
22
|
+
|
23
|
+
def label
|
24
|
+
@label ? @label : @index.to_s
|
25
|
+
end
|
26
|
+
def visible
|
27
|
+
@visible ? @visible : 'true'
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_to_children(view_node)
|
31
|
+
@view_nodes.push(view_node)
|
32
|
+
end
|
33
|
+
|
34
|
+
def children
|
35
|
+
@view_nodes
|
36
|
+
end
|
37
|
+
def ancestors
|
38
|
+
unless @ancestors
|
39
|
+
node, @ancestors = self, []
|
40
|
+
@ancestors << node = node.parent while node.parent
|
41
|
+
@ancestors.reverse!
|
42
|
+
end
|
43
|
+
@ancestors
|
44
|
+
end
|
45
|
+
def self_and_ancestors
|
46
|
+
@with_ancestors ||= self.ancestors.dup.push(self)
|
47
|
+
end
|
48
|
+
def siblings
|
49
|
+
@siblings ||= (self.self_and_siblings - [self])
|
50
|
+
end
|
51
|
+
def self_and_siblings
|
52
|
+
@with_siblings ||= self.parent.children
|
53
|
+
end
|
54
|
+
|
55
|
+
protected
|
56
|
+
|
57
|
+
def view_node_params(new_index, options)
|
58
|
+
[new_index, self.map, options.merge(:parent => self)]
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
data/lib/site_map.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
Dir[File.join(File.dirname(__FILE__), "site_map" ,"*.rb")].each do |file|
|
2
|
+
require File.join('site_map', File.basename(file, ".rb"))
|
3
|
+
end
|
4
|
+
|
5
|
+
module SiteMap
|
6
|
+
|
7
|
+
def self.setup(*files)
|
8
|
+
files = files.first if files.first.is_a?(Array)
|
9
|
+
files << File.join('config', 'site_map.rb') if files.empty?
|
10
|
+
@@map ||= SiteMap::Map.new
|
11
|
+
@@map.clear_nodes!
|
12
|
+
files.each do |file|
|
13
|
+
begin
|
14
|
+
load file
|
15
|
+
rescue LoadError => exception
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.[](view_node_index)
|
21
|
+
self.map.find(view_node_index.to_sym)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.view_nodes
|
25
|
+
self.map.view_nodes
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.map
|
29
|
+
@@map
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.define(&block)
|
33
|
+
yield @@map
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
SiteMap.setup
|
metadata
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: site_map
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Collin Redding
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-01-15 00:00:00 -06:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: TempestTTU@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README.rdoc
|
24
|
+
files:
|
25
|
+
- README.rdoc
|
26
|
+
- Rakefile
|
27
|
+
- lib/site_map/helpers/mapping.rb
|
28
|
+
- lib/site_map/helpers.rb
|
29
|
+
- lib/site_map/map.rb
|
30
|
+
- lib/site_map/version.rb
|
31
|
+
- lib/site_map/view_helpers.rb
|
32
|
+
- lib/site_map/view_node.rb
|
33
|
+
- lib/site_map.rb
|
34
|
+
has_rdoc: true
|
35
|
+
homepage: http://github.com/jcredding/site_map
|
36
|
+
licenses: []
|
37
|
+
|
38
|
+
post_install_message:
|
39
|
+
rdoc_options:
|
40
|
+
- --main
|
41
|
+
- README.rdoc
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: "0"
|
49
|
+
version:
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: "0"
|
55
|
+
version:
|
56
|
+
requirements: []
|
57
|
+
|
58
|
+
rubyforge_project:
|
59
|
+
rubygems_version: 1.3.5
|
60
|
+
signing_key:
|
61
|
+
specification_version: 3
|
62
|
+
summary: SiteMap provides a way to model out your site's views in a hierarchal fashion.
|
63
|
+
test_files: []
|
64
|
+
|