shack 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3439a99a117ab934230a8199f7c1da49af7fd4e1
4
+ data.tar.gz: 9d98564d1a5228650b947f2f54c5c01228355b0c
5
+ SHA512:
6
+ metadata.gz: 1bbf218b69895d33c2066dd9cee1c4d568efdd199defb82683430c3d1aec8a436ac6101f2810c7cb533471042d7d3d85a77bf89d773678e9eb6f6307fb4bfa5f
7
+ data.tar.gz: e6f1d2e3784bc9b089912f908c1200953ef4e0dc08f8fe271a5798a4f440a68627e6df3145ffe40ab34c59b082626862b7420b7688cbdd2b02f5131350b061ad
checksums.yaml.gz.sig ADDED
@@ -0,0 +1,3 @@
1
+ �i��p��#���
2
+ �����Ƴ�k����|�%Juan��� ޮ.��� ��@*
3
+ Y����7���:]���˲� �P��׌+��ܳ�HSӛw_�?(�,�M�
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 1.9.3
5
+ - ruby-head
6
+ - rbx-2
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in shack.gemspec
4
+ gemspec
5
+
6
+ group :development do
7
+ gem "pry", "~> 0.9.12.6"
8
+ gem "rack", "~> 1.5.2"
9
+ end
10
+
11
+ group :test do
12
+ # Adding rake for Travis.
13
+ gem "rake"
14
+ gem "minitest", "~> 5.4.3"
15
+ gem "mocha", "~> 1.1.0"
16
+ gem "benchmark-ips", "~> 2.1.0"
17
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 pjaspers
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # Shack
2
+
3
+ [![Build Status](https://travis-ci.org/pjaspers/shack.svg?branch=master)](https://travis-ci.org/pjaspers/shack)
4
+
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
+
7
+ ![Shack in action](http://cl.ly/image/2F1w1E0G2C3R/Screen%20Shot%202014-12-01%20at%2000.47.23.png)
8
+
9
+ ```
10
+ ❯ curl -I kkez.dev
11
+ HTTP/1.1 200 OK
12
+ Server: nginx/1.6.1
13
+ Date: Sun, 30 Nov 2014 23:49:10 GMT
14
+ Content-Type: text/html;charset=utf-8
15
+ Content-Length: 491
16
+ Connection: keep-alive
17
+ X-Shack-Sha: 39aee4f
18
+ ```
19
+
20
+ This way you can always be certain which version of your app is currently running, especially handy in staging environments.
21
+ If you don't supply a `sha` nothing will happen (so for example if you use an `ENV` variable containing the sha and don't set it in production, no one will be any wiser).
22
+
23
+ ## Installation
24
+
25
+ For a rack app:
26
+
27
+ ```ruby
28
+ require "shack"
29
+
30
+ app = Rack::Builder.new do
31
+ use Shack::Middleware, ENV["SHA"]
32
+ run -> (env) { [200, {"Content-Type" => "text/html", ["<html><body>KAAAHN</body></html>"]]
33
+ end
34
+
35
+ Rack::Server.start app: app
36
+ ```
37
+
38
+ If your rack app happens to be a Rails app:
39
+
40
+ Add `shack` to your Gemfile, and specify how to get the hash in an initializer (`config/initializers/shack.rb`)
41
+
42
+ ```ruby
43
+ Shack::Middleware.configure do |shack|
44
+ shack.sha = File.open("BUILD_NUMBER").read.strip
45
+ end
46
+ ```
47
+
48
+ 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
+
50
+ ## Configuration
51
+
52
+ You can either set the sha directly:
53
+
54
+ ```ruby
55
+ Shack::Middleware.configure do |shack|
56
+ shack.sha = File.open("REVISION").read.strip
57
+ shack.hide_stamp = true # this will hide the banner
58
+ end
59
+ ```
60
+
61
+ Or you can set the string to show in the HTML banner (with `{{sha}}` being a special variable which will be replaced with the sha):
62
+
63
+ ```ruby
64
+ Shack::Middleware.configure do |shack|
65
+ shack.sha = File.open("REVISION").read.strip
66
+ shack.content = "#{Rails.env} - <a href="https://github.com/shack/commit/{{sha}}>{{sha}}</a>"
67
+ end
68
+ ```
69
+
70
+ ## How do I set the sha?
71
+
72
+ 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.
73
+
74
+ Now you can set the sha in the configure block.
75
+
76
+ ## Signed gem
77
+
78
+ `shack` is cryptographically signed. To be sure the gem you install hasn’t been tampered with:
79
+
80
+ 1. Download certificate https://raw.github.com/pjaspers/shack/certs/pjaspers.pem
81
+ 2. Add `gem cert –add pjaspers.pem`
82
+ 3. gem install shack -P HighSecurity
83
+
84
+ ## Contributing
85
+
86
+ 0. Fork it ( https://github.com/pjaspers/shack/fork )
87
+ 1. Create a new Pull Request
88
+ 2. Technology.
data/Rakefile ADDED
@@ -0,0 +1,26 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ task :test do
4
+ $LOAD_PATH.unshift('lib', 'test')
5
+ Dir.glob('./test/**/*_test.rb') { |f| require f }
6
+ end
7
+
8
+ task :default => :test
9
+
10
+ task :console do
11
+ require 'pry'
12
+ require './lib/shack'
13
+ ARGV.clear
14
+ Pry.start Shack
15
+ end
16
+
17
+ task :checksum do
18
+ require 'digest/sha2'
19
+ abort_with_error "Set 'GEM' with name-0.x.x to calculate checksum" unless ENV["GEM"]
20
+ name = ENV["GEM"]
21
+ built_gem_path = "pkg/#{name}.gem"
22
+ checksum = Digest::SHA512.new.hexdigest(File.read(built_gem_path))
23
+ checksum_path = "checksum/#{name}.sha512"
24
+ File.open(checksum_path, 'w' ) {|f| f.write(checksum) }
25
+ puts "Wrote checksum to #{checksum_path}"
26
+ end
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDKDCCAhCgAwIBAgIBADANBgkqhkiG9w0BAQUFADA6MQ0wCwYDVQQDDARwaWV0
3
+ MRUwEwYKCZImiZPyLGQBGRYFamFzcGUxEjAQBgoJkiaJk/IsZAEZFgJyczAeFw0x
4
+ NDA0MDcyMTQyMDNaFw0xNTA0MDcyMTQyMDNaMDoxDTALBgNVBAMMBHBpZXQxFTAT
5
+ BgoJkiaJk/IsZAEZFgVqYXNwZTESMBAGCgmSJomT8ixkARkWAnJzMIIBIjANBgkq
6
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+SQ5IzhMaUM/jrUBAP5l0/Z5ttLQb2lT
7
+ hotS1Yraz3hclbGhBhDcQilW11GSftUbWhaiMQwNXqaEN9ctmzE5JukOdwhtNSLq
8
+ IDw+TEEXbg/VImlFhryg9vunffPeOBUlnxdY484DOushNN50H/LA+jAoFST3+oZq
9
+ CXuA3yFi8ZTPqhHrEn1bkycUfLX+TOm07ZfCPly9fAVYhOYaVaPeYkHAO83+Ic63
10
+ 9YGqD1sFeZ7hfSxqfYEBxpiM0+qztqHCVNrehkzX2oUmY06eVpSu2mzLYmcCD58f
11
+ inVDRBe/3ygkACxZCA7pjIuqHOpKxSbYMrgEkrAtpA7lkIMaveMY9QIDAQABozkw
12
+ NzAJBgNVHRMEAjAAMB0GA1UdDgQWBBSSJbKSj/62BYq/1utxyqsShRum8jALBgNV
13
+ HQ8EBAMCBLAwDQYJKoZIhvcNAQEFBQADggEBAJkG60vFt/GBuMvTdMtFCw4jJiRo
14
+ 8n6dMQrL2kZdD0ZNeidLfTMzhflv+9ZrWfcFWzfqaGgKJckBd2wlfQiR78ts9zom
15
+ bX9B9n/Ad32womLnb0aeTuEHX6Vy4qs4zl+VnXy4g1NQ2lfcnksUsjBM8v8GYTjy
16
+ ssiOQnzrWxNyjR01uY5g/ON/IlRKNpihe7Qze1oGWdopZP6Lwfhir5ShbDETCKQv
17
+ CuJWUOdBRsHbSraLW8n/vc/fZGqVzDAghs26bxmwicw+4/VgO2soYka81t8pUuG6
18
+ vLWWrtmIv8+cmMgvltP5AR5j2oYHYPPA9YFXuO9t1JVqJiNHm9JNRseEoBc=
19
+ -----END CERTIFICATE-----
@@ -0,0 +1 @@
1
+ 93a208b532503937bc5399e4f36432f46e2c2f3e1da84f107c8e2ff858660953ca017dda4cc22a54d5d48bec4ab2cc9d4bda1c909eb9d103dd8134df0cf14f91
@@ -0,0 +1,55 @@
1
+ module Shack
2
+ class Middleware
3
+ HEADER_NAME = "X-Shack-Sha".freeze
4
+
5
+ def initialize(app, sha = "")
6
+ @app = app
7
+ @sha = sha unless (sha || "").empty?
8
+ end
9
+
10
+ def call(env)
11
+ status, headers, body = @app.call(env)
12
+ return [status, headers, body] unless sha
13
+ headers[HEADER_NAME] = sha
14
+
15
+ if result = inject_stamp(status, headers, body)
16
+ result
17
+ else
18
+ [status, headers, body]
19
+ end
20
+ end
21
+
22
+ def inject_stamp(status, headers, body)
23
+ return nil if !!self.class.hide_stamp
24
+ return nil unless Stamp.stampable?(headers)
25
+ response = Rack::Response.new([], status, headers)
26
+
27
+ if String === body
28
+ response.write stamped(body)
29
+ else
30
+ body.each do |fragment|
31
+ response.write stamped(fragment)
32
+ end
33
+ end
34
+ body.close if body.respond_to? :close
35
+ response.finish
36
+ end
37
+
38
+ # Initialiser over class-sha.
39
+ def sha
40
+ @sha || self.class.sha
41
+ end
42
+
43
+ def stamped(body)
44
+ Stamp.new(body, sha, self.class.content).result
45
+ end
46
+
47
+ class << self
48
+ attr_accessor :sha, :content, :hide_stamp
49
+
50
+ def configure(&block)
51
+ block.call(self)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,37 @@
1
+ module Shack
2
+ class Railtie < Rails::Railtie
3
+ initializer "shack.configure_rails_initialization" do |app|
4
+ ShackRails.new(app).inject!
5
+ end
6
+ end
7
+
8
+ class ShackRails
9
+ def initialize(app)
10
+ @app = app
11
+ end
12
+
13
+ def inject!
14
+ if Rails.env.production?
15
+ # Don't show the stamp in production, but do add it to the headers
16
+ Shack::Middleware.configure do |shack|
17
+ shack.hide_stamp = true
18
+ end
19
+ end
20
+
21
+ if fetch_sha_from_file?
22
+ Shack::Middleware.configure do |shack|
23
+ shack.sha = File.open(revision_file).read.strip
24
+ end
25
+ end
26
+ @app.middleware.use(Shack::Middleware)
27
+ end
28
+
29
+ def fetch_sha_from_file?
30
+ Shack::Middleware.sha.blank? && File.exist?(revision_file)
31
+ end
32
+
33
+ def revision_file
34
+ File.join(Rails.root, "REVISION")
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,40 @@
1
+ module Shack
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.
4
+ class Stamp
5
+ # body - original body
6
+ # content - gets added to view
7
+ def initialize(body, sha, custom_content = nil)
8
+ @body = body
9
+ @sha = sha
10
+ @custom_content = custom_content if custom_content
11
+ end
12
+
13
+ def self.stampable?(headers)
14
+ !!(headers["Content-Type"] =~ %r{text/html})
15
+ end
16
+
17
+ def result
18
+ @body.gsub!("</body>", html + "</body>")
19
+ @body
20
+ end
21
+
22
+ def content
23
+ if @custom_content
24
+ @custom_content.gsub("{{sha}}", @sha)
25
+ else
26
+ @sha
27
+ end
28
+ end
29
+
30
+ def html
31
+ <<HTML
32
+ <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;">
33
+ <span style="text-align: center;">
34
+ <small style="color: white; font-weight: normal;font-size: 12px;">#{content}</small>
35
+ </span>
36
+ </div>
37
+ HTML
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,3 @@
1
+ module Shack
2
+ VERSION = "0.0.1"
3
+ end
data/lib/shack.rb ADDED
@@ -0,0 +1,8 @@
1
+ require "shack/version"
2
+ require "shack/middleware"
3
+ require "shack/stamp"
4
+ require "shack/railtie" if defined?(Rails)
5
+
6
+ module Shack
7
+ # Your code goes here...
8
+ end
data/shack.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'shack/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "shack"
8
+ spec.version = Shack::VERSION
9
+ spec.authors = ["pjaspers"]
10
+ spec.email = ["piet@jaspe.rs"]
11
+ spec.summary = %q{Sha + Rack = Shack }
12
+ spec.description = %q{Rack middleware to expose a potential sha}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+ spec.cert_chain = ['certs/pjaspers.pem']
21
+ spec.signing_key = File.expand_path("~/.ssh/gem-private_key.pem") if $0 =~ /gem\z/
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.7"
24
+ end
data/test/benchmark.rb ADDED
@@ -0,0 +1,32 @@
1
+ # -*- coding: utf-8 -*-
2
+ require "rack"
3
+ require "shack"
4
+ require "benchmark/ips"
5
+
6
+ # Idea from [here](http://www.schneems.com/2014/10/31/benchmarking-rack-middleware.html)
7
+ # Thanks @schneems
8
+ noop = -> (_env) { [200, { "Content-Type" => "text/html" }, ["hello"]] }
9
+ middleware = Shack::Middleware.new(noop, "abc123")
10
+
11
+ request = Rack::MockRequest.new(middleware)
12
+ noop_request = Rack::MockRequest.new(noop)
13
+
14
+ Benchmark.ips do |x|
15
+ x.config(time: 5, warmup: 5)
16
+ x.report("With Shack") { request.get("/") }
17
+ x.report("With noop") { noop_request.get("/") }
18
+ x.compare!
19
+ end
20
+
21
+ # Current results:
22
+ #
23
+ # Calculating -------------------------------------
24
+ # With Shack 205.000 i/100ms
25
+ # With noop 446.000 i/100ms
26
+ # -------------------------------------------------
27
+ # With Shack 2.522k (±23.8%) i/s - 10.455k
28
+ # With noop 6.528k (±21.5%) i/s - 28.098k
29
+ #
30
+ # Comparison:
31
+ # With noop: 6528.4 i/s
32
+ # With Shack: 2521.7 i/s - 2.59x slower
data/test/helper.rb ADDED
@@ -0,0 +1,10 @@
1
+ # coding: utf-8
2
+
3
+ require "minitest/autorun"
4
+ require "minitest/pride"
5
+ require "mocha"
6
+
7
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
8
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
9
+
10
+ require "shack"
@@ -0,0 +1,104 @@
1
+ require "helper.rb"
2
+ require "rack/mock"
3
+
4
+ describe Shack::Middleware do
5
+ before do
6
+ @app = ->(env) { [200, env, "app"] }
7
+ end
8
+
9
+ describe "without a sha" do
10
+ before do
11
+ @middleware = Shack::Middleware.new(@app, "")
12
+ end
13
+
14
+ it "doesn't break the original app" do
15
+ status, _, _ = @middleware.call(fake_env("http://something.com"))
16
+ assert_equal status, 200
17
+ end
18
+
19
+ it "doesn't set a header" do
20
+ _, headers, _ = @middleware.call(fake_env("http://something.com"))
21
+ assert_nil headers[Shack::Middleware::HEADER_NAME]
22
+ end
23
+ end
24
+
25
+ describe "with a sha" do
26
+ before do
27
+ @sha = "abc123def4"
28
+ @middleware = Shack::Middleware.new(@app, @sha)
29
+ end
30
+
31
+ after do
32
+ Shack::Middleware.configure do |shack|
33
+ shack.sha = nil
34
+ shack.content = nil
35
+ end
36
+ end
37
+
38
+ it "doesn't break the original app" do
39
+ status, _, _ = @middleware.call(fake_env("http://something.com"))
40
+ assert_equal status, 200
41
+ end
42
+
43
+ it "sets the header to the sha" do
44
+ _, headers, _ = @middleware.call(fake_env("http://something.com"))
45
+ assert_equal @sha, headers[Shack::Middleware::HEADER_NAME]
46
+ end
47
+ end
48
+
49
+ describe "injecting html" do
50
+ it "adds a stamp if content-type is text/html" do
51
+ app = ->(_) { [200, { "Content-Type" => "text/html" }, fake_page] }
52
+ middleware = Shack::Middleware.new(app, "Rollo Tomassi")
53
+ _, _, response = middleware.call(fake_env("http://something.com"))
54
+ assert_match(/Rollo Tomassi/, response.body.first)
55
+ end
56
+ end
57
+
58
+ 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
+
66
+ it "can set a sha" do
67
+ Shack::Middleware.configure { |s| s.sha = "O'Sullivan" }
68
+ assert_equal Shack::Middleware.sha, "O'Sullivan"
69
+ end
70
+
71
+ it "favors the initialized sha over the configured one" do
72
+ Shack::Middleware.configure { |s| s.sha = "O'Sullivan" }
73
+ app = ->(_) { [200, { "Content-Type" => "text/html" }, fake_page] }
74
+ s = Shack::Middleware.new(app, "The Rocket")
75
+ assert_equal s.sha, "The Rocket"
76
+ end
77
+
78
+ it "can set a custom content string" do
79
+ string = "O'Sullivan - http://bbc.co.uk/{{sha}}"
80
+ Shack::Middleware.configure do |s|
81
+ s.content = string
82
+ end
83
+ assert_equal Shack::Middleware.content, string
84
+ end
85
+
86
+ it "sets the stamp with the configuration" do
87
+ app = ->(_) { [200, { "Content-Type" => "text/html" }, fake_page] }
88
+ Shack::Middleware.configure do |s|
89
+ s.sha = "abc123"
90
+ s.content = "Ronnie The Rocket - {{sha}}"
91
+ end
92
+ middleware = Shack::Middleware.new(app)
93
+ _, _, response = middleware.call(fake_env("http://something.com"))
94
+ assert_match(/Ronnie The Rocket - abc123/, response.body.first)
95
+ end
96
+ end
97
+ def fake_page
98
+ "<html><body></body></html>"
99
+ end
100
+
101
+ def fake_env(url, options = {})
102
+ Rack::MockRequest.env_for(url, options)
103
+ end
104
+ end
@@ -0,0 +1,7 @@
1
+ require "helper"
2
+
3
+ describe Shack do
4
+ it "'s alive!" do
5
+ assert true
6
+ end
7
+ end
@@ -0,0 +1,35 @@
1
+ require "helper.rb"
2
+ require "rack/mock"
3
+
4
+ describe Shack::Stamp do
5
+ describe ".stampable?" do
6
+ {"text/html" => true, "application/json" => false, "text/plain" => false}.each do |content_type, stampable|
7
+ in_words = stampable ? "stampable" : "unstampable"
8
+ it "#{content_type} is #{in_words}" do
9
+ assert_equal stampable, Shack::Stamp.stampable?("Content-Type" => content_type)
10
+ end
11
+ end
12
+ end
13
+
14
+ describe "stamping" do
15
+ it "should do nothing if no </body> found" do
16
+ s = Shack::Stamp.new("something", "Jack Vincennes")
17
+ assert_equal "something", s.result
18
+ end
19
+
20
+ it "should add content if </body> found" do
21
+ s = Shack::Stamp.new("<html><body></body></html>", "Jack Vincennes")
22
+ assert_match(/Jack Vincennes/, s.result)
23
+ end
24
+
25
+ it "should use custom_content if provided" do
26
+ s = Shack::Stamp.new("<html><body></body></html>", "Jack Vincennes", "Rollo Tomassi")
27
+ assert_match(/Rollo Tomassi/, s.result)
28
+ end
29
+
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}}")
32
+ assert_match(/Rollo Tomassi said Jack Vincennes/, s.result)
33
+ end
34
+ end
35
+ end
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: shack
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - pjaspers
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDKDCCAhCgAwIBAgIBADANBgkqhkiG9w0BAQUFADA6MQ0wCwYDVQQDDARwaWV0
14
+ MRUwEwYKCZImiZPyLGQBGRYFamFzcGUxEjAQBgoJkiaJk/IsZAEZFgJyczAeFw0x
15
+ NDA0MDcyMTQyMDNaFw0xNTA0MDcyMTQyMDNaMDoxDTALBgNVBAMMBHBpZXQxFTAT
16
+ BgoJkiaJk/IsZAEZFgVqYXNwZTESMBAGCgmSJomT8ixkARkWAnJzMIIBIjANBgkq
17
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+SQ5IzhMaUM/jrUBAP5l0/Z5ttLQb2lT
18
+ hotS1Yraz3hclbGhBhDcQilW11GSftUbWhaiMQwNXqaEN9ctmzE5JukOdwhtNSLq
19
+ IDw+TEEXbg/VImlFhryg9vunffPeOBUlnxdY484DOushNN50H/LA+jAoFST3+oZq
20
+ CXuA3yFi8ZTPqhHrEn1bkycUfLX+TOm07ZfCPly9fAVYhOYaVaPeYkHAO83+Ic63
21
+ 9YGqD1sFeZ7hfSxqfYEBxpiM0+qztqHCVNrehkzX2oUmY06eVpSu2mzLYmcCD58f
22
+ inVDRBe/3ygkACxZCA7pjIuqHOpKxSbYMrgEkrAtpA7lkIMaveMY9QIDAQABozkw
23
+ NzAJBgNVHRMEAjAAMB0GA1UdDgQWBBSSJbKSj/62BYq/1utxyqsShRum8jALBgNV
24
+ HQ8EBAMCBLAwDQYJKoZIhvcNAQEFBQADggEBAJkG60vFt/GBuMvTdMtFCw4jJiRo
25
+ 8n6dMQrL2kZdD0ZNeidLfTMzhflv+9ZrWfcFWzfqaGgKJckBd2wlfQiR78ts9zom
26
+ bX9B9n/Ad32womLnb0aeTuEHX6Vy4qs4zl+VnXy4g1NQ2lfcnksUsjBM8v8GYTjy
27
+ ssiOQnzrWxNyjR01uY5g/ON/IlRKNpihe7Qze1oGWdopZP6Lwfhir5ShbDETCKQv
28
+ CuJWUOdBRsHbSraLW8n/vc/fZGqVzDAghs26bxmwicw+4/VgO2soYka81t8pUuG6
29
+ vLWWrtmIv8+cmMgvltP5AR5j2oYHYPPA9YFXuO9t1JVqJiNHm9JNRseEoBc=
30
+ -----END CERTIFICATE-----
31
+ date: 2014-12-05 00:00:00.000000000 Z
32
+ dependencies:
33
+ - !ruby/object:Gem::Dependency
34
+ name: bundler
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.7'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.7'
47
+ description: Rack middleware to expose a potential sha
48
+ email:
49
+ - piet@jaspe.rs
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - ".gitignore"
55
+ - ".travis.yml"
56
+ - Gemfile
57
+ - LICENSE.txt
58
+ - README.md
59
+ - Rakefile
60
+ - certs/pjaspers.pem
61
+ - checksum/shack-0.0.1.sha512
62
+ - lib/shack.rb
63
+ - lib/shack/middleware.rb
64
+ - lib/shack/railtie.rb
65
+ - lib/shack/stamp.rb
66
+ - lib/shack/version.rb
67
+ - shack.gemspec
68
+ - test/benchmark.rb
69
+ - test/helper.rb
70
+ - test/middleware_test.rb
71
+ - test/shack_test.rb
72
+ - test/stamp_test.rb
73
+ homepage: ''
74
+ licenses:
75
+ - MIT
76
+ metadata: {}
77
+ post_install_message:
78
+ rdoc_options: []
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ requirements: []
92
+ rubyforge_project:
93
+ rubygems_version: 2.2.2
94
+ signing_key:
95
+ specification_version: 4
96
+ summary: Sha + Rack = Shack
97
+ test_files:
98
+ - test/benchmark.rb
99
+ - test/helper.rb
100
+ - test/middleware_test.rb
101
+ - test/shack_test.rb
102
+ - test/stamp_test.rb
metadata.gz.sig ADDED
@@ -0,0 +1,2 @@
1
+ R���{���`KMF=����>�6�!k�IH� Ҟ5c����0��zW|| ܥ;�؃���
2
+ 0X�'dր�n-