shack 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 742702322489166db2ac3b9dcc3c3d334ace1f34
4
- data.tar.gz: a83c87895d35d86b00c91e34c7a85786c98250c9
3
+ metadata.gz: b00d119b5b428f8faf4ad091c542be01296cdafe
4
+ data.tar.gz: 7d349a657a6c59f0e43f4c29d867bbade88fa426
5
5
  SHA512:
6
- metadata.gz: 184537f683380acacda210696328e5999771be90da3b69d9fd671a03e6639769955c28b2b39f8bf600c0382f98eb5d1d1e01b92e560763887be0db4a12159b84
7
- data.tar.gz: b01ba9567034c0e0f5a237be0012a0054f11c32fef56133ca8094a0006c02d9898aa07976bdb6c08a89d0f2f9c0c3fed280501ce4ab9fcbcd9b0d42fd9a6ef31
6
+ metadata.gz: 7704e252d1172a064540d856d70fc84a58f145970e7a085f05e0ef5494b8ed38d6f48980cc5de71255ea1a952ced8be58304db26b464a59e3d5a8a0def481860
7
+ data.tar.gz: 39be1338d7d5b48c89ad6069119bdda6b96c08c7499c9d7e0b1243a0ef0339b299f5e4116f048545ffb325633836db722093c1545d16862d5171ed885220981e
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ ## 0.0.3
2
+
3
+ - Don't show shack on print pages.
4
+ - Expose sha for easy access from app. (`Shack.sha`)
5
+ - Allow placement of sha from the config
6
+
7
+ ```
8
+ Shack::Middleware.configure do |shack|
9
+ shack.horizontal = :left # or :right
10
+ shack.vertical = :top # or :bottom
11
+ end
12
+ ```
13
+ - Add ability to override CSS styles (use `#sha-stamp`)
14
+ - Add quick way to fire up demo server (`rake demo`)
15
+ - Don't inject on XHR requests.
16
+
1
17
  ## 0.0.2
2
18
 
3
19
  - Expose `{{short_sha}}` in custom content block. - 6180bbc
data/README.md CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  A `Rack` middleware that will add a unique identifier (`sha`) to the application. It will set a custom header (`X-Shack-Sha`) containing the sha and will automagically insert a small banner in the HTML.
6
6
 
