jeremyf-gretel 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.textile ADDED
@@ -0,0 +1,30 @@
1
+ h1. Gretel
2
+
3
+ A painfully simple tool for generating Rails based breadcrumbs.
4
+
5
+ *Given*
6
+ <pre>
7
+ Widget.find(1).to_s == 'widget named sue'
8
+ </pre>
9
+ *and*
10
+ <pre>
11
+ Routed Resource of :widgets
12
+ </pre>
13
+
14
+ *When*
15
+ <pre>
16
+ Gretel.new('/widgets/1').to_s
17
+ </pre>
18
+
19
+ *Then we get the following HTML*
20
+ <pre>
21
+ <code>
22
+ <div id="breadcrumb_trail">
23
+ <p>
24
+ <a href='/'>home</a> &raquo;
25
+ <a href="/widgets">widgets</a> &raquo;
26
+ <a href="/widgets/1">widget named sue</a>
27
+ </p>
28
+ </div>
29
+ </code>
30
+ </pre>
data/lib/gretel.rb ADDED
@@ -0,0 +1,5 @@
1
+ module Gretel
2
+ end
3
+ require 'forwardable'
4
+ require File.dirname(__FILE__) + '/gretel/builder'
5
+ require File.dirname(__FILE__) + '/gretel/model_extractor'
@@ -0,0 +1,52 @@
1
+ module Gretel
2
+
3
+ def self.new(*args)
4
+ Builder.new(*args)
5
+ end
6
+
7
+ # The BreadcrumbTrail is responsible for building a breadcrumb. This
8
+ # class specializes in extracting paths from the nested URLs.
9
+ #
10
+ # The heavy lifting of extracting an object is delegated to the ModelExtractor.
11
+ #
12
+ class Builder
13
+ extend Forwardable
14
+ def_delegator :model_extractor, :extract_from_path, :extract_model_from_path
15
+ attr_reader :request_path, :separator, :dom_id
16
+
17
+ def initialize(request_path = nil, options = {})
18
+
19
+ @request_path = request_path
20
+ @separator = options[:separator] || '&raquo;'
21
+ @dom_id = options[:dom_id] || 'breadcrumb_trail'
22
+ end
23
+
24
+ def to_s
25
+ levels = request_path.split('?')[0].split('/')
26
+ levels.delete_at(0)
27
+
28
+ links = "<a href='/'>home</a>"
29
+
30
+ levels.each_with_index do |level, index|
31
+ text, href = extract_text_and_href(level, levels[0..index])
32
+ links += %( #{separator} <a href="#{href}">#{text.to_s.downcase}</a>)
33
+ end
34
+
35
+ %(
36
+ <div id="#{dom_id}">
37
+ <p>#{links}</p>
38
+ </div>
39
+ )
40
+ end
41
+
42
+ protected
43
+ def extract_text_and_href(text, href_elements)
44
+ path = File.join("/", href_elements.join('/'))
45
+ return [extract_model_from_path(path) || text.downcase.gsub('_', ' '), path]
46
+ end
47
+
48
+ def model_extractor
49
+ ModelExtractor
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,26 @@
1
+ module Gretel
2
+ module ModelExtractor
3
+ def self.extract_from_path(path)
4
+ return nil unless path.split('?')[0].match(/\/\d+$/) # There is no singular object at this location
5
+ return nil unless options = ActionController::Routing::Routes.recognize_path(path, :method => :get)
6
+
7
+ model_name = begin
8
+ options[:controller].split('/').last.singularize.camelize.constantize
9
+ rescue
10
+ return nil unless controller = extract_controller_class_from(options)
11
+ return nil unless controller.respond_to?(:model_name)
12
+ controller.model_name
13
+ end
14
+ model_name.find_by_id(options[:id])
15
+ rescue ActionController::RoutingError, ActiveRecord::RecordNotFound => e
16
+ return nil
17
+ end
18
+
19
+ protected
20
+ def self.extract_controller_class_from(options)
21
+ "#{options[:controller].camelize}Controller".constantize
22
+ rescue
23
+ nil
24
+ end
25
+ end
26
+ end
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jeremyf-gretel
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.2
5
+ platform: ruby
6
+ authors:
7
+ - Jeremy Friesen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-09-15 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rails
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.1.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: mocha
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.5.6
34
+ version:
35
+ description: A rather simple gem for generating breadcrumbs in a Rails project
36
+ email: jeremyf@lightsky.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - README.textile
43
+ files:
44
+ - lib/gretel/builder.rb
45
+ - lib/gretel/model_extractor.rb
46
+ - lib/gretel.rb
47
+ - README.textile
48
+ has_rdoc: true
49
+ homepage: http://github.com/jeremyf/gretel
50
+ post_install_message:
51
+ rdoc_options:
52
+ - --main
53
+ - README.textile
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: "0"
61
+ version:
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
67
+ version:
68
+ requirements: []
69
+
70
+ rubyforge_project:
71
+ rubygems_version: 1.2.0
72
+ signing_key:
73
+ specification_version: 2
74
+ summary: A rather simple gem for generating breadcrumbs
75
+ test_files: []
76
+