dashing-rails 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.md +161 -0
- data/Rakefile +6 -0
- data/app/assets/fonts/dashing/fontawesome-webfont.eot +0 -0
- data/app/assets/fonts/dashing/fontawesome-webfont.svg +255 -0
- data/app/assets/fonts/dashing/fontawesome-webfont.ttf +0 -0
- data/app/assets/fonts/dashing/fontawesome-webfont.woff +0 -0
- data/app/assets/javascripts/dashing/application.js +27 -0
- data/app/assets/javascripts/dashing/dashing-src.coffee +110 -0
- data/app/assets/javascripts/dashing/dashing.coffee +18 -0
- data/app/assets/stylesheets/dashing/application.css +17 -0
- data/app/assets/stylesheets/dashing/dashing.scss +250 -0
- data/app/controllers/dashing/application_controller.rb +15 -0
- data/app/controllers/dashing/dashboards_controller.rb +31 -0
- data/app/controllers/dashing/events_controller.rb +25 -0
- data/app/controllers/dashing/widgets_controller.rb +50 -0
- data/app/helpers/dashing/application_helper.rb +4 -0
- data/app/views/dashing/default_widgets/clock/clock.coffee +18 -0
- data/app/views/dashing/default_widgets/clock/clock.html +2 -0
- data/app/views/dashing/default_widgets/clock/clock.scss +13 -0
- data/app/views/dashing/default_widgets/comments/comments.coffee +24 -0
- data/app/views/dashing/default_widgets/comments/comments.html +7 -0
- data/app/views/dashing/default_widgets/comments/comments.scss +33 -0
- data/app/views/dashing/default_widgets/graph/graph.coffee +35 -0
- data/app/views/dashing/default_widgets/graph/graph.html +5 -0
- data/app/views/dashing/default_widgets/graph/graph.scss +65 -0
- data/app/views/dashing/default_widgets/iframe/iframe.coffee +9 -0
- data/app/views/dashing/default_widgets/iframe/iframe.html +1 -0
- data/app/views/dashing/default_widgets/iframe/iframe.scss +8 -0
- data/app/views/dashing/default_widgets/image/image.coffee +9 -0
- data/app/views/dashing/default_widgets/image/image.html +1 -0
- data/app/views/dashing/default_widgets/image/image.scss +13 -0
- data/app/views/dashing/default_widgets/index.css +12 -0
- data/app/views/dashing/default_widgets/index.js +13 -0
- data/app/views/dashing/default_widgets/list/list.coffee +6 -0
- data/app/views/dashing/default_widgets/list/list.html +18 -0
- data/app/views/dashing/default_widgets/list/list.scss +60 -0
- data/app/views/dashing/default_widgets/meter/meter.coffee +14 -0
- data/app/views/dashing/default_widgets/meter/meter.html +7 -0
- data/app/views/dashing/default_widgets/meter/meter.scss +35 -0
- data/app/views/dashing/default_widgets/number/number.coffee +24 -0
- data/app/views/dashing/default_widgets/number/number.html +11 -0
- data/app/views/dashing/default_widgets/number/number.scss +39 -0
- data/app/views/dashing/default_widgets/text/text.coffee +1 -0
- data/app/views/dashing/default_widgets/text/text.html +7 -0
- data/app/views/dashing/default_widgets/text/text.scss +32 -0
- data/app/views/layouts/dashing/dashboard.html.erb +30 -0
- data/config/routes.rb +15 -0
- data/lib/assets/javascripts/batman.jquery.js +163 -0
- data/lib/assets/javascripts/batman.js +13680 -0
- data/lib/assets/javascripts/d3.v2.min.js +4 -0
- data/lib/assets/javascripts/dashing.gridster.coffee +35 -0
- data/lib/assets/javascripts/es5-shim.js +1021 -0
- data/lib/assets/javascripts/jquery.gridster.js +2890 -0
- data/lib/assets/javascripts/jquery.js +4 -0
- data/lib/assets/javascripts/jquery.knob.js +646 -0
- data/lib/assets/javascripts/jquery.leanModal.min.js +5 -0
- data/lib/assets/javascripts/jquery.timeago.js +184 -0
- data/lib/assets/javascripts/moment.min.js +6 -0
- data/lib/assets/javascripts/rickshaw.min.js +2 -0
- data/lib/assets/stylesheets/font-awesome.css +303 -0
- data/lib/assets/stylesheets/jquery.gridster.css +57 -0
- data/lib/dashing.rb +29 -0
- data/lib/dashing/configuration.rb +26 -0
- data/lib/dashing/engine.rb +13 -0
- data/lib/dashing/version.rb +3 -0
- data/lib/generators/dashing/install_generator.rb +32 -0
- data/lib/generators/dashing/job_generator.rb +15 -0
- data/lib/generators/templates/dashboards/sample.html.erb +28 -0
- data/lib/generators/templates/initializer.rb +50 -0
- data/lib/generators/templates/jobs/new.rb +3 -0
- data/lib/generators/templates/jobs/sample.rb +9 -0
- data/lib/generators/templates/widgets/index.css +12 -0
- data/lib/generators/templates/widgets/index.js +13 -0
- data/lib/tasks/dashing_tasks.rake +4 -0
- data/spec/controllers/dashing/dashboards_controller_spec.rb +42 -0
- data/spec/controllers/dashing/events_controller_spec.rb +11 -0
- data/spec/controllers/dashing/widgets_controller_spec.rb +61 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/dashing/dashboards/foo.erb +0 -0
- data/spec/dummy/app/views/dashing/widgets/foo/foo.coffee +0 -0
- data/spec/dummy/app/views/dashing/widgets/foo/foo.html +0 -0
- data/spec/dummy/app/views/dashing/widgets/foo/foo.scss +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/app/views/layouts/dashing/dashboard.html.erb +30 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +23 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +36 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/test.log +27 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/lib/dashing/configuration_spec.rb +43 -0
- data/spec/lib/dashing_spec.rb +41 -0
- data/spec/spec_helper.rb +44 -0
- metadata +342 -0
@@ -0,0 +1,57 @@
|
|
1
|
+
/*! gridster.js - v0.1.0 - 2012-08-14
|
2
|
+
* http://gridster.net/
|
3
|
+
* Copyright (c) 2012 ducksboard; Licensed MIT */
|
4
|
+
|
5
|
+
.gridster {
|
6
|
+
position:relative;
|
7
|
+
}
|
8
|
+
|
9
|
+
.gridster > * {
|
10
|
+
margin: 0 auto;
|
11
|
+
-webkit-transition: height .4s;
|
12
|
+
-moz-transition: height .4s;
|
13
|
+
-o-transition: height .4s;
|
14
|
+
-ms-transition: height .4s;
|
15
|
+
transition: height .4s;
|
16
|
+
}
|
17
|
+
|
18
|
+
.gridster .gs_w{
|
19
|
+
z-index: 2;
|
20
|
+
position: absolute;
|
21
|
+
}
|
22
|
+
|
23
|
+
.ready .gs_w:not(.preview-holder) {
|
24
|
+
-webkit-transition: opacity .3s, left .3s, top .3s;
|
25
|
+
-moz-transition: opacity .3s, left .3s, top .3s;
|
26
|
+
-o-transition: opacity .3s, left .3s, top .3s;
|
27
|
+
transition: opacity .3s, left .3s, top .3s;
|
28
|
+
}
|
29
|
+
|
30
|
+
.gridster .preview-holder {
|
31
|
+
z-index: 1;
|
32
|
+
position: absolute;
|
33
|
+
background-color: #fff;
|
34
|
+
border-color: #fff;
|
35
|
+
opacity: 0.3;
|
36
|
+
}
|
37
|
+
|
38
|
+
.gridster .player-revert {
|
39
|
+
z-index: 10!important;
|
40
|
+
-webkit-transition: left .3s, top .3s!important;
|
41
|
+
-moz-transition: left .3s, top .3s!important;
|
42
|
+
-o-transition: left .3s, top .3s!important;
|
43
|
+
transition: left .3s, top .3s!important;
|
44
|
+
}
|
45
|
+
|
46
|
+
.gridster .dragging {
|
47
|
+
z-index: 10!important;
|
48
|
+
-webkit-transition: all 0s !important;
|
49
|
+
-moz-transition: all 0s !important;
|
50
|
+
-o-transition: all 0s !important;
|
51
|
+
transition: all 0s !important;
|
52
|
+
}
|
53
|
+
|
54
|
+
/* Uncomment this if you set helper : "clone" in draggable options */
|
55
|
+
/*.gridster .player {
|
56
|
+
opacity:0;
|
57
|
+
}*/
|
data/lib/dashing.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
module Dashing
|
2
|
+
class << self
|
3
|
+
|
4
|
+
delegate :scheduler, :redis, to: :config
|
5
|
+
|
6
|
+
attr_accessor :configuration
|
7
|
+
|
8
|
+
def config
|
9
|
+
self.configuration ||= Configuration.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def configure
|
13
|
+
yield config
|
14
|
+
end
|
15
|
+
|
16
|
+
def first_dashboard
|
17
|
+
files = Dir[Rails.root.join(config.dashboards_path, '*')].collect { |f| File.basename(f, '.*') }
|
18
|
+
files.sort.first
|
19
|
+
end
|
20
|
+
|
21
|
+
def send_event(id, data)
|
22
|
+
redis.publish("#{Dashing.config.redis_namespace}.create", data.merge(id: id, updatedAt: Time.now.utc.to_i).to_json)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
require 'dashing/configuration'
|
29
|
+
require 'dashing/engine'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rufus-scheduler'
|
2
|
+
require 'redis'
|
3
|
+
|
4
|
+
module Dashing
|
5
|
+
class Configuration
|
6
|
+
|
7
|
+
attr_accessor :scheduler, :redis, :view_path, :jobs_path, :redis_namespace,
|
8
|
+
:engine_path, :dashboards_path, :dashboard_layout,
|
9
|
+
:widgets_path, :default_dashboard, :auth_token
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@scheduler = ::Rufus::Scheduler.new
|
13
|
+
@redis = ::Redis.new
|
14
|
+
@redis_namespace = 'dashing_events'
|
15
|
+
@view_path = 'app/views/dashing/'
|
16
|
+
@jobs_path = 'app/jobs/'
|
17
|
+
@engine_path = '/dashing'
|
18
|
+
@dashboards_path = 'app/views/dashing/dashboards/'
|
19
|
+
@dashboard_layout = 'dashing/dashboard'
|
20
|
+
@widgets_path = 'app/views/dashing/widgets/'
|
21
|
+
@default_dashboard = nil
|
22
|
+
@auth_token = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Dashing
|
2
|
+
class Engine < ::Rails::Engine
|
3
|
+
isolate_namespace Dashing
|
4
|
+
|
5
|
+
config.assets.paths << Dashing::Engine.root.join('app', 'assets', 'fonts')
|
6
|
+
config.assets.paths << Dashing::Engine.root.join('app', 'views', 'dashing')
|
7
|
+
config.assets.paths << Dashing.config.view_path
|
8
|
+
|
9
|
+
initializer 'require dashing jobs' do
|
10
|
+
Dir[Rails.root.join(Dashing.config.jobs_path, '**', '*.rb')].each { |file| require file }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Dashing
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < ::Rails::Generators::Base
|
4
|
+
|
5
|
+
source_root File.expand_path('../../templates', __FILE__)
|
6
|
+
|
7
|
+
desc 'Creates a Dashing initializer for your application.'
|
8
|
+
|
9
|
+
def install
|
10
|
+
route 'mount Dashing::Engine, at: Dashing.config.engine_path'
|
11
|
+
end
|
12
|
+
|
13
|
+
def copy_initializer
|
14
|
+
template 'initializer.rb', 'config/initializers/dashing.rb'
|
15
|
+
end
|
16
|
+
|
17
|
+
def copy_dashboard
|
18
|
+
template 'dashboards/sample.html.erb', 'app/views/dashing/dashboards/sample.html.erb'
|
19
|
+
end
|
20
|
+
|
21
|
+
def copy_widget_manifests
|
22
|
+
template 'widgets/index.css', 'app/views/dashing/widgets/index.css'
|
23
|
+
template 'widgets/index.js', 'app/views/dashing/widgets/index.js'
|
24
|
+
end
|
25
|
+
|
26
|
+
def copy_job
|
27
|
+
template 'jobs/sample.rb', 'app/jobs/sample.rb'
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Dashing
|
2
|
+
module Generators
|
3
|
+
class JobGenerator < ::Rails::Generators::NamedBase
|
4
|
+
|
5
|
+
source_root File.expand_path('../../templates', __FILE__)
|
6
|
+
|
7
|
+
desc 'Creates a new Dashing job.'
|
8
|
+
|
9
|
+
def job
|
10
|
+
template 'jobs/new.rb', "app/jobs/#{file_name}.rb"
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<%% content_for :title do %>
|
2
|
+
My super sweet dashboard
|
3
|
+
<%% end %>
|
4
|
+
|
5
|
+
<div class="gridster">
|
6
|
+
<ul>
|
7
|
+
<li data-row="1" data-col="1" data-sizex="2" data-sizey="1">
|
8
|
+
<div data-id="welcome" data-view="Text" data-title="Hello" data-text="This is your shiny new dashboard." data-moreinfo="Protip: You can drag the widgets around!"></div>
|
9
|
+
</li>
|
10
|
+
|
11
|
+
<li data-row="1" data-col="1" data-sizex="1" data-sizey="1">
|
12
|
+
<div data-id="synergy" data-view="Meter" data-title="Synergy" data-min="0" data-max="100"></div>
|
13
|
+
</li>
|
14
|
+
|
15
|
+
<li data-row="1" data-col="1" data-sizex="1" data-sizey="2">
|
16
|
+
<div data-id="buzzwords" data-view="List" data-unordered="true" data-title="Buzzwords" data-moreinfo="# of times said around the office"></div>
|
17
|
+
</li>
|
18
|
+
|
19
|
+
<li data-row="1" data-col="1" data-sizex="1" data-sizey="1">
|
20
|
+
<div data-id="valuation" data-view="Number" data-title="Current Valuation" data-moreinfo="In billions" data-prefix="$"></div>
|
21
|
+
</li>
|
22
|
+
|
23
|
+
<li data-row="1" data-col="1" data-sizex="2" data-sizey="1">
|
24
|
+
<div data-id="convergence" data-view="Graph" data-title="Convergence" style="background-color:#ff9618"></div>
|
25
|
+
</li>
|
26
|
+
</ul>
|
27
|
+
<center><div style="font-size: 12px">Try this: curl -d '{ "auth_token": "YOUR_AUTH_TOKEN", "text": "Hey, Look what I can do!" }' \http://<%%= request.host %>:<%%= request.port %>/widgets/welcome</div></center>
|
28
|
+
</div>
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# Use this hook to configure Dashing bahaviors.
|
2
|
+
Dashing.configure do |config|
|
3
|
+
# Scheduler instance.
|
4
|
+
# config.scheduler = ::Rufus::Scheduler.new
|
5
|
+
|
6
|
+
# Redis instance.
|
7
|
+
# config.redis = ::Redis.new
|
8
|
+
|
9
|
+
# Redis namespace when pushing new data.
|
10
|
+
# config.redis_namespace = 'dashing_events'
|
11
|
+
|
12
|
+
# Dashing come with default widgets using css and coffeescript.
|
13
|
+
# You can create your own widgets by creating a new folder at the following
|
14
|
+
# path by default: `/app/views/dashing/`
|
15
|
+
#
|
16
|
+
# A widget folder is composed of:
|
17
|
+
# - an HTML file used for layout and bindings
|
18
|
+
# - a SCSS file for styles
|
19
|
+
# - a coffeescript file which allows you to handle incoming data & functionality
|
20
|
+
#
|
21
|
+
# CSS and JS file will be added to the asset path and the asset pipeline automatically.
|
22
|
+
#
|
23
|
+
# More information at http://shopify.github.io/dashing/
|
24
|
+
# config.view_path = 'app/views/dashing/'
|
25
|
+
|
26
|
+
# rufus-scheduler worker path
|
27
|
+
# config.jobs_path = 'app/jobs/'
|
28
|
+
|
29
|
+
# Engine path to use for accessing engine's routes.
|
30
|
+
# Ex: http://your_app/dashing/dashboard/my_dashboard_name
|
31
|
+
# config.engine_path = '/dashing'
|
32
|
+
|
33
|
+
# The dashboards path used to find dashboards.
|
34
|
+
# config.dashboards_path = 'app/views/dashing/dashboards/'
|
35
|
+
|
36
|
+
# The Dashing layout used to display metrics.
|
37
|
+
# config.dashboard_layout = 'dashing/dashboard'
|
38
|
+
|
39
|
+
# The widgets path used to find your custom widgets.
|
40
|
+
# Dashing provide default widgets.
|
41
|
+
# config.widgets_path = 'app/views/dashing/widgets/'
|
42
|
+
|
43
|
+
# Default dashboard name to load when going to /dashing/dashboards
|
44
|
+
# config.default_dashboard = nil
|
45
|
+
|
46
|
+
# A secure random string to authenticate with for curl requests.
|
47
|
+
# Put nil if you don't want to use authentication.
|
48
|
+
# You can use SecureRandom.hex to generate a hex.
|
49
|
+
# config.auth_token = nil
|
50
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
current_valuation = 0
|
2
|
+
|
3
|
+
Dashing.scheduler.every '2s' do
|
4
|
+
last_valuation = current_valuation
|
5
|
+
current_valuation = rand(100)
|
6
|
+
|
7
|
+
Dashing.send_event('valuation', { current: current_valuation, last: last_valuation })
|
8
|
+
Dashing.send_event('synergy', { value: rand(100) })
|
9
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
9
|
+
* compiled file, but it's generally better to create a new file per style scope.
|
10
|
+
*
|
11
|
+
*= require_tree .
|
12
|
+
*/
|
@@ -0,0 +1,13 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// the compiled file.
|
9
|
+
//
|
10
|
+
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
|
11
|
+
// GO AFTER THE REQUIRES BELOW.
|
12
|
+
//
|
13
|
+
//= require_tree .
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Dashing::DashboardsController do
|
4
|
+
|
5
|
+
describe 'GET "index"' do
|
6
|
+
|
7
|
+
def action
|
8
|
+
get :index, use_route: :dashing
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'responds success' do
|
12
|
+
action
|
13
|
+
expect(response).to be_success
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'GET "show"' do
|
19
|
+
|
20
|
+
def action(params = {})
|
21
|
+
get :show, params.merge(use_route: :dashing)
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when template exists' do
|
25
|
+
|
26
|
+
it 'responds success' do
|
27
|
+
action(name: 'foo')
|
28
|
+
expect(response).to be_success
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when template does not exist' do
|
34
|
+
|
35
|
+
it { expect { action }.to raise_error }
|
36
|
+
it { expect { action(name: 'bar') }.to raise_error }
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Dashing::WidgetsController do
|
4
|
+
|
5
|
+
describe 'GET "show"' do
|
6
|
+
|
7
|
+
def action(params = {})
|
8
|
+
get :show, params.merge(use_route: :dashing)
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'when default template exists' do
|
12
|
+
|
13
|
+
it 'responds success' do
|
14
|
+
action(name: 'text')
|
15
|
+
expect(response).to be_success
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'when template exists in main app' do
|
21
|
+
|
22
|
+
it 'responds success' do
|
23
|
+
action(name: 'foo')
|
24
|
+
expect(response).to be_success
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'when template does not exist' do
|
30
|
+
|
31
|
+
it { expect { action }.to raise_error }
|
32
|
+
it { expect { action(name: 'bar') }.to raise_error }
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'PUT "update"' do
|
39
|
+
|
40
|
+
def action(params = {})
|
41
|
+
put :update, params.merge(use_route: :dashing)
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when valid' do
|
45
|
+
|
46
|
+
it 'responds success' do
|
47
|
+
action(name: 'foo')
|
48
|
+
expect(response).to be_success
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'when not valid' do
|
54
|
+
|
55
|
+
it { expect { action }.to raise_error }
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
== README
|
2
|
+
|
3
|
+
This README would normally document whatever steps are necessary to get the
|
4
|
+
application up and running.
|
5
|
+
|
6
|
+
Things you may want to cover:
|
7
|
+
|
8
|
+
* Ruby version
|
9
|
+
|
10
|
+
* System dependencies
|
11
|
+
|
12
|
+
* Configuration
|
13
|
+
|
14
|
+
* Database creation
|
15
|
+
|
16
|
+
* Database initialization
|
17
|
+
|
18
|
+
* How to run the test suite
|
19
|
+
|
20
|
+
* Services (job queues, cache servers, search engines, etc.)
|
21
|
+
|
22
|
+
* Deployment instructions
|
23
|
+
|
24
|
+
* ...
|
25
|
+
|
26
|
+
|
27
|
+
Please feel free to use a different markup language if you do not plan to run
|
28
|
+
<tt>rake doc:app</tt>.
|