trackman 0.4.8 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile.lock +4 -4
- data/README.md +68 -32
- data/lib/generators/controller/USAGE +12 -0
- data/lib/generators/controller/controller_generator.rb +45 -0
- data/lib/generators/controller/templates/controller_layout.rb.erb +38 -0
- data/lib/generators/controller/templates/view_layout.html.erb +1 -0
- data/lib/railtie.rb +37 -0
- data/lib/trackman/assets.rb +0 -17
- data/lib/trackman/core_extensions.rb +35 -0
- data/lib/trackman/scaffold/content_saver.rb +65 -0
- data/lib/trackman/scaffold/pretty-print.xslt +46 -0
- data/lib/trackman/scaffold.rb +19 -0
- data/lib/trackman/version.rb +1 -1
- data/lib/trackman.rb +4 -29
- data/rails_generators/trackman_controller/USAGE +13 -0
- data/rails_generators/trackman_controller/templates/controller_layout.rb.erb +40 -0
- data/rails_generators/trackman_controller/templates/view_layout.html.erb +1 -0
- data/rails_generators/trackman_controller/trackman_controller_generator.rb +41 -0
- data/rails_generators/trackman_tasks/USAGE +10 -0
- data/rails_generators/{trackman → trackman_tasks}/templates/trackman.rake +0 -0
- data/rails_generators/{trackman/trackman_generator.rb → trackman_tasks/trackman_tasks_generator.rb} +1 -1
- data/spec/scaffolding_spec.rb +128 -0
- metadata +20 -7
- data/lib/tasks.rb +0 -8
- data/lib/trackman/rack_middleware.rb +0 -12
- data/lib/trackman/railtie.rb +0 -10
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -9,7 +9,7 @@ GIT
|
|
9
9
|
PATH
|
10
10
|
remote: .
|
11
11
|
specs:
|
12
|
-
trackman (0.
|
12
|
+
trackman (0.5.0)
|
13
13
|
heroku (>= 2.26.2)
|
14
14
|
json
|
15
15
|
nokogiri
|
@@ -23,9 +23,9 @@ GEM
|
|
23
23
|
addressable (2.3.2)
|
24
24
|
blockenspiel (0.4.5)
|
25
25
|
diff-lcs (1.1.3)
|
26
|
-
excon (0.16.
|
27
|
-
heroku (2.31.
|
28
|
-
heroku-api (~> 0.3.
|
26
|
+
excon (0.16.3)
|
27
|
+
heroku (2.31.5)
|
28
|
+
heroku-api (~> 0.3.5)
|
29
29
|
launchy (>= 0.3.2)
|
30
30
|
netrc (~> 0.7.7)
|
31
31
|
rest-client (~> 1.6.1)
|
data/README.md
CHANGED
@@ -1,76 +1,112 @@
|
|
1
1
|
# Trackman
|
2
|
-
Trackman is a Heroku add-on that hosts your maintenance pages and their assets outside your app.
|
3
|
-
You keep them
|
2
|
+
Trackman is a Heroku add-on that hosts your maintenance pages and their assets outside your app (S3).
|
3
|
+
You keep them versioned in the comfort of your project and Trackman syncs them to s3 when you deploy.
|
4
4
|
|
5
5
|
Works out of the box for Ruby(1.8.7 and 1.9.3) on
|
6
6
|
* Rails 2.3
|
7
|
-
* Rails 3
|
7
|
+
* Rails 3
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
|
10
|
+
## Quick peek
|
11
|
+
### The first time
|
12
12
|
* Run a rake task to setup the heroku configs.
|
13
|
+
* Generate a controller to scaffold your static pages.
|
13
14
|
* Deploy the changes and boot your app.
|
14
15
|
|
15
16
|
### Need to change your layout or assets?
|
16
|
-
Simply
|
17
|
+
Simply edit your static pages, link different assets, go crazy!
|
17
18
|
Trackman will sync upon application boot on your next deployment.
|
18
19
|
|
20
|
+
### Conventions
|
21
|
+
We assume your maintenance page is located at:
|
22
|
+
|
23
|
+
```console
|
24
|
+
public/503.html
|
25
|
+
```
|
26
|
+
|
27
|
+
And the page to display if your app breaks during initialization:
|
28
|
+
|
29
|
+
```console
|
30
|
+
public/503-error.html
|
31
|
+
```
|
19
32
|
|
20
33
|
## Getting started
|
21
|
-
### Step 1 - Install the
|
34
|
+
### Step 1 - Install the addon, add the gem and run bundle install
|
35
|
+
|
36
|
+
|
22
37
|
```console
|
23
38
|
heroku addons:add trackman
|
24
39
|
```
|
25
|
-
|
26
|
-
|
40
|
+
|
41
|
+
|
42
|
+
```ruby
|
27
43
|
gem 'trackman'
|
28
44
|
```
|
29
45
|
|
30
|
-
|
46
|
+
|
31
47
|
```console
|
32
|
-
|
48
|
+
bundle install
|
33
49
|
```
|
50
|
+
|
51
|
+
##### Step 1.5 (Rails 2 only) - Generate Trackman tasks
|
52
|
+
|
53
|
+
```console
|
54
|
+
./script/generate trackman_tasks
|
55
|
+
```
|
56
|
+
|
57
|
+
|
34
58
|
This will add trackman.rake to lib/tasks/
|
35
59
|
|
36
|
-
### Step
|
60
|
+
### Step 2 - Setup
|
61
|
+
|
62
|
+
|
37
63
|
```console
|
38
64
|
rake trackman:setup
|
39
65
|
```
|
66
|
+
|
67
|
+
|
40
68
|
This sets your initial heroku configurations and ensures that when your app is down or in maintenance your pages will be requested by heroku.
|
41
|
-
If you have maintenance or error pages
|
69
|
+
If you already have maintenance or error pages configs for heroku, Trackman will copy with .bkp extensions before he overwrites them.
|
42
70
|
|
43
|
-
|
71
|
+
### Step 3 (optional) - Scaffold your static pages
|
44
72
|
|
45
|
-
|
73
|
+
##### Rails 2.3
|
46
74
|
|
47
75
|
```console
|
48
|
-
|
76
|
+
./script/generate trackman_controller [name]
|
49
77
|
```
|
50
|
-
Calling this command manually will throw exceptions instead of silently failing like the normal sync would.
|
51
78
|
|
52
|
-
|
53
|
-
* Heroku >= 2.26.2
|
54
|
-
* Bundler >= 1.1.3
|
79
|
+
##### Rails 3
|
55
80
|
|
56
|
-
### Notes
|
57
|
-
By convention, we assume your maintenance page is located at
|
58
81
|
|
59
82
|
```console
|
60
|
-
|
83
|
+
rails generate trackman:controller [name]
|
61
84
|
```
|
62
85
|
|
63
|
-
|
86
|
+
This will generate a special controller that, when on development, will create your maintenance pages for you when you execute its actions.
|
87
|
+
Because Rails 3 can handle 500 and 404 pages dynamically, the controller also adds the required route to handle them.
|
88
|
+
On Rails 2, it generates the 4 different static pages instead.
|
89
|
+
|
90
|
+
The controller has class methods to filter the response output.
|
91
|
+
You can find examples on how to use them within the controller itself.
|
92
|
+
|
93
|
+
### Step 4 - Deploy
|
94
|
+
Now that you have your maintenance pages, you can commit and push to Heroku.
|
95
|
+
Trackman will look for changes to your pages and linked assets and sync them on application boot.
|
96
|
+
|
97
|
+
### To troubleshoot the sync operation
|
64
98
|
|
65
|
-
For maintenance
|
66
|
-
```console
|
67
|
-
public/503.html
|
68
|
-
```
|
69
|
-
Broken app
|
70
99
|
```console
|
71
|
-
|
100
|
+
heroku run rake trackman:sync
|
72
101
|
```
|
73
102
|
|
103
|
+
|
104
|
+
Executing this task will throw exceptions instead of silently failing like the normal sync would.
|
105
|
+
|
106
|
+
### For best results, make sure you have those installed:
|
107
|
+
* Heroku >= 2.26.2
|
108
|
+
* Bundler >= 1.1.3
|
109
|
+
|
74
110
|
### Bug reports
|
75
111
|
|
76
112
|
Any bug report can be submitted here.
|
@@ -82,7 +118,7 @@ https://github.com/SynApps/trackman/issues
|
|
82
118
|
* Jeremy Fabre (https://github.com/jfabre)
|
83
119
|
* Emanuel Petre (https://github.com/epetre)
|
84
120
|
|
85
|
-
###Copyright
|
121
|
+
### Copyright
|
86
122
|
|
87
123
|
Copyright © 2012 SynApps
|
88
124
|
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Description:
|
2
|
+
Generates a controller which will scaffold your maintenance pages when you execute the corresponding actions.
|
3
|
+
The controller will also handle your 404 and 500 error pages.
|
4
|
+
Usage:
|
5
|
+
Pass the name of the controller as the first argument. If no name is specified
|
6
|
+
it will take "errors" as default.
|
7
|
+
|
8
|
+
Examples:
|
9
|
+
rails generate trackman:controller abc
|
10
|
+
|
11
|
+
Will create a controller called "abc". It will contain four GET methods to
|
12
|
+
access your error pages and generate your static pages.
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
module Trackman
|
3
|
+
class ControllerGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
argument :controller_name, :type => :string, :default => 'errors'
|
6
|
+
|
7
|
+
desc "Generates a controller to generate your static pages"
|
8
|
+
|
9
|
+
@@actions = ['not_found', 'error', 'maintenance', 'maintenance_error']
|
10
|
+
@@routes = {'404' => 'not_found', '500' => 'error', 'maintenance' => 'maintenance', 'maintenance-error' => 'maintenance_error'}
|
11
|
+
|
12
|
+
def create_controller
|
13
|
+
template "controller_layout.rb.erb", "app/controllers/#{controller_name}_controller.rb"
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_app_config
|
17
|
+
puts "
|
18
|
+
------
|
19
|
+
Trackman added \"config.exceptions_app = self.routes\" in app/config/application.rb
|
20
|
+
------\n"
|
21
|
+
application do
|
22
|
+
"config.exceptions_app = self.routes"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
def create_views
|
26
|
+
create_views_for(:erb)
|
27
|
+
end
|
28
|
+
|
29
|
+
def create_routes
|
30
|
+
@@routes.each do |k, v|
|
31
|
+
route "match \"/#{k}\", :to => \"#{controller_name}##{v}\""
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
protected
|
36
|
+
def create_views_for(engine)
|
37
|
+
view_folder = "app/views/#{controller_name}"
|
38
|
+
layout = "view_layout.html.#{engine}"
|
39
|
+
|
40
|
+
@@actions.each do |n|
|
41
|
+
template layout, "#{view_folder}/#{n}.html.#{engine}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class ErrorsController < ApplicationController
|
2
|
+
include Trackman::Scaffold::ContentSaver
|
3
|
+
after_filter :save_content if Rails.env.development?
|
4
|
+
|
5
|
+
# ContentSaver defines two class methods for filtering the ouput of your pages
|
6
|
+
#
|
7
|
+
# Note that it uses nokogiri to parse the output.
|
8
|
+
# You can call the methods multiples times if you need, it will stack the calls.
|
9
|
+
|
10
|
+
# edit selector, &block
|
11
|
+
# pass a css or xpath selector and a block that will get executed for each result
|
12
|
+
|
13
|
+
# ie:
|
14
|
+
# edit "//link[contains(@src 'http://127.0.0.1:3000'))" do |node|
|
15
|
+
# node['src'] = "http://www.production.com"
|
16
|
+
# end
|
17
|
+
|
18
|
+
# remove selector[, &predicate]
|
19
|
+
# pass a css or xpath selector. You can also pass an optional predicate
|
20
|
+
# to refine the scan instead of trying to make the perfect selector.
|
21
|
+
|
22
|
+
# ie:
|
23
|
+
# remove 'script' do |node|
|
24
|
+
# node['src'].include?('/assets') && !node['src'].include?('application')
|
25
|
+
# end
|
26
|
+
|
27
|
+
def not_found
|
28
|
+
end
|
29
|
+
|
30
|
+
def error
|
31
|
+
end
|
32
|
+
|
33
|
+
def maintenance
|
34
|
+
end
|
35
|
+
|
36
|
+
def maintenance_error
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<p>This error/maintenance page was generated by Trackman</p>
|
data/lib/railtie.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
#Bundler.require
|
2
|
+
|
3
|
+
if defined?(Rails)
|
4
|
+
if ::Rails::VERSION::STRING =~ /^2\.[1-9]/ && Rails.env.production?
|
5
|
+
module Trackman
|
6
|
+
class RackMiddleware
|
7
|
+
def initialize(app)
|
8
|
+
@app = app
|
9
|
+
Trackman::Assets::Asset.autosync
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(env)
|
13
|
+
@app.call(env)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
require './config/environment'
|
18
|
+
Rails.configuration.middleware.use Trackman::RackMiddleware
|
19
|
+
elsif ::Rails::VERSION::STRING =~ /^[3-9]\.[1-9]/
|
20
|
+
require 'generators/controller/controller_generator'
|
21
|
+
module Trackman
|
22
|
+
class Railtie < Rails::Railtie
|
23
|
+
rake_tasks do
|
24
|
+
Dir[File.join(File.dirname(__FILE__),'../rails_generators/trackman/templates/*.rake')].each { |f| load f }
|
25
|
+
end
|
26
|
+
|
27
|
+
if Rails.env == "production"
|
28
|
+
initializer "trackman.hook" do |app|
|
29
|
+
app.config.after_initialize do
|
30
|
+
Trackman::Assets::Asset.autosync
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/trackman/assets.rb
CHANGED
@@ -1,20 +1,3 @@
|
|
1
|
-
class String
|
2
|
-
def trackman_underscore
|
3
|
-
word = dup
|
4
|
-
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
|
5
|
-
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
6
|
-
word.tr!("-", "_")
|
7
|
-
word.downcase!
|
8
|
-
word
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class Symbol
|
13
|
-
def trackman_underscore
|
14
|
-
to_s.trackman_underscore
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
1
|
module Trackman
|
19
2
|
module Assets
|
20
3
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
class String
|
3
|
+
def trackman_underscore
|
4
|
+
word = dup
|
5
|
+
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
|
6
|
+
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
7
|
+
word.tr!("-", "_")
|
8
|
+
word.downcase!
|
9
|
+
word
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Symbol
|
14
|
+
def trackman_underscore
|
15
|
+
to_s.trackman_underscore
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
#ruby 1.8.7 does not take blocks (this fixes it) -- used in Asset.all
|
20
|
+
if RUBY_VERSION !~ /^1\.9/
|
21
|
+
class Array
|
22
|
+
def uniq
|
23
|
+
ret, keys = [], []
|
24
|
+
each do |x|
|
25
|
+
key = block_given? ? yield(x) : x
|
26
|
+
unless keys.include? key
|
27
|
+
ret << x
|
28
|
+
keys << key
|
29
|
+
end
|
30
|
+
end
|
31
|
+
ret
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
|
3
|
+
module Trackman
|
4
|
+
module Scaffold
|
5
|
+
module ContentSaver
|
6
|
+
def self.included(base)
|
7
|
+
class << base; attr_accessor :nodes_to_remove, :nodes_to_edit, :mappings; end
|
8
|
+
base.nodes_to_remove = {}
|
9
|
+
base.nodes_to_edit = {}
|
10
|
+
|
11
|
+
if defined?(Rails)
|
12
|
+
base.mappings = { :maintenance => '503', :maintenance_error => '503-error' }
|
13
|
+
base.mappings.merge!({:not_found => '404', :error => '500'}) if ::Rails::VERSION::STRING =~ /^2\./
|
14
|
+
else
|
15
|
+
base.mappings = {}
|
16
|
+
end
|
17
|
+
base.extend ClassMethods
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
module ClassMethods
|
22
|
+
def edit selector, &block
|
23
|
+
raise 'block parameter is mandatory' unless block_given?
|
24
|
+
nodes_to_edit[selector] = block
|
25
|
+
end
|
26
|
+
def remove selector, &predicate
|
27
|
+
nodes_to_remove[selector] = predicate
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
def remove_nodes doc
|
33
|
+
self.class.nodes_to_remove.each do |selector, predicate|
|
34
|
+
nodes = doc.search(selector)
|
35
|
+
nodes = nodes.select(&predicate) unless predicate.nil?
|
36
|
+
nodes.each{|n| n.remove }
|
37
|
+
end
|
38
|
+
doc
|
39
|
+
end
|
40
|
+
|
41
|
+
def edit_nodes doc
|
42
|
+
self.class.nodes_to_edit.each do |selector, block|
|
43
|
+
doc.search(selector).each { |n| block.call(n) }
|
44
|
+
end
|
45
|
+
doc
|
46
|
+
end
|
47
|
+
|
48
|
+
def save_content
|
49
|
+
to_write = self.class.mappings[params[:action].to_sym]
|
50
|
+
|
51
|
+
unless to_write.nil?
|
52
|
+
path = "/public/#{to_write}.html"
|
53
|
+
|
54
|
+
xsl = Nokogiri::XSLT(File.open("#{File.dirname(__FILE__)}/pretty-print.xslt"))
|
55
|
+
html = Nokogiri::HTML(response.body)
|
56
|
+
|
57
|
+
edit_nodes html
|
58
|
+
remove_nodes html
|
59
|
+
|
60
|
+
File.open(Rails.root.to_s + path, 'w') { |f| f.write(xsl.apply_to(html).to_s) }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
2
|
+
<xsl:output method="html" omit-xml-declaration="yes" encoding="UTF-8" />
|
3
|
+
<xsl:param name="indent-increment" select="' '"/>
|
4
|
+
|
5
|
+
<xsl:template name="newline">
|
6
|
+
<xsl:text disable-output-escaping="yes">
|
7
|
+
</xsl:text>
|
8
|
+
</xsl:template>
|
9
|
+
|
10
|
+
<xsl:template match="comment() | processing-instruction()">
|
11
|
+
<xsl:param name="indent" select="''"/>
|
12
|
+
<xsl:call-template name="newline"/>
|
13
|
+
<xsl:value-of select="$indent"/>
|
14
|
+
<xsl:copy />
|
15
|
+
</xsl:template>
|
16
|
+
|
17
|
+
<xsl:template match="text()">
|
18
|
+
<xsl:param name="indent" select="''"/>
|
19
|
+
<xsl:call-template name="newline"/>
|
20
|
+
<xsl:value-of select="$indent"/>
|
21
|
+
<xsl:value-of select="normalize-space(.)"/>
|
22
|
+
</xsl:template>
|
23
|
+
|
24
|
+
<xsl:template match="text()[normalize-space(.)='']"/>
|
25
|
+
|
26
|
+
<xsl:template match="*">
|
27
|
+
<xsl:param name="indent" select="''"/>
|
28
|
+
<xsl:call-template name="newline"/>
|
29
|
+
<xsl:value-of select="$indent"/>
|
30
|
+
<xsl:choose>
|
31
|
+
<xsl:when test="count(child::*) > 0">
|
32
|
+
<xsl:copy>
|
33
|
+
<xsl:copy-of select="@*"/>
|
34
|
+
<xsl:apply-templates select="*|text()">
|
35
|
+
<xsl:with-param name="indent" select="concat ($indent, $indent-increment)"/>
|
36
|
+
</xsl:apply-templates>
|
37
|
+
<xsl:call-template name="newline"/>
|
38
|
+
<xsl:value-of select="$indent"/>
|
39
|
+
</xsl:copy>
|
40
|
+
</xsl:when>
|
41
|
+
<xsl:otherwise>
|
42
|
+
<xsl:copy-of select="."/>
|
43
|
+
</xsl:otherwise>
|
44
|
+
</xsl:choose>
|
45
|
+
</xsl:template>
|
46
|
+
</xsl:stylesheet>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Trackman
|
2
|
+
module Scaffold
|
3
|
+
|
4
|
+
#TODO do something better than this to share the scope
|
5
|
+
def self.autoloads path, items
|
6
|
+
items.each do |s|
|
7
|
+
if block_given?
|
8
|
+
yield(s, "#{path}/#{s.trackman_underscore}" )
|
9
|
+
else
|
10
|
+
autoload s, "#{path}/#{s.trackman_underscore}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
@@modules = [:ContentSaver]
|
16
|
+
|
17
|
+
autoloads 'trackman/scaffold', @@modules
|
18
|
+
end
|
19
|
+
end
|
data/lib/trackman/version.rb
CHANGED
data/lib/trackman.rb
CHANGED
@@ -1,37 +1,12 @@
|
|
1
1
|
require "rubygems"
|
2
2
|
require "bundler/setup"
|
3
|
-
require '
|
3
|
+
require File.expand_path('../trackman/core_extensions', __FILE__)
|
4
|
+
require 'railtie'
|
4
5
|
|
5
6
|
module Trackman
|
6
|
-
autoload :RackMiddleware, 'trackman/rack_middleware'
|
7
7
|
autoload :Assets, 'trackman/assets'
|
8
8
|
autoload :ConfigurationHandler, 'trackman/configuration_handler'
|
9
|
+
autoload :Scaffold, 'trackman/scaffold'
|
9
10
|
end
|
10
11
|
|
11
|
-
autoload :Debugger, 'trackman/debugger'
|
12
|
-
|
13
|
-
if defined?(Rails) && Rails.env == "production"
|
14
|
-
if ::Rails::VERSION::STRING =~ /^2\.[1-9]/
|
15
|
-
require './config/environment'
|
16
|
-
Rails.configuration.middleware.use Trackman::RackMiddleware
|
17
|
-
elsif ::Rails::VERSION::STRING =~ /^[3-9]\.[1-9]/
|
18
|
-
require "trackman/railtie"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
#ruby 1.8.7 does not take blocks (this fixes it) -- used in Asset.all
|
23
|
-
if RUBY_VERSION !~ /^1\.9/
|
24
|
-
class Array
|
25
|
-
def uniq
|
26
|
-
ret, keys = [], []
|
27
|
-
each do |x|
|
28
|
-
key = block_given? ? yield(x) : x
|
29
|
-
unless keys.include? key
|
30
|
-
ret << x
|
31
|
-
keys << key
|
32
|
-
end
|
33
|
-
end
|
34
|
-
ret
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
12
|
+
autoload :Debugger, 'trackman/debugger'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Description:
|
2
|
+
Generates a controller which will scaffold your error and maintenance pages
|
3
|
+
when you execute the corresponding actions.
|
4
|
+
|
5
|
+
Usage:
|
6
|
+
Pass the name of the controller as the first argument. If no name is specified
|
7
|
+
it will take 'errors' as default.
|
8
|
+
|
9
|
+
Examples:
|
10
|
+
rails generate trackman_controller abc
|
11
|
+
|
12
|
+
Will create a controller called "abc". It will contain four GET methods to
|
13
|
+
generate your error and maintenance pages.
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class ErrorsController < ApplicationController
|
2
|
+
include Trackman::Scaffold::ContentSaver
|
3
|
+
after_filter :save_content if Rails.env.development?
|
4
|
+
|
5
|
+
# ContentSaver defines two class methods for filtering the ouput of your pages
|
6
|
+
#
|
7
|
+
# Note that it uses nokogiri to parse the output.
|
8
|
+
# You can call the methods multiples times if you need, it will stack the calls.
|
9
|
+
|
10
|
+
# edit selector, &block
|
11
|
+
# pass a css or xpath selector and a block that will get executed for each result
|
12
|
+
|
13
|
+
# ie:
|
14
|
+
# edit "//link[contains(@src 'http://127.0.0.1:3000'))" do |node|
|
15
|
+
# node['src'] = "http://www.production.com"
|
16
|
+
# end
|
17
|
+
|
18
|
+
# remove selector, [optional]&predicate
|
19
|
+
# pass a css or xpath selector. You can also pass an optional predicate
|
20
|
+
# to refine the scan instead of trying to make the perfect selector.
|
21
|
+
|
22
|
+
# ie:
|
23
|
+
# remove 'script' do |node|
|
24
|
+
# node['src'].include?('/assets') && !node['src'].include?('application')
|
25
|
+
# end
|
26
|
+
|
27
|
+
<%= route_doc true %>
|
28
|
+
|
29
|
+
def not_found
|
30
|
+
end
|
31
|
+
|
32
|
+
def error
|
33
|
+
end
|
34
|
+
|
35
|
+
def maintenance
|
36
|
+
end
|
37
|
+
|
38
|
+
def maintenance_error
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<p>This error/maintenance page was generated by Trackman</p>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
class TrackmanControllerGenerator < ::Rails::Generator::Base
|
3
|
+
def initialize runtime_args, runtime_options = {}
|
4
|
+
self.controller_name = options[:controller_name] || 'errors'
|
5
|
+
super
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_accessor :controller_name
|
9
|
+
|
10
|
+
@@actions = ['not_found', 'error', 'maintenance', 'maintenance_error']
|
11
|
+
@@routes = {'404' => 'not_found', '500' => 'error', 'maintenance' => 'maintenance', 'maintenance-error' => 'maintenance_error'}
|
12
|
+
|
13
|
+
def manifest # this method is default entrance of generator
|
14
|
+
puts route_doc false
|
15
|
+
record do |m|
|
16
|
+
m.template 'controller_layout.rb.erb', "app/controllers/#{controller_name}_controller.rb"
|
17
|
+
create_views_for(:erb, m)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
def create_views_for(engine, m)
|
23
|
+
view_folder = "app/views/#{controller_name}"
|
24
|
+
layout = "view_layout.html.#{engine}"
|
25
|
+
|
26
|
+
m.directory(view_folder)
|
27
|
+
@@actions.each do |n|
|
28
|
+
m.template layout, "#{view_folder}/#{n}.html.#{engine}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def route_doc show_as_comments = false
|
33
|
+
char = show_as_comments ? '#' : ''
|
34
|
+
"\n#{char} Don't forget to add the routes in config/routes.rb\n#{char} ------
|
35
|
+
#{char} map.not_found '/not_found', :controller => '#{controller_name}', :action => :not_found
|
36
|
+
#{char} map.error '/error', :controller => '#{controller_name}', :action => :error
|
37
|
+
#{char} map.maintenance '/maintenance', :controller => '#{controller_name}', :action => :maintenance
|
38
|
+
#{char} map.maintenance_error '/maintenance-error', :controller => '#{controller_name}', :action => :maintenance_error
|
39
|
+
#{char} ------\n\n"
|
40
|
+
end
|
41
|
+
end
|
File without changes
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class TestSaver
|
4
|
+
include Trackman::Scaffold::ContentSaver
|
5
|
+
|
6
|
+
def self.clean
|
7
|
+
self.nodes_to_remove = {}
|
8
|
+
self.nodes_to_edit = {}
|
9
|
+
end
|
10
|
+
end
|
11
|
+
describe Trackman::Scaffold::ContentSaver do
|
12
|
+
before :all do
|
13
|
+
@saver = TestSaver.new
|
14
|
+
end
|
15
|
+
after :each do
|
16
|
+
TestSaver.clean
|
17
|
+
end
|
18
|
+
|
19
|
+
it "removes the a with an abc href" do
|
20
|
+
TestSaver.remove('a'){ |n| n['href'].include? 'abc' }
|
21
|
+
|
22
|
+
html = "
|
23
|
+
<html>
|
24
|
+
<head></head>
|
25
|
+
<body>
|
26
|
+
<a href='/hello'></a>
|
27
|
+
<a href='/abc'></a>
|
28
|
+
<a href='/world'></a>
|
29
|
+
</body>
|
30
|
+
</html>"
|
31
|
+
|
32
|
+
doc = Nokogiri::HTML(html)
|
33
|
+
@saver.send(:remove_nodes, doc)
|
34
|
+
actual = doc.to_s
|
35
|
+
|
36
|
+
actual.should_not include('abc')
|
37
|
+
actual.should include('/hello')
|
38
|
+
actual.should include('world')
|
39
|
+
end
|
40
|
+
|
41
|
+
it "removes the a with an abc href" do
|
42
|
+
TestSaver.remove 'a'
|
43
|
+
TestSaver.remove '.bobby'
|
44
|
+
|
45
|
+
html = "
|
46
|
+
<html>
|
47
|
+
<head></head>
|
48
|
+
<body>
|
49
|
+
<a href='/hello'></a>
|
50
|
+
<a href='/abc'></a>
|
51
|
+
<a href='/world'></a>
|
52
|
+
|
53
|
+
<div class='bobby'></div>
|
54
|
+
<div>
|
55
|
+
<p>allo</p>
|
56
|
+
</div>
|
57
|
+
</body>
|
58
|
+
</html>"
|
59
|
+
|
60
|
+
doc = Nokogiri::HTML(html)
|
61
|
+
@saver.send(:remove_nodes, doc)
|
62
|
+
actual = doc.to_s
|
63
|
+
|
64
|
+
actual.should_not include('<a href')
|
65
|
+
actual.should_not include('bobby')
|
66
|
+
end
|
67
|
+
|
68
|
+
it "edits all the href" do
|
69
|
+
TestSaver.edit('a'){ |e| e['href'] = 'bobby' }
|
70
|
+
|
71
|
+
html = "
|
72
|
+
<html>
|
73
|
+
<head></head>
|
74
|
+
<body>
|
75
|
+
<a href='/hello'></a>
|
76
|
+
<a href='/abc'></a>
|
77
|
+
<a href='/world'></a>
|
78
|
+
|
79
|
+
<div class='bobby'></div>
|
80
|
+
<div>
|
81
|
+
<p>allo</p>
|
82
|
+
</div>
|
83
|
+
</body>
|
84
|
+
</html>"
|
85
|
+
|
86
|
+
doc = Nokogiri::HTML(html)
|
87
|
+
@saver.send(:edit_nodes, doc)
|
88
|
+
actual = doc.to_s
|
89
|
+
|
90
|
+
actual.should_not include('/hello')
|
91
|
+
actual.should_not include('/abc')
|
92
|
+
actual.should_not include('/world')
|
93
|
+
actual.should include('bobby')
|
94
|
+
end
|
95
|
+
|
96
|
+
it "edits multiple things" do
|
97
|
+
TestSaver.edit 'a' do |e|
|
98
|
+
e['href'] = 'bobby' if e['href'] == '/abc'
|
99
|
+
end
|
100
|
+
|
101
|
+
TestSaver.edit '.bobby' do |e|
|
102
|
+
e.content = '<span>Allo</span>'
|
103
|
+
end
|
104
|
+
|
105
|
+
html = "
|
106
|
+
<html>
|
107
|
+
<head></head>
|
108
|
+
<body>
|
109
|
+
<a href='/hello'></a>
|
110
|
+
<a href='/abc'></a>
|
111
|
+
<a href='/world'></a>
|
112
|
+
|
113
|
+
<div class='bobby'></div>
|
114
|
+
<div>
|
115
|
+
<p>allo</p>
|
116
|
+
</div>
|
117
|
+
</body>
|
118
|
+
</html>"
|
119
|
+
|
120
|
+
doc = Nokogiri::HTML(html)
|
121
|
+
@saver.send(:edit_nodes, doc)
|
122
|
+
actual = doc.to_s
|
123
|
+
|
124
|
+
actual.should_not include('/abc')
|
125
|
+
actual.should include('bobby')
|
126
|
+
actual.should include('span')
|
127
|
+
end
|
128
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trackman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-09-
|
13
|
+
date: 2012-09-25 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rest-client
|
@@ -157,7 +157,11 @@ files:
|
|
157
157
|
- LICENSE
|
158
158
|
- README.md
|
159
159
|
- Rakefile
|
160
|
-
- lib/
|
160
|
+
- lib/generators/controller/USAGE
|
161
|
+
- lib/generators/controller/controller_generator.rb
|
162
|
+
- lib/generators/controller/templates/controller_layout.rb.erb
|
163
|
+
- lib/generators/controller/templates/view_layout.html.erb
|
164
|
+
- lib/railtie.rb
|
161
165
|
- lib/trackman.rb
|
162
166
|
- lib/trackman/assets.rb
|
163
167
|
- lib/trackman/assets/asset.rb
|
@@ -180,12 +184,19 @@ files:
|
|
180
184
|
- lib/trackman/assets/html_asset.rb
|
181
185
|
- lib/trackman/assets/remote_asset.rb
|
182
186
|
- lib/trackman/configuration_handler.rb
|
187
|
+
- lib/trackman/core_extensions.rb
|
183
188
|
- lib/trackman/debugger.rb
|
184
|
-
- lib/trackman/
|
185
|
-
- lib/trackman/
|
189
|
+
- lib/trackman/scaffold.rb
|
190
|
+
- lib/trackman/scaffold/content_saver.rb
|
191
|
+
- lib/trackman/scaffold/pretty-print.xslt
|
186
192
|
- lib/trackman/version.rb
|
187
|
-
- rails_generators/
|
188
|
-
- rails_generators/
|
193
|
+
- rails_generators/trackman_controller/USAGE
|
194
|
+
- rails_generators/trackman_controller/templates/controller_layout.rb.erb
|
195
|
+
- rails_generators/trackman_controller/templates/view_layout.html.erb
|
196
|
+
- rails_generators/trackman_controller/trackman_controller_generator.rb
|
197
|
+
- rails_generators/trackman_tasks/USAGE
|
198
|
+
- rails_generators/trackman_tasks/templates/trackman.rake
|
199
|
+
- rails_generators/trackman_tasks/trackman_tasks_generator.rb
|
189
200
|
- spec/asset_all_spec.rb
|
190
201
|
- spec/asset_factory_spec.rb
|
191
202
|
- spec/asset_spec.rb
|
@@ -438,6 +449,7 @@ files:
|
|
438
449
|
- spec/rails32/first_push_spec.rb
|
439
450
|
- spec/rails32_path_resolver_spec.rb
|
440
451
|
- spec/remote_asset_spec.rb
|
452
|
+
- spec/scaffolding_spec.rb
|
441
453
|
- spec/shippable_spec.rb
|
442
454
|
- spec/spec_helper.rb
|
443
455
|
- spec/sync_spec.rb
|
@@ -749,6 +761,7 @@ test_files:
|
|
749
761
|
- spec/rails32/first_push_spec.rb
|
750
762
|
- spec/rails32_path_resolver_spec.rb
|
751
763
|
- spec/remote_asset_spec.rb
|
764
|
+
- spec/scaffolding_spec.rb
|
752
765
|
- spec/shippable_spec.rb
|
753
766
|
- spec/spec_helper.rb
|
754
767
|
- spec/sync_spec.rb
|
data/lib/tasks.rb
DELETED