ramen-rails 0.0.3 → 0.0.4

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: a15c33ea6b27c1c50f0fd07447be2ef4292e77f6
4
- data.tar.gz: e285639be89f2f6c5571a9671f662f64aeeae013
3
+ metadata.gz: 0ee40bc6fca9b914f2858387ecb699be14f91d46
4
+ data.tar.gz: 37f05f73081f823fd3abf946e348d793e76627f8
5
5
  SHA512:
6
- metadata.gz: 284b8b82a0cabbeacc989c8accfd407cb42e4b01cbe45923bda932cf757f72463f56635b103edf3873a5cf0c5ba4a5aa9b8db1f7a2cfd77f1215b5f0f36196a3
7
- data.tar.gz: 1e2e1d87850827365dcf385fbcf0d281cbc85f2c30b438efe4eab258e6734be743d61de152f28ba0dd4e3d012e48ea716582dc01e72ac1aa8824ca33df5ad9e1
6
+ metadata.gz: 55ca55c3733132e9a258c15ac87b9a22b14c90048c920e97b4fe514e45bb17a12352aa6f655c36b24596bcbac0ffabf06b0d6d7822729df80bf6b2dc7364f090
7
+ data.tar.gz: 67f18b37beaa3b76a892f08bd2b2ee4a25d307fd5b6d8e0121badbaf5b11a7fbdbe4a2d0d9118548dcf12922489f7a731d052cb3e492f5efd90452b71150e741
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - "1.9.3"
4
+ - "2.1.2"
5
+
6
+ script: bundle exec rspec
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ramen-rails (0.0.1)
5
- activesupport
4
+ ramen-rails (0.0.4)
5
+ activesupport (~> 4.2.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
@@ -64,6 +64,7 @@ GEM
64
64
  rspec-support (~> 3.2.0)
65
65
  rspec-support (3.2.2)
66
66
  thread_safe (0.3.5)
67
+ timecop (0.7.3)
67
68
  tzinfo (1.2.2)
68
69
  thread_safe (~> 0.1)
69
70
 
@@ -71,8 +72,9 @@ PLATFORMS
71
72
  ruby
72
73
 
73
74
  DEPENDENCIES
74
- actionpack
75
- hashie
76
- rake
75
+ actionpack (~> 4.2.0)
76
+ hashie (~> 3.4.0)
77
+ rake (~> 10.4.2)
77
78
  ramen-rails!
78
- rspec
79
+ rspec (~> 3.2.0)
80
+ timecop (~> 0.7.3)
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # ramen-rails
2
+ [![Build Status](https://travis-ci.org/ramen-dev/ramen-rails.svg)](https://travis-ci.org/ramen-dev/ramen-rails)
3
+
4
+ This is a Rails helper for [Ramen](https://ramen.is). Ramen is a product that helps
5
+ B2B SaaS product managers build better products by given them tools to better understand
6
+ what their customers need, and how satisfied their customers are with the results.
7
+
8
+ This gem will automatically inject the `ramen.js` script tag into pages.
9
+
10
+ # Installation
11
+ Add this to your Gemfile:
12
+
13
+ ```
14
+ gem "ramen-rails"
15
+ ```
16
+
17
+ Then run:
18
+
19
+ ```
20
+ bundle install
21
+ ```
22
+
23
+ # Usage
24
+
25
+ The following command will add `ramen.rb` to your `config/initializers`.
26
+ You can get your ID and SECRET in your Ramen Management Console.
27
+
28
+ ```
29
+ rails g ramen:config ORGANIZATION_ID ORGANIZATION_SECRET
30
+ ```
31
+
32
+ # Thanks
33
+ This gem was heavily inspired by the [intercom-rails](https://github.com/intercom/intercom-rails)
34
+ gem. We <3 Intercom at Ramen. If you're looking for a nice way to have conversations
35
+ with your customers in your web application, give them a holler.
36
+
37
+
38
+ # License
39
+ MIT-LICENSE for life.
@@ -4,13 +4,12 @@ require 'ramen-rails/ramen_after_filter'
4
4
  module RamenRails
5
5
  class Railtie < Rails::Railtie
6
6
  initializer "ramen_rails.script_tag_helper.rb" do |app|
7
- ActionView::Base.send :include,
8
- ScriptTagHelper
7
+ ActionView::Base.send :include, ScriptTagHelper
9
8
  end
10
9
 
11
10
  initializer "ramen_rails.auto_include_filter.rb" do |app|
12
- ActionController::Base.send :after_filter,
13
- RamenAfterFilter
11
+ ActionController::Base.send :include, AutoInclude
12
+ ActionController::Base.send :after_filter, :add_ramen_script_tag
14
13
  end
15
14
  end
16
15
  end
@@ -1,6 +1,13 @@
1
1
  module RamenRails
2
2
 
3
+ module AutoInclude
4
+ def add_ramen_script_tag
5
+ RamenAfterFilter.filter(self)
6
+ end
7
+ end
8
+
3
9
  class RamenAfterFilter
10
+
4
11
  include ScriptTagHelper
5
12
  CLOSING_BODY_TAG = %r{</body>}
6
13
 
@@ -118,7 +125,8 @@ module RamenRails
118
125
 
119
126
  obj = {}
120
127
  [:url, :id, :value, :name].each do |attr|
121
- obj[attr] = user.send(attr) if user.respond_to?(attr) && user.send(attr).present?
128
+ obj[attr] = company.send(attr) if company.respond_to?(attr) &&
129
+ company.send(attr).present?
122
130
  end
123
131
 
124
132
  obj
@@ -129,6 +137,7 @@ module RamenRails
129
137
  obj = {}
130
138
  obj[:organization_id] = ramen_org_id
131
139
  obj[:user] = {}
140
+ obj[:timestamp] = Time.now.to_i
132
141
 
133
142
  user = ramen_user_object
134
143
 
@@ -0,0 +1,63 @@
1
+ require "active_support/json"
2
+ require "active_support/core_ext/hash/indifferent_access"
3
+
4
+ module RamenRails
5
+ class ScriptTag
6
+ class EmptySettings < StandardError; end
7
+
8
+ def self.generate(template, ramen_settings, options = {})
9
+ st = new(template, ramen_settings, options)
10
+ st.generate
11
+ end
12
+
13
+ attr_accessor :template, :ramen_settings, :options
14
+ def initialize(template, ramen_settings, options = {})
15
+ self.template = template
16
+ self.ramen_settings = ramen_settings
17
+ self.options = options
18
+ end
19
+
20
+ def generate
21
+ if ramen_settings.blank?
22
+ raise EmptySettings.new("need to pass ramen_script_tag a non-empty ramen_settings argument")
23
+ end
24
+
25
+ add_auth_hash!
26
+
27
+ ramen_script = <<-RAMEN_SCRIPT
28
+ <script id="RamenSettingsScriptTag">
29
+ window.ramenSettings = #{ActiveSupport::JSON.encode(ramen_settings)};
30
+ </script>
31
+ <script src="https://cdn.ramen.is/assets/ramen.js" async></script>
32
+ RAMEN_SCRIPT
33
+
34
+ if controller
35
+ controller.
36
+ instance_variable_set(RamenRails::SCRIPT_TAG_HELPER_CALLED_INSTANCE_VARIABLE, true)
37
+ end
38
+
39
+ ramen_script.respond_to?(:html_safe) ? ramen_script.html_safe : ramen_script
40
+ end
41
+
42
+ def add_auth_hash!
43
+ return unless ramen_settings[:user].present? &&
44
+ options[:organization_secret].present? &&
45
+ ramen_settings[:auth_hash].blank?
46
+
47
+ user = ramen_settings[:user]
48
+
49
+ if ramen_settings[:timestamp]
50
+ secret_string = "#{user[:email]}:#{user[:id]}:#{user[:name]}:#{ramen_settings[:timestamp]}:#{options[:organization_secret]}"
51
+ else
52
+ secret_string = "#{user[:email]}:#{user[:id]}:#{user[:name]}:#{options[:organization_secret]}"
53
+ end
54
+
55
+ ramen_settings[:auth_hash] = (Digest::SHA2.new << secret_string).to_s
56
+ end
57
+
58
+ def controller
59
+ template.try :controller
60
+ end
61
+
62
+ end
63
+ end
@@ -1,33 +1,11 @@
1
- require "active_support/json"
2
- require "active_support/core_ext/hash/indifferent_access"
1
+ require "ramen-rails/script_tag"
3
2
 
4
3
  module RamenRails
5
4
  SCRIPT_TAG_HELPER_CALLED_INSTANCE_VARIABLE = :@_ramen_script_tag_helper_called
6
5
 
7
6
  module ScriptTagHelper
8
-
9
- class EmptySettings < StandardError; end
10
-
11
7
  def ramen_script_tag(ramen_settings, options = {})
12
- if ramen_settings.blank?
13
- raise EmptySettings.new("need to pass ramen_script_tag a non-empty ramen_settings argument")
14
- end
15
-
16
- if ramen_settings[:user].present? && options[:organization_secret].present? && ramen_settings[:auth_hash].blank?
17
- user_details = ramen_settings[:user]
18
- secret_string = "#{user_details[:email]}:#{user_details[:id]}:#{user_details[:name]}:#{options[:organization_secret]}"
19
- ramen_settings[:auth_hash] = (Digest::SHA2.new << secret_string).to_s
20
- end
21
-
22
- ramen_script = <<-RAMEN_SCRIPT
23
- <script id="RamenSettingsScriptTag">
24
- var ramenSettings = #{ActiveSupport::JSON.encode(ramen_settings)};
25
- </script>
26
- <script src="https://cdn.ramen.is/assets/ramen.js" async></script>
27
- RAMEN_SCRIPT
28
-
29
- controller.instance_variable_set(RamenRails::SCRIPT_TAG_HELPER_CALLED_INSTANCE_VARIABLE, true) if defined?(controller)
30
- ramen_script.respond_to?(:html_safe) ? ramen_script.html_safe : ramen_script
8
+ ScriptTag.generate(self, ramen_settings, options)
31
9
  end
32
10
  end
33
11
  end
@@ -1,3 +1,3 @@
1
1
  module RamenRails
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/ramen-rails.gemspec CHANGED
@@ -13,12 +13,13 @@ Gem::Specification.new do |s|
13
13
  s.description = %q{Ramen helps B2B SaaS product teams build better products through workflow-enhance customer development}
14
14
 
15
15
 
16
- s.add_development_dependency "actionpack"
17
- s.add_development_dependency "rake"
18
- s.add_development_dependency "rspec"
19
- s.add_development_dependency "hashie"
16
+ s.add_development_dependency "actionpack", "~>4.0.0"
17
+ s.add_development_dependency "rake", "~>10.4.2"
18
+ s.add_development_dependency "rspec", "~>3.2.0"
19
+ s.add_development_dependency "hashie", "~>3.4.0"
20
+ s.add_development_dependency "timecop", "~>0.7.3"
20
21
 
21
- s.add_dependency "activesupport"
22
+ s.add_dependency "activesupport", "~>4.0.0"
22
23
 
23
24
  s.rubyforge_project = "ramen-rails"
24
25
 
@@ -37,10 +37,19 @@ describe 'After filter' do
37
37
  end
38
38
 
39
39
  it "should attach tag" do
40
- filter = RamenRails::RamenAfterFilter.filter(@dummy)
41
- expect(@dummy.response.body).to include("script")
42
- expect(@dummy.response.body).to include("Angilly")
43
- expect(@dummy.response.body).to_not include("company")
40
+ Timecop.freeze do
41
+ ts = Time.now.to_i
42
+ auth_hash = (Digest::SHA2.new << "ryan@ramen.is:person-1234:Ryan Angilly:5678").to_s
43
+ ts_auth_hash = (Digest::SHA2.new << "ryan@ramen.is:person-1234:Ryan Angilly:#{ts}:5678").to_s
44
+
45
+ filter = RamenRails::RamenAfterFilter.filter(@dummy)
46
+
47
+ expect(@dummy.response.body).to_not include(auth_hash)
48
+ expect(@dummy.response.body).to include(ts_auth_hash)
49
+ expect(@dummy.response.body).to include("script")
50
+ expect(@dummy.response.body).to include("Angilly")
51
+ expect(@dummy.response.body).to_not include("company")
52
+ end
44
53
  end
45
54
 
46
55
  describe "and a company" do
@@ -22,7 +22,7 @@ describe 'Script Tag Helper' do
22
22
  it "should raise if the script tag helper is passed a blank object" do
23
23
  expect do
24
24
  @template.ramen_script_tag({})
25
- end.to raise_error(RamenRails::ScriptTagHelper::EmptySettings)
25
+ end.to raise_error(RamenRails::ScriptTag::EmptySettings)
26
26
  end
27
27
 
28
28
  it "should render the tag" do
@@ -66,6 +66,32 @@ describe 'Script Tag Helper' do
66
66
  expect(output).to include(auth_hash)
67
67
  end
68
68
 
69
+ it "should work timestamp into hash if provided" do
70
+ ts = Time.now.to_i
71
+ ramen_settings = {
72
+ timestamp: ts,
73
+ organization_id: rand(1_000_000),
74
+ user: {
75
+ email: 'ryan@ramen.is',
76
+ name: 'Ryan Angilly',
77
+ id: '346656'
78
+ }
79
+ }
80
+
81
+ options = {organization_secret: "1234"}
82
+
83
+ not_auth_hash = (Digest::SHA2.new << "ryan@ramen.is:346656:Ryan Angilly:1234").to_s
84
+ auth_hash = (Digest::SHA2.new << "ryan@ramen.is:346656:Ryan Angilly:#{ts}:1234").to_s
85
+
86
+ output = @template.ramen_script_tag(ramen_settings, options)
87
+
88
+ expect(output).to include("Ryan Angilly")
89
+ expect(output).to include("auth_hash")
90
+ expect(output).not_to include(not_auth_hash)
91
+ expect(output).to include(auth_hash)
92
+
93
+ end
94
+
69
95
  it "should not override auth_hash if it is provided" do
70
96
  ramen_settings = {
71
97
  organization_id: rand(1_000_000),
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'rspec'
2
2
  require 'ramen-rails'
3
3
  require 'hashie/mash'
4
+ require 'timecop'
4
5
 
5
6
  RSpec.configure do |config|
6
7
 
metadata CHANGED
@@ -1,85 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ramen-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Angilly
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-17 00:00:00.000000000 Z
11
+ date: 2015-03-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 4.0.0
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 4.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 10.4.2
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 10.4.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 3.2.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 3.2.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: hashie
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 3.4.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: 3.4.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: timecop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.7.3
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.7.3
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: activesupport
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - ">="
87
+ - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '0'
89
+ version: 4.0.0
76
90
  type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - ">="
94
+ - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '0'
96
+ version: 4.0.0
83
97
  description: Ramen helps B2B SaaS product teams build better products through workflow-enhance
84
98
  customer development
85
99
  email:
@@ -90,9 +104,11 @@ extra_rdoc_files: []
90
104
  files:
91
105
  - ".ruby-gemset"
92
106
  - ".ruby-version"
107
+ - ".travis.yml"
93
108
  - Gemfile
94
109
  - Gemfile.lock
95
110
  - MIT-LICENSE
111
+ - README.md
96
112
  - Rakefile
97
113
  - lib/rails/generators/ramen/config/config_generator.rb
98
114
  - lib/rails/generators/ramen/config/ramen.rb.erb
@@ -100,6 +116,7 @@ files:
100
116
  - lib/ramen-rails/config.rb
101
117
  - lib/ramen-rails/railtie.rb
102
118
  - lib/ramen-rails/ramen_after_filter.rb
119
+ - lib/ramen-rails/script_tag.rb
103
120
  - lib/ramen-rails/script_tag_helper.rb
104
121
  - lib/ramen-rails/version.rb
105
122
  - ramen-rails.gemspec