planbcd-rails 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: e92e7c57c1883b8432fd5a3c1b86aa4450ab48c6
4
- data.tar.gz: bb7d6d59dd227b1d9e9d0403166de2b4d84428fe
3
+ metadata.gz: 5c0d0646acb96f02b50d69e52b19e9d8fba08ec4
4
+ data.tar.gz: b57d6f8be129bbb7a858698f36ae0867cddb8287
5
5
  SHA512:
6
- metadata.gz: 189066d4b57ec15859d892fb3502d8d9fa2bfcb62ef1f3d2620439644097c71324c5c0c3e624960590a754df8698467feff6fd0c903fb62a6989e313a118e9c6
7
- data.tar.gz: 5e49f5cbd9d0cee7420d5832eb52380877f19ee719b2b8caa335a1788e24df1b657c62b05c0b3313d41de49ed2baf40e445f99d1be4ff10e9b5eed836fcc640f
6
+ metadata.gz: 3f086b7daee187846c4cfe6c410b3edd650172ed0b3a498166988e5422834beb683e2188786f5086b33fc8fd9db502c4cfc9bd72f9cc4f718d728b0fedd3c3f3
7
+ data.tar.gz: 5c5d42f3aa70326e1c007269707e3adb1248ae089af4d5fd6469a49864f254c09c3c81580d81aa899c298ca4d120388037e7e1468658e1a041cc4c204503da01
data/README.md CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/planbcd-rails.png)](https://rubygems.org/gems/planbcd-rails) [![Build Status](https://secure.travis-ci.org/dtaniwaki/planbcd-rails.png?branch=master)](http://travis-ci.org/dtaniwaki/planbcd-rails) [![Coverage Status](https://coveralls.io/repos/dtaniwaki/planbcd-rails/badge.png)](https://coveralls.io/r/dtaniwaki/planbcd-rails)
4
4
 
5
- PlanBCD For Rails! So great.
5
+ [PlanBCD](https://planb.cd/) For Rails! So great.
6
+
7
+ This is NOT a official gem from [KAIZEN Platform Inc](http://kaizenplatform.in/).
6
8
 
7
9
  ## Installation
8
10
 
@@ -21,9 +23,15 @@ Then, initialize planbcd.
21
23
  bundle exec rails generate planbcd:install
22
24
  ```
23
25
 
24
- ## TODO
26
+ ## Configuration
27
+
28
+ ### `js`
29
+
30
+ JS URL which you can find on PlanBCD offer page
31
+
32
+ ### `auto_insert` (Optional)
25
33
 
26
- - Add an option to insert the PlanBCD tag to any page
34
+ Set true if you want to insert the PlanBCD tag to all the pages generated by Rails
27
35
 
28
36
  ## Contributing
29
37
 
@@ -2,4 +2,7 @@ PlanBCD::Rails.configure do |c|
2
2
  # Set your JS file found in your offer.
3
3
  # c.js = "//localhost/abc/def.js"
4
4
  # c.js = proc { |controller| controller.is_something? ? "//localhost/abc/def_1.js" : "//localhost/abc/def_2.js" }
5
+
6
+ # Insert PlanBCD js code to any response for html request
7
+ # c.auto_insert = true
5
8
  end
@@ -1,7 +1,7 @@
1
1
  module PlanBCD
2
2
  module Rails
3
3
  class Configuration
4
- attr_accessor :js
4
+ attr_accessor :js, :auto_insert
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,38 @@
1
+ module PlanBCD
2
+ module Rails
3
+ class Middleware
4
+ include Rack::Utils
5
+ include ViewHelpers
6
+
7
+ def initialize(app)
8
+ @app = app
9
+ end
10
+
11
+ def call(env)
12
+ status, headers, response = @app.call(env)
13
+
14
+ headers = HeaderHash.new(headers)
15
+
16
+ if headers['Content-Type'].to_s =~ %r{^text/html;}i && PlanBCD::Rails.configuration.auto_insert
17
+ begin
18
+ response = insert_js(response)
19
+ rescue PlanBCD::Rails::Exception => e
20
+ $stderr.write "Failed to insert planbcd tag: #{e.message}\n"
21
+ end
22
+ end
23
+
24
+ [status, headers, response]
25
+ end
26
+
27
+ private
28
+
29
+ def insert_js(response)
30
+ body = ""
31
+ response.each do |r|
32
+ body.concat r.to_s
33
+ end
34
+ [body.sub(/(<head[^>]*>)/, "\\1#{pbcd_init}")]
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,11 +1,13 @@
1
1
  require 'rails/railtie'
2
2
  require 'planbcd/rails/view_helpers'
3
+ require 'planbcd/rails/middleware'
3
4
 
4
5
  module PlanBCD
5
6
  module Rails
6
7
  class Railtie < ::Rails::Railtie
7
- initializer "planbcd-rails" do
8
+ initializer "planbcd-rails" do |app|
8
9
  ActionView::Base.send :include, ViewHelpers
10
+ app.middleware.use Middleware
9
11
  end
10
12
  end
11
13
  end
@@ -1,5 +1,5 @@
1
1
  module PlanBCD
2
2
  module Rails
3
- VERSION = '0.0.2'
3
+ VERSION = '0.0.3'
4
4
  end
5
5
  end
@@ -6,7 +6,7 @@ module PlanBCD
6
6
  module ViewHelpers
7
7
  def pbcd_init
8
8
  unless js = PlanBCD::Rails.configuration.js.presence
9
- raise PlanBCD::Rails::RuntimeError, "PlanBCD Javascript is not loaded."
9
+ raise PlanBCD::Rails::RuntimeError, "PlanBCD Javascript has not been set."
10
10
  end
11
11
 
12
12
  if js.respond_to?(:call)
@@ -6,7 +6,7 @@ Gem::Specification.new do |gem|
6
6
  gem.platform = Gem::Platform::RUBY
7
7
  gem.authors = ["Daisuke Taniwaki"]
8
8
  gem.email = ["daisuketaniwaki@gmail.com"]
9
- gem.homepage = "http://rubygems.org/gems/planbcd-rails"
9
+ gem.homepage = "https://github.com/dtaniwaki/planbcd-rails"
10
10
  gem.summary = "Use PlanBCD with Rails 3+"
11
11
  gem.description = "This gem provides view helpers for PlanBCD."
12
12
  gem.license = "MIT"
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe PlanBCD::Rails::Middleware do
4
+ let(:app) { double call: [200, {'Content-Type' => 'text/html; charset=utf-8'}, ['<html><head>something</head><body></body></html>']] }
5
+ let(:js) { '//planb.cd/test.js' }
6
+ subject { PlanBCD::Rails::Middleware.new(app) }
7
+ before do
8
+ PlanBCD::Rails.configure do |c|
9
+ c.js = js
10
+ c.auto_insert = true
11
+ end
12
+ end
13
+
14
+ it "inserts planbcd tag" do
15
+ status, headers, body = subject.call({})
16
+ expect(status).to eq(200)
17
+ expect(headers).to eq({'Content-Type' => 'text/html; charset=utf-8'})
18
+ expect(body).to eq([%Q~<html><head><script type=\"text/javascript\">(function(){!function(a,b,c,d,e){return d=\"http\"+(\"https:\"===c?\"s\":\"\")+\":\"+d,a.planBCDObject=e,a[e]||(a[e]=function(){var b;return((b=a[e]).q||(b.q=[])).push(arguments),a[e].l=1*new Date}),b.write(unescape('%3Cscript type=\"text/javascript\" src=\"'+d+'\"%3E%3C/script%3E'))}(window,document,document.location.protocol,\"//planb.cd/test.js\",\"pbcd\")}).call(this);</script>something</head><body></body></html>~])
19
+ end
20
+ context "head tag with something" do
21
+ let(:app) { double call: [200, {'Content-Type' => 'text/html; charset=utf-8'}, ['<html><head abcdefg>something</head><body></body></html>']] }
22
+ it "inserts planbcd tag" do
23
+ status, headers, body = subject.call({})
24
+ expect(status).to eq(200)
25
+ expect(headers).to eq({'Content-Type' => 'text/html; charset=utf-8'})
26
+ expect(body).to eq([%Q~<html><head abcdefg><script type=\"text/javascript\">(function(){!function(a,b,c,d,e){return d=\"http\"+(\"https:\"===c?\"s\":\"\")+\":\"+d,a.planBCDObject=e,a[e]||(a[e]=function(){var b;return((b=a[e]).q||(b.q=[])).push(arguments),a[e].l=1*new Date}),b.write(unescape('%3Cscript type=\"text/javascript\" src=\"'+d+'\"%3E%3C/script%3E'))}(window,document,document.location.protocol,\"//planb.cd/test.js\",\"pbcd\")}).call(this);</script>something</head><body></body></html>~])
27
+ end
28
+ end
29
+ context "no head tag in body" do
30
+ let(:app) { double call: [200, {'Content-Type' => 'text/html; charset=utf-8'}, ['<html><body></body></html>']] }
31
+ it "does not insert planbcd tag if the body does not have head tag" do
32
+ status, headers, body = subject.call({})
33
+ expect(status).to eq(200)
34
+ expect(headers).to eq({'Content-Type' => 'text/html; charset=utf-8'})
35
+ expect(body).to eq([%Q~<html><body></body></html>~])
36
+ end
37
+ end
38
+ context "not html request" do
39
+ let(:app) { double call: [200, {'Content-Type' => 'application/json;'}, ['{}']] }
40
+ it "does not insert planbcd tag if the body does not have head tag" do
41
+ expect(subject).not_to receive(:insert_js)
42
+ status, headers, body = subject.call({})
43
+ expect(status).to eq(200)
44
+ expect(headers).to eq({'Content-Type' => 'application/json;'})
45
+ expect(body).to eq(['{}'])
46
+ end
47
+ end
48
+ context "no js" do
49
+ let(:js) { nil }
50
+ it "does not raise error but write the log" do
51
+ expect($stderr).to receive(:write).with(/^Failed to insert planbcd tag: /)
52
+ expect {
53
+ subject.call({})
54
+ }.not_to raise_error
55
+ end
56
+ end
57
+ end
@@ -3,12 +3,16 @@ require 'action_view'
3
3
 
4
4
  describe PlanBCD::Rails::Railtie do
5
5
  before :all do
6
- app = Class.new(Rails::Application)
7
- app.initialize!
6
+ @app = Class.new(Rails::Application)
7
+ @app.initialize!
8
8
  end
9
9
  subject { ActionView::Base.new }
10
10
 
11
11
  it "should have planbcd helpers" do
12
12
  expect(subject).to respond_to(:pbcd_init)
13
13
  end
14
+
15
+ it "should add rack middleware" do
16
+ expect(@app.middleware.middlewares).to include(PlanBCD::Rails::Middleware)
17
+ end
14
18
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: planbcd-rails
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
  - Daisuke Taniwaki
@@ -96,14 +96,16 @@ files:
96
96
  - lib/planbcd/rails.rb
97
97
  - lib/planbcd/rails/configuration.rb
98
98
  - lib/planbcd/rails/error.rb
99
+ - lib/planbcd/rails/middleware.rb
99
100
  - lib/planbcd/rails/railtie.rb
100
101
  - lib/planbcd/rails/version.rb
101
102
  - lib/planbcd/rails/view_helpers.rb
102
103
  - planbcd-rails.gemspec
104
+ - spec/planbcd/rails/middleware_spec.rb
103
105
  - spec/planbcd/rails/railtie_spec.rb
104
106
  - spec/planbcd/rails/view_helpers_spec.rb
105
107
  - spec/spec_helper.rb
106
- homepage: http://rubygems.org/gems/planbcd-rails
108
+ homepage: https://github.com/dtaniwaki/planbcd-rails
107
109
  licenses:
108
110
  - MIT
109
111
  metadata: {}
@@ -123,11 +125,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
125
  version: '0'
124
126
  requirements: []
125
127
  rubyforge_project:
126
- rubygems_version: 2.0.14
128
+ rubygems_version: 2.2.2
127
129
  signing_key:
128
130
  specification_version: 4
129
131
  summary: Use PlanBCD with Rails 3+
130
132
  test_files:
133
+ - spec/planbcd/rails/middleware_spec.rb
131
134
  - spec/planbcd/rails/railtie_spec.rb
132
135
  - spec/planbcd/rails/view_helpers_spec.rb
133
136
  - spec/spec_helper.rb