shining 1.3.5 → 1.3.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,9 @@
1
- = 1.3.5
1
+ = 1.3.6
2
+
3
+ * slide steps, so you can progressively show content.
4
+ * deploying to Heroku now tries to use the presentation's name as the application name.
5
+
6
+ = 1.3.5 (20/06/2010)
2
7
 
3
8
  * image loading now won't screw with the stage positioning.
4
9
  * slide styles loading now works again. Fuck my specless life.
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2010 Julio Cesar Ody
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/Rakefile CHANGED
@@ -26,6 +26,7 @@ begin
26
26
  gem.add_dependency 'json_pure', '>= 1.1.9'
27
27
  gem.add_dependency 'heroku', '>= 1.9.9'
28
28
  gem.add_dependency 'rack', '>= 0.9'
29
+ gem.add_dependency 'stringex', '>= 1.1.0'
29
30
  gem.add_dependency 'jeweler', '>= 1.4.0'
30
31
  gem.add_development_dependency 'rspec', '1.3.0'
31
32
  gem.add_development_dependency 'jspec', '4.2.0'
data/TODO.txt CHANGED
@@ -10,8 +10,6 @@
10
10
  - themes
11
11
  * add a white theme.
12
12
  - optimization
13
- * bundling of CSS and JS.
14
13
  * rely more on events so duplicate code is eliminated.
15
- * perhaps bundle at the rackup file level?
16
14
  - spec/tests
17
15
  * write my own test suite for this app.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.3.5
1
+ 1.3.6
data/bin/shine CHANGED
@@ -3,16 +3,18 @@
3
3
  $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
4
4
 
5
5
  require 'shining'
6
+ require 'stringex'
6
7
  include Shining::FileMethods
7
8
 
8
9
  ACTIONS = {
9
- :new_on! => ['build'],
10
- :new_slide! => ['slide'],
11
- :help_and_exit! => ['help', '-h', '--help'],
12
- :play => ['play', 'go'],
13
- :deploy => ['deploy'],
14
- :remove => ['remove', 'delete', 'rm'],
15
- :version => ['version', '-v']
10
+ :new_on! => ['build'],
11
+ :new_slide! => ['slide'],
12
+ :help_and_exit! => ['help', '-h', '--help'],
13
+ :play => ['play', 'go'],
14
+ :deploy => ['deploy'],
15
+ :remove => ['remove', 'delete', 'rm'],
16
+ :version => ['version', '-v'],
17
+ :start => ['go', 'start']
16
18
  }
17
19
 
18
20
  def bail! reason
@@ -64,14 +66,16 @@ def new_slide! name, format = 'html'
64
66
  end
65
67
 
66
68
  def play
67
- preso = Shining::Preso.open Dir.pwd
68
- player = Shining::Player.new preso
69
+ preso = Shining::Preso.open Dir.pwd
70
+ player = Shining::Player.new preso
69
71
  player.go!
70
72
  end
71
73
 
72
74
  def deploy name = nil
73
- preso = Shining::Preso.open Dir.pwd
74
- Shining::Heroku.deploy preso, name
75
+ preso = Shining::Preso.open(Dir.pwd)
76
+ heroku = Shining::Heroku.new preso
77
+ name ||= preso.name.to_url
78
+ heroku.deploy name
75
79
  end
76
80
 
77
81
  def remove slide
@@ -83,4 +87,11 @@ def version
83
87
  Shining.say Shining::VERSION
84
88
  end
85
89
 
90
+ def start port = 4567
91
+ preso = Shining::Preso.open Dir.pwd
92
+ raise "Cannot find the rackup command in your path. Make sure Rack is installed!" if `which rackup`.empty?
93
+ puts "Shining started on port #{port}."
94
+ `rackup -p #{port}`
95
+ end
96
+
86
97
  figure_what_to_do!
@@ -28,6 +28,8 @@ ul { display: inline-block; margin-left: 2em }
28
28
  #stage > * { text-rendering: optimizeLegibility }
29
29
  a { cursor: pointer }
30
30
 
31
+ .step { display: none }
32
+
31
33
  div.slice { position: absolute; display: block; width: 0; top: -10px; bottom: -10px }
32
34
 
33
35
  #help {
