hoverboard 0.1.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/lib/hoverboard.rb ADDED
@@ -0,0 +1,34 @@
1
+ require 'hoverboard/configuration'
2
+ require 'hoverboard/rack_app'
3
+ require 'hoverboard/helpers'
4
+ require 'hoverboard/rails' if defined?(Rails)
5
+ require 'hoverboard/assets'
6
+
7
+ module Hoverboard
8
+
9
+ class << self
10
+ attr_writer :configuration
11
+
12
+ def configuration
13
+ @configuration ||= Configuration.new
14
+ end
15
+
16
+ def configure
17
+ yield(configuration)
18
+ end
19
+
20
+ def load_rake_tasks!
21
+ load gem_root+'lib/hoverboard/tasks.rb'
22
+ end
23
+
24
+ def assets_path
25
+ @assets_path ||= gem_root+'assets'
26
+ end
27
+
28
+ def gem_root
29
+ @gem_root ||= Pathname('../..').expand_path(__FILE__)
30
+ end
31
+
32
+ include Assets
33
+ end
34
+ end
@@ -0,0 +1,63 @@
1
+
2
+ module Hoverboard
3
+ module Assets
4
+ class << self
5
+ def rebuild!
6
+ Hoverboard.assets_path.mkpath
7
+
8
+ Hoverboard.javascript_file.open('w') {|f| f << Hoverboard.javascript}
9
+ Hoverboard.css_file.open('w') {|f| f << Hoverboard.css }
10
+ end
11
+ end
12
+
13
+ autoload :Image , 'hoverboard/assets/image'
14
+ autoload :Context, 'hoverboard/assets/context'
15
+
16
+ def template_ctx
17
+ Context.new
18
+ end
19
+
20
+ def mustache
21
+ @mustache ||= begin
22
+ require 'mustache'
23
+ Mustache
24
+ end
25
+ end
26
+
27
+ def javascript
28
+ mustache.render(javascript_template_file.read, Context.new)
29
+ end
30
+
31
+ def css
32
+ mustache.render(css_template_file.read, Context.new)
33
+ end
34
+
35
+ def dev_root
36
+ @dev_root ||= gem_root+'dev'
37
+ end
38
+
39
+ def javascript_template_file
40
+ @javascript_template_file ||= dev_root+'javascripts/hoverboard.js.mustache'
41
+ end
42
+
43
+ def css_template_file
44
+ @css_template_file ||= dev_root+'stylesheets/hoverboard.css.mustache'
45
+ end
46
+
47
+ def javascript_file
48
+ @javascript_file ||= assets_path+'hoverboard.js'
49
+ end
50
+
51
+ def css_file
52
+ @css_file ||= assets_path+'hoverboard.css'
53
+ end
54
+
55
+ def inline_javascript
56
+ javascript_file.exist? ? javascript_file.read : ''
57
+ end
58
+
59
+ def inline_css
60
+ css_file.exist? ? css_file.read : ''
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,28 @@
1
+ module Hoverboard
2
+ module Assets
3
+ class Context
4
+
5
+ # bg becomes bg_uri. bg_uri yields a data uri of the image.
6
+ ImageMap = {
7
+ :bg => 'uat-bg.png',
8
+ :logo => 'uat-logo.gif',
9
+ :accept => 'accept.png',
10
+ :reject => 'reject.png',
11
+ :pt => 'pt.png',
12
+ :btnreject => 'btnreject.png',
13
+ :spinner => 'spinner.gif'
14
+ }
15
+
16
+ ImageMap.each do |k,v|
17
+ define_method("#{k}_uri") { Image.new( images_root + v ) }
18
+ end
19
+
20
+ protected
21
+
22
+ def images_root
23
+ @images_root ||= Hoverboard.dev_root+'images'
24
+ end
25
+ end
26
+ end
27
+ end
28
+
@@ -0,0 +1,22 @@
1
+ module Hoverboard
2
+ module Assets
3
+ class Image
4
+ def initialize(path)
5
+ @path = Pathname(path)
6
+ end
7
+
8
+ def to_s
9
+ "data:#{content_type};base64," + ([@path.read].pack("m").gsub("\n",''))
10
+ end
11
+
12
+ def content_type
13
+ case @path.to_s[/\.([^\.]+)$/,1]
14
+ when 'png'
15
+ 'image/png'
16
+ when 'gif'
17
+ 'image/gif'
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,6 @@
1
+ module Hoverboard
2
+ class Configuration
3
+ attr_accessor :pivotal_tracker_token
4
+ attr_accessor :pivotal_tracker_project
5
+ end
6
+ end
@@ -0,0 +1,11 @@
1
+ module Hoverboard
2
+ module Helpers
3
+ def hoverboard
4
+ wua = "<style type='text/css'>#{Hoverboard.inline_css}</style>" +
5
+ "<script type='text/javascript'>#{Hoverboard.inline_javascript}</script>"
6
+
7
+ wua.respond_to?(:html_safe) ? wua.html_safe : wua
8
+ end
9
+ end
10
+ end
11
+
@@ -0,0 +1,94 @@
1
+ require 'pathname'
2
+ require 'haml'
3
+ require 'pivotal-tracker'
4
+
5
+ require 'pp'
6
+
7
+ module Hoverboard
8
+ class RackApp
9
+ PT = PivotalTracker
10
+
11
+ def initialize(app)
12
+ @app = app
13
+ PT::Client.token = config.pivotal_tracker_token
14
+ end
15
+
16
+ def call(env)
17
+ req = Rack::Request.new(env)
18
+
19
+ if env?('development') && dev_rsp = dev_mode(req)
20
+ return dev_rsp
21
+ end
22
+
23
+ case req.path
24
+ when %r{^/hoverboard$}
25
+ index
26
+ when %r{^/hoverboard/(.*)/accept}
27
+ accept $1
28
+ when %r{^/hoverboard/(.*)/reject}
29
+ reject $1, req.params["reason"]
30
+ else
31
+ @app.call(env)
32
+ end
33
+ end
34
+
35
+ def env?(env)
36
+ (ENV['RACK_ENV'] || (defined?(Rails) && Rails.env)) == env
37
+ end
38
+
39
+ def dev_mode(req)
40
+ case req.path
41
+ when %r{^/hoverboard/hoverboard.css$}
42
+ [200, {"Content-Type" => "text/css"}, [ (root + 'lib/hoverboard/stylesheets/hoverboard.css').read ]]
43
+
44
+ when %r{^/hoverboard/hoverboard.js$}
45
+ [200, {"Content-Type" => "text/javascript"}, [ (root + 'lib/hoverboard/javascript/hoverboard.js').read ]]
46
+
47
+ end
48
+ end
49
+
50
+ def index
51
+ @stories = project.stories.all(:current_state => "delivered")
52
+ haml "index"
53
+ end
54
+
55
+ def accept(pivotal_story_id)
56
+ story = project.stories.find(pivotal_story_id.to_i)
57
+ story.update(:current_state => 'accepted')
58
+ render "Accepted"
59
+ end
60
+
61
+ def reject(pivotal_story_id, reason=nil)
62
+ story = project.stories.find(pivotal_story_id.to_i)
63
+ story.update(:current_state => 'rejected')
64
+ story.notes.create(:text => "[rejected] #{reason}")
65
+ render "Rejected"
66
+ end
67
+
68
+ def project
69
+ @project ||= PT::Project.find(config.pivotal_tracker_project)
70
+ end
71
+
72
+ def haml(file_name, options={})
73
+ template = (template_root + "#{file_name}.haml").read
74
+ render Haml::Engine.new(template).render(self)
75
+ end
76
+
77
+ def render(html)
78
+ [200, {"Content-Type" => "text/html"}, [html]]
79
+ end
80
+
81
+ def root
82
+ @root ||= Pathname("../../../").expand_path(__FILE__)
83
+ end
84
+
85
+ def template_root
86
+ @template_root ||= root+'lib/hoverboard/templates'
87
+ end
88
+
89
+ def config
90
+ Hoverboard.configuration
91
+ end
92
+ end
93
+ end
94
+
@@ -0,0 +1,7 @@
1
+ ActionView::Base.send :include, Hoverboard::Helpers
2
+
3
+ if defined?(Rails::Railtie)
4
+ require 'hoverboard/railtie'
5
+ else
6
+ Rails.configuration.middleware.use(Hoverboard::RackApp)
7
+ end
@@ -0,0 +1,10 @@
1
+ module Hoverboard
2
+ class Railtie < Rails::Railtie
3
+ initializer 'hoverboard.middleware' do |app|
4
+ app.config.middleware.insert_before(Rack::Lock, Hoverboard::RackApp)
5
+ end
6
+ rake_tasks do
7
+ Hoverboard.load_rake_tasks!
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ namespace :hoverboard do
2
+ desc "install hoverboard's image, js & css assets into the app's public directory, for faster serving"
3
+ task :install do
4
+ Hoverboard.assets_path.mkpath
5
+
6
+ lib = Hoverboard.gem_root+'lib/hoverboard'
7
+
8
+ FileList[lib+'javascript/*.js', lib+'stylesheets/*'].each do |path|
9
+ to = Hoverboard.assets_path + File.basename(path)
10
+ cp path, to
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ - if @stories.length != 0
2
+ %ol(style="display: none;")
3
+ %li.wua-header Stories for you to test
4
+ - @stories.each do |story|
5
+ %li
6
+ %a.wua-accept{:href => "#accept", :title => "accept"} accept
7
+ %a.wua-reject{:href => "#reject", :title => "reject"} reject
8
+ %a.wua-pivotal{:href => story.url, :title => "View in Pivotal Tracker"} View in Pivotal Tracker
9
+ %span.wua-story= story.name
10
+ %span.wua-story-id.wua-hide= story.id
11
+ %form.wua-hide
12
+ %label(for="reason") Reason for rejection
13
+ %textarea.wua-reason(name="reason")
14
+ %button.wua-reject Reject
15
+ - else
16
+ %ol
17
+ %li.wua-no-stories There are no stories for you to test at this time.
metadata ADDED
@@ -0,0 +1,281 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hoverboard
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ben Askins
9
+ - Lachie Cox
10
+ - Ben Webster
11
+ - Graham Siener
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+ date: 2012-12-28 00:00:00.000000000 Z
16
+ dependencies:
17
+ - !ruby/object:Gem::Dependency
18
+ name: rake
19
+ requirement: !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ! '>='
23
+ - !ruby/object:Gem::Version
24
+ version: '0'
25
+ type: :runtime
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: haml
35
+ requirement: !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ type: :runtime
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ - !ruby/object:Gem::Dependency
50
+ name: mustache
51
+ requirement: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ - !ruby/object:Gem::Dependency
66
+ name: sinatra
67
+ requirement: !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ! '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ type: :runtime
74
+ prerelease: false
75
+ version_requirements: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: shotgun
83
+ requirement: !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: thin
99
+ requirement: !ruby/object:Gem::Requirement
100
+ none: false
101
+ requirements:
102
+ - - ! '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ none: false
109
+ requirements:
110
+ - - ! '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ - !ruby/object:Gem::Dependency
114
+ name: json
115
+ requirement: !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :runtime
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ! '>='
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ - !ruby/object:Gem::Dependency
130
+ name: pivotal-tracker
131
+ requirement: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ! '>='
135
+ - !ruby/object:Gem::Version
136
+ version: 0.1.3
137
+ type: :runtime
138
+ prerelease: false
139
+ version_requirements: !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ! '>='
143
+ - !ruby/object:Gem::Version
144
+ version: 0.1.3
145
+ - !ruby/object:Gem::Dependency
146
+ name: jeweler
147
+ requirement: !ruby/object:Gem::Requirement
148
+ none: false
149
+ requirements:
150
+ - - ! '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ type: :development
154
+ prerelease: false
155
+ version_requirements: !ruby/object:Gem::Requirement
156
+ none: false
157
+ requirements:
158
+ - - ! '>='
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ - !ruby/object:Gem::Dependency
162
+ name: pivotal-tracker
163
+ requirement: !ruby/object:Gem::Requirement
164
+ none: false
165
+ requirements:
166
+ - - ! '>='
167
+ - !ruby/object:Gem::Version
168
+ version: 0.1.3
169
+ type: :runtime
170
+ prerelease: false
171
+ version_requirements: !ruby/object:Gem::Requirement
172
+ none: false
173
+ requirements:
174
+ - - ! '>='
175
+ - !ruby/object:Gem::Version
176
+ version: 0.1.3
177
+ - !ruby/object:Gem::Dependency
178
+ name: haml
179
+ requirement: !ruby/object:Gem::Requirement
180
+ none: false
181
+ requirements:
182
+ - - ! '>='
183
+ - !ruby/object:Gem::Version
184
+ version: 2.2.0
185
+ type: :runtime
186
+ prerelease: false
187
+ version_requirements: !ruby/object:Gem::Requirement
188
+ none: false
189
+ requirements:
190
+ - - ! '>='
191
+ - !ruby/object:Gem::Version
192
+ version: 2.2.0
193
+ - !ruby/object:Gem::Dependency
194
+ name: rack
195
+ requirement: !ruby/object:Gem::Requirement
196
+ none: false
197
+ requirements:
198
+ - - ! '>='
199
+ - !ruby/object:Gem::Version
200
+ version: 1.0.0
201
+ type: :runtime
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ none: false
205
+ requirements:
206
+ - - ! '>='
207
+ - !ruby/object:Gem::Version
208
+ version: 1.0.0
209
+ description: ! 'Adds a toolbar to your rails app that directs your clients to test
210
+ stories that have been marked as ''delivered'' in Pivotal Tracker '
211
+ email: siener@gmail.com
212
+ executables: []
213
+ extensions: []
214
+ extra_rdoc_files:
215
+ - README.md
216
+ files:
217
+ - .document
218
+ - .travis.yml
219
+ - Gemfile
220
+ - Gemfile.lock
221
+ - MIT.LICENSE
222
+ - README.md
223
+ - Rakefile
224
+ - VERSION
225
+ - assets/hoverboard.css
226
+ - assets/hoverboard.js
227
+ - dev/dev.rb
228
+ - dev/images/accept.png
229
+ - dev/images/bg-uat.gif
230
+ - dev/images/btnreject.png
231
+ - dev/images/hoverboard-close.png
232
+ - dev/images/hoverboard-open.png
233
+ - dev/images/hoverboard.png
234
+ - dev/images/pt.png
235
+ - dev/images/reject.png
236
+ - dev/images/spinner.gif
237
+ - dev/images/uat-bg.png
238
+ - dev/images/uat-logo.gif
239
+ - dev/javascripts/hoverboard.js.mustache
240
+ - dev/stylesheets/hoverboard.css.mustache
241
+ - dev/views/index.haml
242
+ - hoverboard.gemspec
243
+ - lib/hoverboard.rb
244
+ - lib/hoverboard/assets.rb
245
+ - lib/hoverboard/assets/context.rb
246
+ - lib/hoverboard/assets/image.rb
247
+ - lib/hoverboard/configuration.rb
248
+ - lib/hoverboard/helpers.rb
249
+ - lib/hoverboard/rack_app.rb
250
+ - lib/hoverboard/rails.rb
251
+ - lib/hoverboard/railtie.rb
252
+ - lib/hoverboard/tasks.rb
253
+ - lib/hoverboard/templates/index.haml
254
+ homepage: http://github.com/gsiener/hoverboard
255
+ licenses: []
256
+ post_install_message:
257
+ rdoc_options: []
258
+ require_paths:
259
+ - lib
260
+ required_ruby_version: !ruby/object:Gem::Requirement
261
+ none: false
262
+ requirements:
263
+ - - ! '>='
264
+ - !ruby/object:Gem::Version
265
+ version: '0'
266
+ segments:
267
+ - 0
268
+ hash: -4299831796565085342
269
+ required_rubygems_version: !ruby/object:Gem::Requirement
270
+ none: false
271
+ requirements:
272
+ - - ! '>='
273
+ - !ruby/object:Gem::Version
274
+ version: '0'
275
+ requirements: []
276
+ rubyforge_project:
277
+ rubygems_version: 1.8.24
278
+ signing_key:
279
+ specification_version: 3
280
+ summary: Direct your clients to test delivered features
281
+ test_files: []