7
+ Visit a live demo at https://canadiaweather.herokuapp.com or:
8
+
7
9
  ![Shack in action](http://cl.ly/image/2F1w1E0G2C3R/Screen%20Shot%202014-12-01%20at%2000.47.23.png)
8
10
 
9
11
  ```
@@ -47,6 +49,8 @@ end
47
49
 
48
50
  And since it's Rails, it can also be done automagically if a file called `REVISION` is found in the root of your project. No initializer required. Note: by default it won't show the banner in production environments, because that just feels wrong.
49
51
 
52
+ It's also possible to get the sha, in the running app, `Shack.sha`. This could be helpful in passing the sha along to a service like Airbrake.
53
+
50
54
  ## Configuration
51
55
 
52
56
  You can either set the sha directly:
@@ -69,12 +73,42 @@ end
69
73
 
70
74
  There is also a `{{short_sha}}` substition available, which returns the first 8 chars of the set `sha`.
71
75
 
76
+ ## Styling
77
+
78
+ If you define your own CSS for `#shack-stamp` and `#shack-stamp__content`, you can override the default styling. (It uses classes so your specificity should be higher)
79
+
80
+ If you just want to change the position of the sha, you can do this in a configuration block:
81
+
82
+ ```ruby
83
+ # Sets the sha to the top left corner
84
+ Shack::Middleware.configure do |shack|
85
+ shack.horizontal = :left # or :right
86
+ shack.vertical = :top # or :bottom
87
+ end
88
+ ```
89
+
72
90
  ## How do I set the sha?
73
91
 
74
92
  Either write it to a `REVISION` file on deploy (Capistrano used to this by default, now you can [add a task](https://github.com/capistrano/capistrano/pull/757), in `mina` I'm waiting on this [pull request](https://github.com/mina-deploy/mina/pull/260)), or set an `ENV` variable containing the sha.
75
93
 
94
+ So instead of using regular mina add this to your Gemfile:
95
+
96
+ ```
97
+ gem "mina", git: "https://github.com/pjaspers/mina.git", branch: "pj-write-sha-to-revision-file"
98
+ ```
99
+
76
100
  Now you can set the sha in the configure block.
77
101
 
102
+ ## OK that's fine, but I'm on Heroku
103
+
104
+ In [canadia](https://github.com/pjaspers/canadia) I made an after deploy hook that added an `ENV` variable which set the sha. The easiest way I could do this is with something like this:
105
+
106
+ ```
107
+ curl -n -H "Authorization: Bearer $HEROKU_API_KEY" -X PATCH https://api.heroku.com/apps/canadiaweather/config-vars -H "Accept: application/vnd.heroku+json; version=3" -H "Content-Type: application/json" -d '{"SHA":"'"$TRAVIS_COMMIT"'"}'
108
+ ```
109
+
110
+ (I used Travis to do the deploying, look [here](https://github.com/pjaspers/canadia/blob/8201454ed538ade36e133645bf1fcd1ee10e05a6/.travis.yml) for all the glorious details)
111
+
78
112
  ## Signed gem
79
113
 
80
114
  `shack` is cryptographically signed. To be sure the gem you install hasn’t been tampered with:
data/Rakefile CHANGED
@@ -7,6 +7,7 @@ end
7
7
 
8
8
  task :default => :test
9
9
 
10
+ desc "Drops you in a repl with Shack already loaded"
10
11
  task :console do
11
12
  require 'pry'
12
13
  require './lib/shack'
@@ -14,6 +15,28 @@ task :console do
14
15
  Pry.start Shack
15
16
  end
16
17
 
18
+ desc "Starts a small webapp to see shack in action"
19
+ task :demo do
20
+ require "rack"
21
+ require "./lib/shack"
22
+ app = Rack::Builder.new do
23
+ Shack::Middleware.configure do |shack|
24
+ shack.sha = "80adf8f24baee8d0feb43cdc1ce744c69a54ac99"
25
+ shack.content = "<a href='https://github.com/pjaspers/shack/commit/{{sha}}'>{{short_sha}}</a>"
26
+ shack.vertical = :top
27
+ shack.horizontal = :left
28
+ end
29
+ use Shack::Middleware
30
+ # 1.9 has a problem with `run -> (env)`, so that's why the -> is touching the (
31
+ # Yep. Annoys the hell out of me.
32
+ run ->(env) {
33
+ [200, {"Content-Type" => "text/html"}, ["<html><body>KAAAHN</body></html>"]]
34
+ }
35
+ end
36
+
37
+ Rack::Server.start app: app
38
+ end
39
+
17
40
  task :checksum do
18
41
  require 'digest/sha2'
19
42
  abort_with_error "Set 'GEM' with name-0.x.x to calculate checksum" unless ENV["GEM"]
data/certs/pjaspers.pem CHANGED
@@ -1,19 +1,21 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- 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
- 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
- NDA0MDcyMTQyMDNaFw0xNTA0MDcyMTQyMDNaMDoxDTALBgNVBAMMBHBpZXQxFTAT
5
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 8n6dMQrL2kZdD0ZNeidLfTMzhflv+9ZrWfcFWzfqaGgKJckBd2wlfQiR78ts9zom
15
- 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
- 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
- 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
- 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
20
+ cEwq742XFnUzr0ltFTqM+g==
19
21
  -----END CERTIFICATE-----
@@ -0,0 +1,58 @@
1
+ module Shack
2
+ # Used to configure the middleware
3
+ class Configuration
4
+ # The sha that should be displayed
5
+ attr_accessor :sha
6
+
7
+ # A string (can be html) that will be displayed in the UI
8
+ attr_accessor :content
9
+
10
+ # Boolean. Show or hide the samp
11
+ attr_accessor :hide_stamp
12
+
13
+ # Sets the vertical placement.
14
+ # :top or : bottom (defaults to :bottom)
15
+ attr_accessor :vertical
16
+
17
+ # Sets the horizontal placement.
18
+ # :left or :right (default to :right)
19
+ attr_accessor :horizontal
20
+
21
+ def initialize
22
+ @vertical = :bottom
23
+ @horizontal = :right
24
+ end
25
+
26
+ def [](key)
27
+ if respond_to? key
28
+ public_send(key)
29
+ end
30
+ end
31
+
32
+ def to_hash
33
+ {content: content,
34
+ vertical: vertical,
35
+ horizontal: horizontal}
36
+ end
37
+
38
+ def hide_stamp?
39
+ !!hide_stamp
40
+ end
41
+
42
+ def horizontal=(thing)
43
+ if [:left, :right].include? thing
44
+ @horizontal = thing
45
+ else
46
+ fail ArgumentError.new("horizontal needs to be :left or :right")
47
+ end
48
+ end
49
+
50
+ def vertical=(thing)
51
+ if [:top, :bottom].include? thing
52
+ @vertical = thing
53
+ else
54
+ fail ArgumentError.new("vertical needs to be :top or :bottom")
55
+ end
56
+ end
57
+ end
58
+ end
@@ -8,6 +8,8 @@ module Shack
8
8
  end
9
9
 
10
10
  def call(env)
11
+ # Make it easy to get sha from other processes
12
+ Shack.sha = sha
11
13
  status, headers, body = @app.call(env)
12
14
  return [status, headers, body] unless sha
13
15
  headers[HEADER_NAME] = sha
@@ -19,8 +21,12 @@ module Shack
19
21
  end
20
22
  end
21
23
 
24
+ def config
25
+ self.class.config
26
+ end
27
+
22
28
  def inject_stamp(status, headers, body)
23
- return nil if !!self.class.hide_stamp
29
+ return nil if !!config.hide_stamp?
24
30
  return nil unless Stamp.stampable?(headers)
25
31
  response = Rack::Response.new([], status, headers)
26
32
 
@@ -35,20 +41,31 @@ module Shack
35
41
  response.finish
36
42
  end
37
43
 
38
- # Initialiser over class-sha.
44
+ # Initialiser over config-sha.
39
45
  def sha
40
- @sha || self.class.sha
46
+ @sha || config.sha
41
47
  end
42
48
 
43
49
  def stamped(body)
44
- Stamp.new(body, sha, self.class.content).result
50
+ Stamp.new(body, sha, config).result
45
51
  end
46
52
 
47
53
  class << self
48
- attr_accessor :sha, :content, :hide_stamp
54
+ attr_writer :configuration
55
+
56
+ def config
57
+ @configuration ||= Configuration.new
58
+ end
49
59
 
60
+ # Allow configuration of the Middleware
61
+ #
62
+ # Shack::Middleware.configure do |shack|
63
+ # shack.sha = "thisiasha"
64
+ # shack.hide_stamp = true
65
+ # end
66
+ #
50
67
  def configure(&block)
51
- block.call(self)
68
+ block.call(config)
52
69
  end
53
70
  end
54
71
  end
data/lib/shack/stamp.rb CHANGED
@@ -1,18 +1,32 @@
1
1
  module Shack
2
2
  # Takes the body and adds a stamp to it, containing the supplied content.
3
- # At the moment, it's just a red div with white text.
3
+ #
4
+ # Takes some additional options to set the sha in the correct position
5
+ #
6
+ # Stamp.new("html body", "123", {vertical: :left, horizontal: :right}).html
7
+ # # => HTML with the stamp set at the top left corner
8
+ #
4
9
  class Stamp
5
10
  # body - original body
6
11
  # content - gets added to view
7
- def initialize(body, sha, custom_content = nil)
12
+ # options - Either a hash or a Configuration instance
13
+ def initialize(body, sha, options = {})
8
14
  @body = body
9
15
  @sha = sha || ""
10
16
  @short_sha = @sha[0..8]
11
- @custom_content = custom_content if custom_content
17
+
18
+ options = Configuration.new.to_hash.merge(options || {})
19
+ @custom_content = options[:content] if options[:content]
20
+ @vertical = options[:vertical]
21
+ @horizontal = options[:horizontal]
12
22
  end
13
23
 
24
+ # Only inject html on html requests, also avoid xhr requests
25
+ #
26
+ # headers - Headers from a Rack request
14
27
  def self.stampable?(headers)
15
- !!(headers["Content-Type"] =~ %r{text/html})
28
+ !!(headers["Content-Type"] =~ %r{text/html}) &&
29
+ !!(headers["HTTP_X_REQUESTED_WITH"] != "XMLHttpRequest")
16
30
  end
17
31
 
18
32
  def result
@@ -30,12 +44,62 @@ module Shack
30
44
  end
31
45
  end
32
46
 
47
+ # Returns the CSS needed to round the correct corner
48
+ #
49
+ # `border-top-left-radius`
50
+ def rounded_corner(horizontal, vertical)
51
+ css = [] << "border"
52
+ attrs = {
53
+ top: "bottom", bottom: "top",
54
+ left: "right", right: "left" }
55
+ css << attrs.fetch(vertical)
56
+ css << attrs.fetch(horizontal)
57
+ css << "radius"
58
+ css.join("-")
59
+ end
60
+
61
+ # Returns the CSS needed for positioning the stamp
62
+ #
63
+ # `position: fixed; top: 0; left: 0;`
64
+ def position_css(horizontal, vertical)
65
+ attrs = {
66
+ top: "top: 0;", bottom: "bottom: 0;",
67
+ left: "left: 0;", right: "right: 0;" }
68
+ css = [] << "position: fixed;"
69
+ css << attrs.fetch(vertical)
70
+ css << attrs.fetch(horizontal)
71
+ css.join("")
72
+ end
73
+
33
74
  def html
34
75
  <<HTML
35
- <div id="sha-stamp" style="position: fixed; bottom: 0; right: 0; height: 16px; background: rgb(0, 0, 0) transparent; background-color: rgba(0, 0, 0, 0.2); padding: 0 5px; border-top-left-radius: 5px; z-index: 2147483647; font-size: 12px;">
36
- <span style="text-align: center;">
37
- <small style="color: white; font-weight: normal;font-size: 12px;">#{content}</small>
38
- </span>
76
+ <style>
77
+ .sha-stamp {
78
+ #{position_css(@horizontal, @vertical)}
79
+ #{rounded_corner(@horizontal, @vertical)}: 5px;
80
+ height: 16px;
81
+ background: rgb(0, 0, 0) transparent; background-color: rgba(0, 0, 0, 0.2);
82
+ padding: 0 5px;
83
+ z-index: 2147483647; font-size: 12px;
84
+ }
85
+ .sha-stamp__content {
86
+ text-align: center;
87
+ color: white;
88
+ font-family: "Lucida Console", Monaco, monospace;
89
+ font-weight: normal;
90
+ font-size: 12px;
91
+ margin: 0;
92
+ }
93
+ .sha-stamp__content a {
94
+ text-decoration: none;
95
+ color: white;
96
+ }
97
+ @media print {
98
+ .sha-stamp { display: none; }
99
+ }
100
+ </style>
101
+ <div id="shack-stamp" class="sha-stamp">
102
+ <p id="shack-stamp__content" class="sha-stamp__content">#{content}</p>
39
103
  </div>
40
104
  HTML
41
105
  end
data/lib/shack/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Shack
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/shack.rb CHANGED
@@ -1,8 +1,19 @@
1
1
  require "shack/version"
2
+ require "shack/configuration"
2
3
  require "shack/middleware"
3
4
  require "shack/stamp"
4
5
  require "shack/railtie" if defined?(Rails)
5
6
 
6
7
  module Shack
7
- # Your code goes here...
8
+ # If the Middleware is called and initialized, this sha will be set
9
+ # This could be used for easy passing to something like `Airbrake`
10
+ def self.sha
11
+ if defined? @@sha
12
+ @@sha
13
+ end
14
+ end
15
+
16
+ def self.sha=(sha)
17
+ @@sha = sha
18
+ end
8
19
  end
data/shack.gemspec CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |spec|
7
7
  spec.name = "shack"
8
8
  spec.version = Shack::VERSION
9
9
  spec.authors = ["pjaspers"]
10
- spec.email = ["piet@jaspe.rs"]
10
+ spec.email = ["piet@pjaspers.com"]
11
11
  spec.summary = %q{Sha + Rack = Shack }
12
12
  spec.description = %q{Rack middleware to expose a potential sha}
13
13
  spec.homepage = ""
@@ -0,0 +1,28 @@
1
+ require "helper.rb"
2
+
3
+ describe Shack::Configuration do
4
+
5
+ it "defaults vertical to bottom" do
6
+ assert_equal :bottom, Shack::Configuration.new.vertical
7
+ end
8
+
9
+ it "defaults horizontal to right" do
10
+ assert_equal :right, Shack::Configuration.new.horizontal
11
+ end
12
+
13
+ it "has handy hide_stamp?" do
14
+ config = Shack::Configuration.new
15
+ config.hide_stamp = nil
16
+ refute config.hide_stamp?
17
+ end
18
+
19
+ it "raises for invalid horizontal settings" do
20
+ config = Shack::Configuration.new
21
+ assert_raises(ArgumentError) { config.horizontal = "Green Mile" }
22
+ end
23
+
24
+ it "raises for invalid vertical settings" do
25
+ config = Shack::Configuration.new
26
+ assert_raises(ArgumentError) { config.vertical = "Green Mile" }
27
+ end
28
+ end
data/test/helper.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require "minitest/autorun"
4
4
  require "minitest/pride"
5
5
  require "mocha"
6
+ require "pry"
6
7
 
7
8
  $LOAD_PATH.unshift(File.dirname(__FILE__))
8
9
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
@@ -4,6 +4,7 @@ require "rack/mock"
4
4
  describe Shack::Middleware do
5
5
  before do
6
6
  @app = ->(env) { [200, env, "app"] }
7
+ reset_config
7
8
  end
8
9
 
9
10
  describe "without a sha" do
@@ -28,13 +29,6 @@ describe Shack::Middleware do
28
29
  @middleware = Shack::Middleware.new(@app, @sha)
29
30
  end
30
31
 
31
- after do
32
- Shack::Middleware.configure do |shack|
33
- shack.sha = nil
34
- shack.content = nil
35
- end
36
- end
37
-
38
32
  it "doesn't break the original app" do
39
33
  status, _, _ = @middleware.call(fake_env("http://something.com"))
40
34
  assert_equal status, 200
@@ -44,6 +38,14 @@ describe Shack::Middleware do
44
38
  _, headers, _ = @middleware.call(fake_env("http://something.com"))
45
39
  assert_equal @sha, headers[Shack::Middleware::HEADER_NAME]
46
40
  end
41
+
42
+ it "exposes the sha to the top Shack module" do
43
+ if Shack.class_variable_defined? "@@sha"
44
+ Shack.remove_class_variable "@@sha"
45
+ end
46
+ _, headers, _ = @middleware.call(fake_env("http://something.com"))
47
+ assert_equal @sha, Shack.sha
48
+ end
47
49
  end
48
50
 
49
51
  describe "injecting html" do
@@ -53,19 +55,21 @@ describe Shack::Middleware do
53
55
  _, _, response = middleware.call(fake_env("http://something.com"))
54
56
  assert_match(/Rollo Tomassi/, response.body.first)
55
57
  end
58
+
59
+ it "doesn't inject on xhr requests" do
60
+ app = ->(_) { [200, { "Content-Type" => "text/html" }, fake_page] }
61
+ middleware = Shack::Middleware.new(app, "Rollo Tomassi")
62
+ _, _, response = middleware.call(xhr_env("http://something.com"))
63
+ assert_match(/Rollo Tomassi/, response.body.first)
64
+ end
65
+
56
66
  end
57
67
 
58
68
  describe ".configure" do
59
- after do
60
- Shack::Middleware.configure do |shack|
61
- shack.sha = nil
62
- shack.content = nil
63
- end
64
- end
65
69
 
66
70
  it "can set a sha" do
67
71
  Shack::Middleware.configure { |s| s.sha = "O'Sullivan" }
68
- assert_equal Shack::Middleware.sha, "O'Sullivan"
72
+ assert_equal Shack::Middleware.config.sha, "O'Sullivan"
69
73
  end
70
74
 
71
75
  it "favors the initialized sha over the configured one" do
@@ -80,7 +84,21 @@ describe Shack::Middleware do
80
84
  Shack::Middleware.configure do |s|
81
85
  s.content = string
82
86
  end
83
- assert_equal Shack::Middleware.content, string
87
+ assert_equal Shack::Middleware.config.content, string
88
+ end
89
+
90
+ it "can can set the horizontal orientation" do
91
+ response = response_from_configured_app do |c|
92
+ c.horizontal = :left
93
+ end
94
+ assert_match(/left: 0;/, response.body.first)
95
+ end
96
+
97
+ it "can can set the vertical orientation" do
98
+ response = response_from_configured_app do |c|
99
+ c.vertical = :top
100
+ end
101
+ assert_match(/top: 0;/, response.body.first)
84
102
  end
85
103
 
86
104
  it "sets the stamp with the configuration" do
@@ -93,7 +111,18 @@ describe Shack::Middleware do
93
111
  _, _, response = middleware.call(fake_env("http://something.com"))
94
112
  assert_match(/Ronnie The Rocket - abc123/, response.body.first)
95
113
  end
114
+
115
+ it "can set vertical to top" do
116
+ Shack::Middleware.configure { |s| s.vertical = :top }
117
+ assert_equal Shack::Middleware.config.vertical, :top
118
+ end
119
+
120
+ it "can set horizontal to left" do
121
+ Shack::Middleware.configure { |s| s.horizontal = :left }
122
+ assert_equal Shack::Middleware.config.horizontal, :left
123
+ end
96
124
  end
125
+
97
126
  def fake_page
98
127
  "<html><body></body></html>"
99
128
  end
@@ -101,4 +130,21 @@ describe Shack::Middleware do
101
130
  def fake_env(url, options = {})
102
131
  Rack::MockRequest.env_for(url, options)
103
132
  end
133
+
134
+ def xhr_env(url, options = {})
135
+ options = { "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest"}.merge(options || {})
136
+ Rack::MockRequest.env_for(url, options)
137
+ end
138
+
139
+ def reset_config
140
+ Shack::Middleware.configuration = nil
141
+ end
142
+
143
+ def response_from_configured_app(&block)
144
+ app = ->(_) { [200, { "Content-Type" => "text/html" }, fake_page] }
145
+ Shack::Middleware.configure { |s| block.call(s) }
146
+ middleware = Shack::Middleware.new(app, "sha")
147
+ _, _, response = middleware.call(fake_env("http://something.com"))
148
+ response
149
+ end
104
150
  end
data/test/shack_test.rb CHANGED
@@ -1,7 +1,10 @@
1
1
  require "helper"
2
2
 
3
3
  describe Shack do
4
- it "'s alive!" do
5
- assert true
4
+ it "returns nil if it can't find a sha" do
5
+ if Shack.class_variable_defined? "@@sha"
6
+ Shack.remove_class_variable "@@sha"
7
+ end
8
+ assert_nil Shack.sha
6
9
  end
7
10
  end
data/test/stamp_test.rb CHANGED
@@ -23,17 +23,17 @@ describe Shack::Stamp do
23
23
  end
24
24
 
25
25
  it "should use custom_content if provided" do
26
- s = Shack::Stamp.new("<html><body></body></html>", "Jack Vincennes", "Rollo Tomassi")
26
+ s = Shack::Stamp.new("<html><body></body></html>", "Jack Vincennes", content: "Rollo Tomassi")
27
27
  assert_match(/Rollo Tomassi/, s.result)
28
28
  end
29
29
 
30
30
  it "should use sha in custom_content if provided" do
31
- s = Shack::Stamp.new("<html><body></body></html>", "Jack Vincennes", "Rollo Tomassi said {{sha}}")
31
+ s = Shack::Stamp.new("<html><body></body></html>", "Jack Vincennes", content: "Rollo Tomassi said {{sha}}")
32
32
  assert_match(/Rollo Tomassi said Jack Vincennes/, s.result)
33
33
  end
34
34
 
35
35
  it "uses short sha in custom_content if wanted" do
36
- s = Shack::Stamp.new("<html><body></body></html>", "Jack Vincennes", "Rollo Tomassi said {{short_sha}}")
36
+ s = Shack::Stamp.new("<html><body></body></html>", "Jack Vincennes", content: "Rollo Tomassi said {{short_sha}}")
37
37
  assert_match(/Rollo Tomassi said Jack Vi/, s.result)
38
38
  refute_match(/Jack Vincennes/, s.result)
39
39
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - pjaspers
@@ -10,25 +10,27 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- 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
- 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
- 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
- BgoJkiaJk/IsZAEZFgVqYXNwZTESMBAGCgmSJomT8ixkARkWAnJzMIIBIjANBgkq
17
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
31
+ cEwq742XFnUzr0ltFTqM+g==
30
32
  -----END CERTIFICATE-----
31
- date: 2015-02-01 00:00:00.000000000 Z
33
+ date: 2015-06-15 00:00:00.000000000 Z
32
34
  dependencies:
33
35
  - !ruby/object:Gem::Dependency
34
36
  name: bundler
@@ -46,7 +48,7 @@ dependencies:
46
48
  version: '1.7'
47
49
  description: Rack middleware to expose a potential sha
48
50
  email:
49
- - piet@jaspe.rs
51
+ - piet@pjaspers.com
50
52
  executables: []
51
53
  extensions: []
52
54
  extra_rdoc_files: []
@@ -62,12 +64,14 @@ files:
62
64
  - checksum/shack-0.0.1.sha512
63
65
  - checksum/shack-0.0.2.sha512
64
66
  - lib/shack.rb
67
+ - lib/shack/configuration.rb
65
68
  - lib/shack/middleware.rb
66
69
  - lib/shack/railtie.rb
67
70
  - lib/shack/stamp.rb
68
71
  - lib/shack/version.rb
69
72
  - shack.gemspec
70
73
  - test/benchmark.rb
74
+ - test/configration_test.rb
71
75
  - test/helper.rb
72
76
  - test/middleware_test.rb
73
77
  - test/shack_test.rb
@@ -92,12 +96,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
96
  version: '0'
93
97
  requirements: []
94
98
  rubyforge_project:
95
- rubygems_version: 2.4.5
99
+ rubygems_version: 2.2.2
96
100
  signing_key:
97
101
  specification_version: 4
98
102
  summary: Sha + Rack = Shack
99
103
  test_files:
100
104
  - test/benchmark.rb
105
+ - test/configration_test.rb
101
106
  - test/helper.rb
102
107
  - test/middleware_test.rb
103
108
  - test/shack_test.rb
metadata.gz.sig CHANGED
Binary file