@@ -1,3 +1,6 @@
1
+ // Shining - http://shining.heroku.com
2
+ // Copyright (c) 2010 Julio Cesar Ody - See LICENSE.txt
3
+
1
4
  (function($) {
2
5
  var KEY = { SPACE: 32, RIGHT: 39, LEFT: 37 };
3
6
 
@@ -54,18 +57,8 @@
54
57
  // public methods
55
58
  firstSlide: function() { getSlide(Shining.slides.first()) },
56
59
  lastSlide: function() { getSlide(Shining.slides.last() ) },
57
- nextSlide: function() {
58
- if (Shining.slides.next()) {
59
- document.location.hash = Shining.slides.next();
60
- trigger('next');
61
- }
62
- },
63
- previousSlide: function() {
64
- if (Shining.slides.previous()) {
65
- document.location.hash = Shining.slides.previous();
66
- trigger('previous');
67
- }
68
- },
60
+ nextSlide: function() { if (Shining.slides.next()) { trigger('next') } },
61
+ previousSlide: function() { if (Shining.slides.previous()) { trigger('previous') } },
69
62
  getSlide: function(slide) { getSlide(slide) },
70
63
  help: help,
71
64
  init: init,
@@ -197,9 +190,7 @@
197
190
  $(window).resize(function() { centerStage() });
198
191
  $(document).ready(function() {
199
192
  bindKeys();
200
- when('previous', function() { help('←') });
201
- when('next', function() { help('→') });
202
- when('slideplay', function() { loadSlideStyle(arguments[1]) });
193
+ bindEvents();
203
194
  $(window).bind('hashchange', function(event) {
204
195
  var slide = document.location.hash.replace('#', '');
205
196
  if (slide) { Shining.getSlide(slide) };
@@ -344,6 +335,22 @@
344
335
  }
345
336
  })
346
337
  }
338
+
339
+ function bindEvents() {
340
+ when('previous', function() {
341
+ help('←');
342
+ document.location.hash = Shining.slides.previous();
343
+ });
344
+ when('next', function() {
345
+ help('→');
346
+ if ($('#stage .step:not(:visible)').length) {
347
+ $('#stage .step:not(:visible):first').show()
348
+ } else {
349
+ document.location.hash = Shining.slides.next();
350
+ }
351
+ });
352
+ when('slideplay', function() { loadSlideStyle(arguments[1]) });
353
+ }
347
354
 
348
355
  function centerStage() {
349
356
  var top = ($(window).height() - $('#stage').outerHeight()) / 2;
@@ -23,12 +23,12 @@ module Shining
23
23
  end
24
24
 
25
25
  def say something
26
- STDOUT.puts(something) unless quiet?
26
+ STDOUT.puts something unless quiet?
27
27
  yield if block_given?
28
28
  end
29
29
 
30
30
  def error message
31
- STDERR.puts message
31
+ STDERR.puts message unless quiet?
32
32
  end
33
33
 
34
34
  def root
@@ -1,26 +1,59 @@
1
- # Class that handles deploying a presentation to Heroku.
2
- # This is REALLY hard to spec, so I just won't. I'm sure you can forgive me.
1
+ # Handles deploying a presentation to Heroku.
2
+ require 'heroku'
3
+ require 'heroku/command'
3
4
 
4
5
  module Shining
5
6
 
6
7
  class Heroku
7
8
  extend FileMethods
8
- class << self
9
- def deploy preso, name
10
- check_for_git_and_heroku
11
- copy Shining.root/'lib'/'config.ru', preso.path
12
- change_dir preso.path
13
- `git init && git add . && git commit -m 'heroku deploy'`
14
- `heroku create #{name}`
15
- `git push heroku master`
16
- Shining.say "Done!"
9
+ class FailCreatingApp < RuntimeError; end
10
+
11
+ def initialize preso
12
+ raise RuntimeError, 'Git is either not installed or not in your PATH. Check and try again.' if `which git`.empty?
13
+ @preso = preso
14
+ @client = ::Heroku::Command.run_internal 'auth:client', []
15
+ end
16
+
17
+ def create_app name = preso.name
18
+ Shining.say "\tCreating #{name} on Heroku..."
19
+ begin
20
+ @client.create name
21
+ change_dir @preso.path
22
+ `git remote add heroku git@#{@client.host}:#{name}.git`
23
+ rescue RestClient::RequestFailed => error
24
+ case error.http_code
25
+ when 422
26
+ Shining.error "\tApparently #{name} already exists on Heroku. Try again with a different name."
27
+ else
28
+ Shining.error "\tAn error ocurred when creating #{name}. Maybe try again in a moment?"
29
+ end
30
+ raise FailCreatingApp
17
31
  end
32
+ end
18
33
 
19
- private
20
- def check_for_git_and_heroku
21
- raise RuntimeError, 'You need to install the heroku gem before deploying! (Usually "sudo gem install heroku")' if `which heroku`.empty?
22
- raise RuntimeError, 'Git is either not installed or not in your PATH. Check and try again.' if `which git`.empty?
34
+ def deploy name
35
+ copy Shining.root/'lib'/'config.ru', @preso.path
36
+ change_dir @preso.path
37
+ Shining.say "Creating Git repository on #{@preso.path}" do `git init` end unless git_repo?
38
+ Shining.say "Updating presentation's contents" do
39
+ `git add .`
40
+ system "git commit -a -m 'heroku deploy'"
23
41
  end
42
+ create_app(name) unless heroku_app?
43
+ Shining.say "Pushing to Heroku" do
44
+ system "git push heroku master"
45
+ end
46
+ Shining.say "Done! Visit http://#{name}.heroku.com to browse your presentation."
47
+ Shining.say "If you're updating, make sure you do a hard refresh (shift + refresh on most modern browsers)."
48
+ end
49
+
50
+ private
51
+ def git_repo?
52
+ dir? Dir.pwd/'.git'
53
+ end
54
+
55
+ def heroku_app?
56
+ `git remote`.split("\n").include? 'heroku'
24
57
  end
25
58
  end
26
59
 
@@ -5,7 +5,7 @@ module Shining
5
5
 
6
6
  class Preso
7
7
  include FileMethods and extend FileMethods
8
- attr_accessor :path
8
+ attr_reader :path, :name
9
9
 
10
10
  SLIDE_FORMATS = %w(haml markdown html)
11
11
 
@@ -16,7 +16,8 @@ class Preso
16
16
  copy_templates
17
17
  vendorize!
18
18
  end
19
- @config = json(@path/'config.json')
19
+ @config = json(@path/'config.json')
20
+ @name = @config['title']
20
21
  end
21
22
 
22
23
  def self.open dir
@@ -48,10 +49,10 @@ class Preso
48
49
  new_file path/'slides'/"#{name}.js" if options[:with].include?('script') rescue nil
49
50
  config['slides'] << file and save_config!
50
51
  end
51
-
52
+
52
53
  def remove_slide file
53
54
  file = basename(file)
54
- name, format = basename(file, extname(file)), extname(file).sub(/^./, '')
55
+ name, format = basename(file, extname(file)), extname(file).sub(/^./, '')
55
56
  delete! file
56
57
  delete! "#{name}.css"
57
58
  delete! "#{name}.js"
@@ -5,20 +5,22 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{shining}
8
- s.version = "1.3.5"
8
+ s.version = "1.3.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Julio Cesar Ody"]
12
- s.date = %q{2010-06-21}
12
+ s.date = %q{2010-07-12}
13
13
  s.default_executable = %q{shine}
14
14
  s.description = %q{HTML + CSS + Javascript = awesome presos}
15
15
  s.email = %q{julio.ody@gmail.com}
16
16
  s.executables = ["shine"]
17
17
  s.extra_rdoc_files = [
18
- "README.markdown"
18
+ "LICENSE.txt",
19
+ "README.markdown"
19
20
  ]
20
21
  s.files = [
21
22
  "CHANGELOG.txt",
23
+ "LICENSE.txt",
22
24
  "README.markdown",
23
25
  "Rakefile",
24
26
  "TODO.txt",
@@ -51,7 +53,7 @@ Gem::Specification.new do |s|
51
53
  "shining.gemspec",
52
54
  "spec/cli_spec.rb",
53
55
  "spec/filemethods_spec.rb",
54
- "spec/generators_spec.rb",
56
+ "spec/heroku_spec.rb",
55
57
  "spec/javascripts/dom.html",
56
58
  "spec/javascripts/rhino.js",
57
59
  "spec/javascripts/sample/config.json",
@@ -92,7 +94,7 @@ Gem::Specification.new do |s|
92
94
  s.test_files = [
93
95
  "spec/cli_spec.rb",
94
96
  "spec/filemethods_spec.rb",
95
- "spec/generators_spec.rb",
97
+ "spec/heroku_spec.rb",
96
98
  "spec/preso_spec.rb",
97
99
  "spec/shining_spec.rb",
98
100
  "spec/spec_helper.rb"
@@ -106,6 +108,7 @@ Gem::Specification.new do |s|
106
108
  s.add_runtime_dependency(%q<json_pure>, [">= 1.1.9"])
107
109
  s.add_runtime_dependency(%q<heroku>, [">= 1.9.9"])
108
110
  s.add_runtime_dependency(%q<rack>, [">= 0.9"])
111
+ s.add_runtime_dependency(%q<stringex>, [">= 1.1.0"])
109
112
  s.add_runtime_dependency(%q<jeweler>, [">= 1.4.0"])
110
113
  s.add_development_dependency(%q<rspec>, ["= 1.3.0"])
111
114
  s.add_development_dependency(%q<jspec>, ["= 4.2.0"])
@@ -114,6 +117,7 @@ Gem::Specification.new do |s|
114
117
  s.add_dependency(%q<json_pure>, [">= 1.1.9"])
115
118
  s.add_dependency(%q<heroku>, [">= 1.9.9"])
116
119
  s.add_dependency(%q<rack>, [">= 0.9"])
120
+ s.add_dependency(%q<stringex>, [">= 1.1.0"])
117
121
  s.add_dependency(%q<jeweler>, [">= 1.4.0"])
118
122
  s.add_dependency(%q<rspec>, ["= 1.3.0"])
119
123
  s.add_dependency(%q<jspec>, ["= 4.2.0"])
@@ -123,6 +127,7 @@ Gem::Specification.new do |s|
123
127
  s.add_dependency(%q<json_pure>, [">= 1.1.9"])
124
128
  s.add_dependency(%q<heroku>, [">= 1.9.9"])
125
129
  s.add_dependency(%q<rack>, [">= 0.9"])
130
+ s.add_dependency(%q<stringex>, [">= 1.1.0"])
126
131
  s.add_dependency(%q<jeweler>, [">= 1.4.0"])
127
132
  s.add_dependency(%q<rspec>, ["= 1.3.0"])
128
133
  s.add_dependency(%q<jspec>, ["= 4.2.0"])
@@ -0,0 +1,17 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe Shining::Heroku do
4
+ context "initializing" do
5
+ it "checks if Git is in the binaries path" do
6
+ old_path = ENV['PATH']
7
+ ENV['PATH'] = ""
8
+ lambda do Shining::Heroku.new(@preso) end.should raise_error
9
+ ENV['PATH'] = old_path
10
+ end
11
+
12
+ it "instances a new Heroku::Client" do
13
+ Heroku::Command.should_receive(:run_internal).with('auth:client', []).and_return(mock_heroku_client)
14
+ Shining::Heroku.new @preso
15
+ end
16
+ end
17
+ end
@@ -1,17 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), 'spec_helper')
2
2
 
3
3
  describe Shining::Preso do
4
- before :all do
5
- TMP = Dir.tmpdir/'shining-tmp' unless defined?(TMP)
6
- FileUtils.rm_rf TMP
7
- FileUtils.mkdir_p TMP
8
- end
9
-
10
- before :each do
11
- FileUtils.rm_rf TMP/'temp'
12
- @preso = Shining::Preso.new TMP/'temp'
13
- end
14
-
15
4
  context '#new' do
16
5
  it "creates a folder for the presentation on #new" do
17
6
  File.directory?(TMP/'temp').should be_true
@@ -29,7 +18,7 @@ describe Shining::Preso do
29
18
 
30
19
  context "#open" do
31
20
  it "opens an existing presentation" do
32
- @preso.should be_an_instance_of(Shining::Preso)
21
+ @preso.should be_an_instance_of Shining::Preso
33
22
  end
34
23
 
35
24
  it "errors out if the directory is not a Shining presentation" do
@@ -82,4 +71,8 @@ describe Shining::Preso do
82
71
  it "returns a list of the presentation's slides" do
83
72
  @preso.slides.should include('welcome.html')
84
73
  end
74
+
75
+ it "returns the preso's name on #name" do
76
+ @preso.name.should == "Your presentation"
77
+ end
85
78
  end
@@ -1,4 +1,5 @@
1
1
  {
2
2
  "slides": ["first", "second", "third"],
3
- "transitions": false
3
+ "transitions": false,
4
+ "title": "Light and shadow"
4
5
  }
@@ -2,9 +2,25 @@ require 'rubygems'
2
2
  require 'tmpdir'
3
3
  require File.join(File.dirname(__FILE__), *%w(.. lib shining))
4
4
 
5
- gem 'rspec', '>= 1.3.0'; require 'spec'
5
+ gem 'rspec', '= 1.3.0'; require 'spec'
6
6
  gem 'rake', '>= 0.8.7'; require 'rake'
7
7
  gem 'json_pure', '>= 1.1.9'; require 'json/pure'
8
- gem 'haml', '>= 2.2.17'; require 'haml'
9
8
 
10
- Shining.quiet!
9
+ Shining.quiet!
10
+
11
+ def mock_heroku_client
12
+ zemock = mock Heroku::Client, :host => 'heroku.com', :password => 'foo', :user => 'bar'
13
+ end
14
+
15
+ Spec::Runner.configure do |config|
16
+ config.before :all do
17
+ TMP = Dir.tmpdir/'shining-tmp' unless defined?(TMP)
18
+ FileUtils.rm_rf TMP
19
+ FileUtils.mkdir_p TMP
20
+ end
21
+
22
+ config.before :each do
23
+ FileUtils.rm_rf TMP/'temp'
24
+ @preso = Shining::Preso.new TMP/'temp'
25
+ end
26
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shining
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 3
9
- - 5
10
- version: 1.3.5
9
+ - 6
10
+ version: 1.3.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Julio Cesar Ody
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-06-21 00:00:00 +10:00
18
+ date: 2010-07-12 00:00:00 +10:00
19
19
  default_executable: shine
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -66,9 +66,25 @@ dependencies:
66
66
  type: :runtime
67
67
  version_requirements: *id003
68
68
  - !ruby/object:Gem::Dependency
69
- name: jeweler
69
+ name: stringex
70
70
  prerelease: false
71
71
  requirement: &id004 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ hash: 19
77
+ segments:
78
+ - 1
79
+ - 1
80
+ - 0
81
+ version: 1.1.0
82
+ type: :runtime
83
+ version_requirements: *id004
84
+ - !ruby/object:Gem::Dependency
85
+ name: jeweler
86
+ prerelease: false
87
+ requirement: &id005 !ruby/object:Gem::Requirement
72
88
  none: false
73
89
  requirements:
74
90
  - - ">="
@@ -80,11 +96,11 @@ dependencies:
80
96
  - 0
81
97
  version: 1.4.0
82
98
  type: :runtime
83
- version_requirements: *id004
99
+ version_requirements: *id005
84
100
  - !ruby/object:Gem::Dependency
85
101
  name: rspec
86
102
  prerelease: false
87
- requirement: &id005 !ruby/object:Gem::Requirement
103
+ requirement: &id006 !ruby/object:Gem::Requirement
88
104
  none: false
89
105
  requirements:
90
106
  - - "="
@@ -96,11 +112,11 @@ dependencies:
96
112
  - 0
97
113
  version: 1.3.0
98
114
  type: :development
99
- version_requirements: *id005
115
+ version_requirements: *id006
100
116
  - !ruby/object:Gem::Dependency
101
117
  name: jspec
102
118
  prerelease: false
103
- requirement: &id006 !ruby/object:Gem::Requirement
119
+ requirement: &id007 !ruby/object:Gem::Requirement
104
120
  none: false
105
121
  requirements:
106
122
  - - "="
@@ -112,11 +128,11 @@ dependencies:
112
128
  - 0
113
129
  version: 4.2.0
114
130
  type: :development
115
- version_requirements: *id006
131
+ version_requirements: *id007
116
132
  - !ruby/object:Gem::Dependency
117
133
  name: rake
118
134
  prerelease: false
119
- requirement: &id007 !ruby/object:Gem::Requirement
135
+ requirement: &id008 !ruby/object:Gem::Requirement
120
136
  none: false
121
137
  requirements:
122
138
  - - "="
@@ -128,7 +144,7 @@ dependencies:
128
144
  - 7
129
145
  version: 0.8.7
130
146
  type: :development
131
- version_requirements: *id007
147
+ version_requirements: *id008
132
148
  description: HTML + CSS + Javascript = awesome presos
133
149
  email: julio.ody@gmail.com
134
150
  executables:
@@ -136,9 +152,11 @@ executables:
136
152
  extensions: []
137
153
 
138
154
  extra_rdoc_files:
155
+ - LICENSE.txt
139
156
  - README.markdown
140
157
  files:
141
158
  - CHANGELOG.txt
159
+ - LICENSE.txt
142
160
  - README.markdown
143
161
  - Rakefile
144
162
  - TODO.txt
@@ -171,7 +189,7 @@ files:
171
189
  - shining.gemspec
172
190
  - spec/cli_spec.rb
173
191
  - spec/filemethods_spec.rb
174
- - spec/generators_spec.rb
192
+ - spec/heroku_spec.rb
175
193
  - spec/javascripts/dom.html
176
194
  - spec/javascripts/rhino.js
177
195
  - spec/javascripts/sample/config.json
@@ -240,7 +258,7 @@ summary: HTML + CSS + Javascript = awesome presos
240
258
  test_files:
241
259
  - spec/cli_spec.rb
242
260
  - spec/filemethods_spec.rb
243
- - spec/generators_spec.rb
261
+ - spec/heroku_spec.rb
244
262
  - spec/preso_spec.rb
245
263
  - spec/shining_spec.rb
246
264
  - spec/spec_helper.rb
File without changes