shack 0.0.2 → 0.0.3

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.
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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
- hotS1Yraz3hclbGhBhDcQilW11GSftUbWhaiMQwNXqaEN9ctmzE5JukOdwhtNSLq
8
- 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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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
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