lucid_intercom 0.4.2

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e093b7cbc34689c682b5f4f1d3fd4fdef7ac033c9cf0fba38b0404e54f50c9a8
4
+ data.tar.gz: e08a13e91779a38d92d076bcfad7a7e6003ad5b3ea4de3086cfc0ca9432d162e
5
+ SHA512:
6
+ metadata.gz: b02dbad3e5c7284f146b53f02e2bac8ed500edb95662ed5cfc1a709330b80db817c035973a451f2d9af7a58f3d62d2dcb33df4f1b1b04a188d71fb186ce90703
7
+ data.tar.gz: e2de118f2b5767081d4f8bea3d75ec8e359644799f94e1542c69917d248d12635a3af5d0348ac1f98674242c90f992d33437ee7316ac07d3657e80d83d2e0c33
@@ -0,0 +1,76 @@
1
+ lucid_intercom
2
+ ==============
3
+
4
+ Installation
5
+ ------------
6
+
7
+ Add the gem to your ‘Gemfile’:
8
+
9
+ gem 'lucid_intercom'
10
+
11
+
12
+ Usage
13
+ -----
14
+
15
+ ### Configure the default API credentials
16
+
17
+ LucidIntercom.credentials = LucidIntercom::Credentials.new(
18
+ '...', # access_token
19
+ '...', # secret
20
+ '...', # app_id
21
+ '...' # app_prefix
22
+ )
23
+
24
+ Here, ‘app_prefix’ is the snakecased app name, e.g. ‘smart_order_tags’
25
+
26
+ Alternatively, a credentials object may optionally be passed as a
27
+ keyword argument to any of the classes listed below.
28
+
29
+
30
+ ### Render the browser snippet
31
+
32
+ LucidIntercom::RenderSnippet.new(shop_attributes, app_attributes).()
33
+
34
+ This returns an HTML string which you can use in your view layout.
35
+
36
+ See the source code for documentation of arguments.
37
+
38
+
39
+ ### Send an event
40
+
41
+ When a user installs/uninstalls the app, or changes their plan:
42
+
43
+ LucidIntercom::Events::Installed.new(shop_attributes).(plan_name)
44
+ LucidIntercom::Events::Uninstalled.new(shop_attributes).()
45
+ LucidIntercom::Events::ChangedPlan.new(shop_attributes).(plan_name)
46
+
47
+ Note that the `shop_attributes` hash for uninstalled events cannot
48
+ be read from the API (as the access token is invalid at this stage).
49
+ You should use the data hash provided with Shopify’s ‘app/uninstalled’
50
+ webhook instead.
51
+
52
+
53
+ ### Plan names
54
+
55
+ For installed apps, yet to subscribe to a plan, use ‘pending’.
56
+
57
+ For apps with a single paid plan, use ‘subscribed’.
58
+
59
+ For free apps, use ‘free’.
60
+
61
+ For partner-friendly app installs, use ‘partner’.
62
+
63
+
64
+ ### Send a custom event
65
+
66
+ LucidIntercom::SendEvent.new(shop_attributes).(event_name, event_metadata)
67
+
68
+ See the source code for documentation of arguments.
69
+
70
+
71
+ ### Update a user
72
+
73
+ LucidIntercom::UpdateUser.new(shop_attributes, app_attributes).()
74
+
75
+ When this is called, and the user did not previously exist, the
76
+ user will be created.
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Primarily for Bundler.
4
+
5
+ require 'lucid_intercom/attributes'
6
+ require 'lucid_intercom/credentials'
7
+ require 'lucid_intercom/events'
8
+ require 'lucid_intercom/render_snippet'
9
+ require 'lucid_intercom/send_event'
10
+ require 'lucid_intercom/update_user'
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lucid_intercom/attributes/user'
4
+ require 'lucid_intercom/attributes/company'
5
+ require 'lucid_intercom/attributes/custom'
6
+
7
+ module LucidIntercom
8
+ class Attributes
9
+ #
10
+ # @see LucidIntercom::Attributes::Base#initialize
11
+ #
12
+ def initialize(*args)
13
+ @args = args
14
+ end
15
+
16
+ #
17
+ # @return [Hash]
18
+ #
19
+ def user
20
+ user_browser.reject { |k, _| k == :user_hash }
21
+ end
22
+
23
+ #
24
+ # User attributes for browser (with 'user_hash').
25
+ #
26
+ # @return [Hash]
27
+ #
28
+ def user_browser
29
+ User.new(*@args).()
30
+ end
31
+
32
+ #
33
+ # @return [Hash]
34
+ #
35
+ def company
36
+ Company.new(*@args).()
37
+ end
38
+
39
+ #
40
+ # Company attributes for browser (expects 'id', not 'company_id').
41
+ #
42
+ # @return [Hash]
43
+ #
44
+ def company_browser
45
+ company2 = company
46
+ company2[:id] = company2.delete(:company_id)
47
+ company2
48
+ end
49
+
50
+ #
51
+ # @return [Hash]
52
+ #
53
+ def custom
54
+ Custom.new(*@args).()
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lucid_intercom/credentials'
4
+
5
+ module LucidIntercom
6
+ class Attributes
7
+ class Base
8
+ #
9
+ # @param shop_attributes [Hash] shop attributes in format returned by the Shopify API
10
+ # @param app_attributes [Hash] app-specific attributes (unprefixed)
11
+ # @param credentials [LucidIntercom::Credentials]
12
+ #
13
+ def initialize(shop_attributes = {}, app_attributes = {}, credentials = LucidIntercom.credentials)
14
+ @credentials = credentials
15
+ @shop_attributes = shop_attributes
16
+ @app_attributes = app_attributes
17
+ end
18
+
19
+ # @return [LucidIntercom::Credentials]
20
+ attr_reader :credentials
21
+ # @return [Hash]
22
+ attr_reader :shop_attributes
23
+ # @return [Hash]
24
+ attr_reader :app_attributes
25
+
26
+ #
27
+ # @return [Hash]
28
+ #
29
+ def call
30
+ normalize_values(attributes)
31
+ end
32
+
33
+ #
34
+ # @return [Hash]
35
+ #
36
+ private def attributes
37
+ {}
38
+ end
39
+
40
+ #
41
+ # Convert attribute values to valid Intercom types.
42
+ #
43
+ # @param attributes [Hash]
44
+ #
45
+ # @return [Hash]
46
+ #
47
+ private def normalize_values(attributes)
48
+ attributes.each_with_object({}) do |(k, v), a|
49
+ a[k] = case v
50
+ when Integer, Float
51
+ v
52
+ when Time
53
+ v.to_i
54
+ when nil
55
+ nil # unset attribute
56
+ else
57
+ v.to_s
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lucid_intercom/attributes/base'
4
+
5
+ module LucidIntercom
6
+ class Attributes
7
+ class Company < Base
8
+ #
9
+ # Standard Intercom company attributes.
10
+ #
11
+ # @return [Hash]
12
+ #
13
+ private def attributes
14
+ {
15
+ company_id: shop_attributes['myshopify_domain'],
16
+ name: shop_attributes['name'],
17
+ plan: shop_attributes['plan_name'],
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lucid_intercom/attributes/base'
4
+ require 'lucid_intercom/credentials'
5
+
6
+ module LucidIntercom
7
+ class Attributes
8
+ class Custom < Base
9
+ #
10
+ # Custom company attributes.
11
+ #
12
+ # @return [Hash]
13
+ #
14
+ private def attributes
15
+ super
16
+ .merge(attributes_shopify)
17
+ .merge(attributes_app)
18
+ end
19
+
20
+ #
21
+ # These custom attributes are prefixed with 'merchant_' to distinguish
22
+ # from the Shopify intergration's 'shopify_' prefix.
23
+ #
24
+ # @return [Hash]
25
+ #
26
+ private def attributes_shopify
27
+ {
28
+ merchant_domain: shop_attributes['domain'],
29
+ merchant_myshopify_domain: shop_attributes['myshopify_domain'],
30
+ merchant_shop_owner: shop_attributes['shop_owner'],
31
+ merchant_timezone: shop_attributes['timezone'],
32
+ }
33
+ end
34
+
35
+ #
36
+ # Anything app-specific.
37
+ #
38
+ # @return [Hash]
39
+ #
40
+ private def attributes_app
41
+ app_attributes.each_with_object({}) do |(k, v), a|
42
+ a["#{credentials.app_prefix}_#{k}"] = v
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'openssl'
4
+ require 'lucid_intercom/attributes/base'
5
+
6
+ module LucidIntercom
7
+ class Attributes
8
+ class User < Base
9
+ #
10
+ # Standard Intercom user attributes.
11
+ #
12
+ # @return [Hash]
13
+ #
14
+ private def attributes
15
+ {
16
+ # NOTE: currently unused in favour of email # user_id: shop_attributes['myshopify_domain'],
17
+ user_hash: user_hash(shop_attributes['email']),
18
+ email: shop_attributes['email'],
19
+ name: shop_attributes['shop_owner'],
20
+ }
21
+ end
22
+
23
+ private def user_hash(email)
24
+ OpenSSL::HMAC.hexdigest('sha256', credentials.secret, email)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LucidIntercom
4
+ #
5
+ # @!attribute [rw] access_token
6
+ # @return [String]
7
+ # @!attribute [rw] secret
8
+ # @return [String]
9
+ # @!attribute [rw] app_id
10
+ # @return [String]
11
+ # @!attribute [rw] app_prefix
12
+ # @return [String] the snakecased app name, e.g. 'smart_order_tags'
13
+ #
14
+ Credentials = Struct.new(:access_token, :secret, :app_id, :app_prefix)
15
+ end
16
+
17
+ class << LucidIntercom
18
+ #
19
+ # Assign default API credentials.
20
+ #
21
+ # @param credentials [LucidIntercom::Credentials]
22
+ #
23
+ attr_writer :credentials
24
+
25
+ #
26
+ # @return [LucidIntercom::Credentials]
27
+ #
28
+ # @raise [LucidIntercom::MissingCredentialsError] if credentials are unset
29
+ #
30
+ def credentials
31
+ raise MissingCredentialsError unless @credentials
32
+
33
+ @credentials
34
+ end
35
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lucid_intercom/errors/request_error'
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LucidIntercom
4
+ #
5
+ # Subclass this class for all gem exceptions, so that callers may rescue
6
+ # any subclass with:
7
+ #
8
+ # rescue LucidIntercom::Error => e
9
+ #
10
+ Error = Class.new(StandardError)
11
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lucid_intercom/errors/error'
4
+
5
+ module LucidIntercom
6
+ MissingCredentialsError = Class.new(Error)
7
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lucid_intercom/errors/error'
4
+
5
+ module LucidIntercom
6
+ class RequestError < Error
7
+ #
8
+ # @param status [Integer] the HTTP response status
9
+ #
10
+ def initialize(status)
11
+ @status = status
12
+ end
13
+
14
+ # @return [Integer]
15
+ attr_reader :status
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lucid_intercom/events/installed'
4
+ require 'lucid_intercom/events/uninstalled'
5
+ require 'lucid_intercom/events/changed_plan'
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lucid_intercom/credentials'
4
+
5
+ module LucidIntercom
6
+ module Events
7
+ class Base
8
+ #
9
+ # @param shop_attributes [Hash] shop attributes in format returned by the Shopify API
10
+ # @param credentials [LucidIntercom::Credentials]
11
+ #
12
+ def initialize(shop_attributes, credentials = LucidIntercom.credentials)
13
+ @credentials = credentials
14
+ @shop_attributes = shop_attributes
15
+ end
16
+
17
+ # @return [LucidIntercom::Credentials]
18
+ attr_reader :credentials
19
+ # @return [Hash]
20
+ attr_reader :shop_attributes
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lucid_intercom/credentials'
4
+ require 'lucid_intercom/send_event'
5
+ require 'lucid_intercom/update_user'
6
+ require 'lucid_intercom/events/base'
7
+
8
+ module LucidIntercom
9
+ module Events
10
+ class ChangedPlan < Base
11
+ #
12
+ # @param plan_name [String, nil] e.g. 'free', or nil to unset
13
+ #
14
+ def call(plan_name)
15
+ LucidIntercom::UpdateUser.new(shop_attributes, {plan: plan_name}, credentials).()
16
+ LucidIntercom::SendEvent.new(shop_attributes, credentials).(event_name, event_metadata(plan_name))
17
+ end
18
+
19
+ #
20
+ # @return [String]
21
+ #
22
+ private def event_name
23
+ "#{credentials.app_prefix}_changed_plan"
24
+ end
25
+
26
+ #
27
+ # @return [Hash]
28
+ #
29
+ private def event_metadata(plan_name)
30
+ {
31
+ company_id: shop_attributes['myshopify_domain'],
32
+ new_plan: plan_name,
33
+ }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lucid_intercom/credentials'
4
+ require 'lucid_intercom/send_event'
5
+ require 'lucid_intercom/update_user'
6
+ require 'lucid_intercom/events/base'
7
+
8
+ module LucidIntercom
9
+ module Events
10
+ class Installed < Base
11
+ #
12
+ # @param plan_name [String] e.g. 'free'
13
+ #
14
+ def call(plan_name)
15
+ LucidIntercom::UpdateUser.new(shop_attributes, {plan: plan_name}, credentials).()
16
+ LucidIntercom::SendEvent.new(shop_attributes, credentials).(event_name, event_metadata(plan_name))
17
+ end
18
+
19
+ #
20
+ # @return [String]
21
+ #
22
+ private def event_name
23
+ "#{credentials.app_prefix}_installed"
24
+ end
25
+
26
+ #
27
+ # @return [Hash]
28
+ #
29
+ private def event_metadata(plan_name)
30
+ {
31
+ company_id: shop_attributes['myshopify_domain'],
32
+ new_plan: plan_name,
33
+ }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lucid_intercom/credentials'
4
+ require 'lucid_intercom/send_event'
5
+ require 'lucid_intercom/update_user'
6
+ require 'lucid_intercom/events/base'
7
+
8
+ module LucidIntercom
9
+ module Events
10
+ class Uninstalled < Base
11
+ def call
12
+ LucidIntercom::UpdateUser.new(shop_attributes, {plan: nil}, credentials).()
13
+ LucidIntercom::SendEvent.new(shop_attributes, credentials).(event_name, event_metadata)
14
+ end
15
+
16
+ #
17
+ # @return [String]
18
+ #
19
+ private def event_name
20
+ "#{credentials.app_prefix}_uninstalled"
21
+ end
22
+
23
+ #
24
+ # @return [Hash]
25
+ #
26
+ private def event_metadata
27
+ {
28
+ company_id: shop_attributes['myshopify_domain'],
29
+ }
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+ require 'lucid_intercom/attributes'
5
+ require 'lucid_intercom/credentials'
6
+
7
+ module LucidIntercom
8
+ class RenderSnippet
9
+ TEMPLATE = ERB.new(File.read("#{__dir__}/snippet.html.erb")).freeze
10
+
11
+ #
12
+ # Leave arguments unset for unauthenticated visitors.
13
+ #
14
+ # @param credentials [LucidIntercom::Credentials]
15
+ #
16
+ # @see LucidIntercom::Attributes#initialize
17
+ #
18
+ def initialize(shop_attributes = {}, app_attributes = {}, credentials = LucidIntercom.credentials)
19
+ @credentials = credentials
20
+ @attributes = Attributes.new(shop_attributes, app_attributes, credentials) if shop_attributes.empty?
21
+ end
22
+
23
+ # @return [LucidIntercom::Attributes]
24
+ attr_reader :attributes
25
+ # @return [LucidIntercom::Credentials]
26
+ attr_reader :credentials
27
+
28
+ #
29
+ # @return [String] the rendered HTML
30
+ #
31
+ def call
32
+ TEMPLATE.result(binding)
33
+ end
34
+
35
+ #
36
+ # Quote and escape a value for the window.intercomSettings object.
37
+ #
38
+ private def h(v)
39
+ v.is_a?(String) ? ?" + v.gsub(/./) { |c| escape_char(c) } + ?" : v
40
+ end
41
+
42
+ private def escape_char(c)
43
+ %w(" ' / < > \\).include?(c) ? '\%s' % c : c
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'net/http'
5
+ require 'uri'
6
+ require 'lucid_intercom/attributes'
7
+ require 'lucid_intercom/credentials'
8
+ require 'lucid_intercom/errors'
9
+
10
+ module LucidIntercom
11
+ class SendEvent
12
+ #
13
+ # @param shop_attributes [Hash] shop attributes in format returned by the Shopify API
14
+ # @param credentials [LucidIntercom::Credentials]
15
+ #
16
+ def initialize(shop_attributes, credentials = LucidIntercom.credentials)
17
+ @attributes = Attributes.new(shop_attributes, {}, credentials)
18
+ @credentials = credentials
19
+ end
20
+
21
+ # @return [LucidIntercom::Attributes]
22
+ attr_reader :attributes
23
+ # @return [LucidIntercom::Credentials]
24
+ attr_reader :credentials
25
+
26
+ #
27
+ # Send event for user identified by attributes.
28
+ #
29
+ # @param event_name [String]
30
+ # @param event_metadata [Hash]
31
+ #
32
+ # @raise [LucidIntercom::RequestError] if the response status >= 400
33
+ #
34
+ def call(event_name, event_metadata)
35
+ res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
36
+ http.request(req, data(event_name, event_metadata))
37
+ end
38
+
39
+ status = res.code.to_i
40
+
41
+ if status >= 400 # rubocop:disable Style/GuardClause
42
+ raise LucidIntercom::RequestError.new(status), 'invalid response code %s' % status
43
+ end
44
+ end
45
+
46
+ #
47
+ # @return [URI::HTTPS]
48
+ #
49
+ private def uri
50
+ URI('https://api.intercom.io/events')
51
+ end
52
+
53
+ #
54
+ # @return [Net::HTTP::Post]
55
+ #
56
+ private def req
57
+ req = Net::HTTP::Post.new(uri)
58
+ req['Authorization'] = "Bearer #{credentials.access_token}"
59
+ req['Content-Type'] = 'application/json'
60
+
61
+ req
62
+ end
63
+
64
+ #
65
+ # @param event_name [String]
66
+ # @param event_metadata [Hash]
67
+ #
68
+ # @return [Hash]
69
+ #
70
+ private def data(event_name, event_metadata)
71
+ event = {}
72
+ event[:email] = attributes.user[:email]
73
+ event[:event_name] = event_name
74
+ event[:created_at] = Time.now.utc.to_i
75
+ event[:metadata] = event_metadata
76
+
77
+ event.to_json
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,14 @@
1
+ <script>
2
+ window.intercomSettings = {
3
+ app_id: "<%= credentials.app_id %>",
4
+ <% if attributes %>
5
+ <% attributes.user_browser.each do |k, v| %><%= k %>: <%= h v %>,<% end %>
6
+ company: {
7
+ <% attributes.company_browser.each do |k, v| %><%= k %>: <%= h v %>,<% end %>
8
+ <% attributes.custom.each do |k, v| %><%= k %>: <%= h v %>,<% end %>
9
+ },
10
+ <% end %>
11
+ };
12
+ </script>
13
+
14
+ <script>(function(){var w=window;var ic=w.Intercom;if(typeof ic==="function"){ic('reattach_activator');ic('update',intercomSettings);}else{var d=document;var i=function(){i.c(arguments)};i.q=[];i.c=function(args){i.q.push(args)};w.Intercom=i;function l(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/<%= credentials.app_id %>';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);}if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})()</script>
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'net/http'
5
+ require 'uri'
6
+ require 'lucid_intercom/attributes'
7
+ require 'lucid_intercom/credentials'
8
+ require 'lucid_intercom/errors'
9
+
10
+ module LucidIntercom
11
+ class UpdateUser
12
+ #
13
+ # @param shop_attributes [Hash] shop attributes in format returned by the Shopify API
14
+ # @param app_attributes [Hash] app-specific attributes (unprefixed)
15
+ # @param credentials [LucidIntercom::Credentials]
16
+ #
17
+ def initialize(shop_attributes, app_attributes, credentials = LucidIntercom.credentials)
18
+ @attributes = Attributes.new(shop_attributes, app_attributes, credentials)
19
+ @credentials = credentials
20
+ end
21
+
22
+ # @return [LucidIntercom::Attributes]
23
+ attr_reader :attributes
24
+ # @return [LucidIntercom::Credentials]
25
+ attr_reader :credentials
26
+
27
+ #
28
+ # Create or update user identified by attributes.
29
+ #
30
+ # @raise [LucidIntercom::RequestError] if the response status >= 400
31
+ #
32
+ def call
33
+ res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
34
+ http.request(req, data)
35
+ end
36
+
37
+ status = res.code.to_i
38
+
39
+ if status >= 400 # rubocop:disable Style/GuardClause
40
+ raise LucidIntercom::RequestError.new(status), 'invalid response code %s' % status
41
+ end
42
+ end
43
+
44
+ #
45
+ # @return [URI::HTTPS]
46
+ #
47
+ private def uri
48
+ URI('https://api.intercom.io/users')
49
+ end
50
+
51
+ #
52
+ # @return [Net::HTTP::Post]
53
+ #
54
+ private def req
55
+ req = Net::HTTP::Post.new(uri)
56
+ req['Authorization'] = "Bearer #{credentials.access_token}"
57
+ req['Accept'] = 'application/json'
58
+ req['Content-Type'] = 'application/json'
59
+
60
+ req
61
+ end
62
+
63
+ #
64
+ # @return [Hash]
65
+ #
66
+ private def data
67
+ user = attributes.user
68
+ user[:companies] = [attributes.company]
69
+ user[:companies][0]['custom_attributes'] = attributes.custom
70
+
71
+ user.to_json
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LucidIntercom
4
+ VERSION = '0.4.2'
5
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lucid_intercom
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.2
5
+ platform: ruby
6
+ authors:
7
+ - Kelsey Judson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-03-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubocop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.52.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.52.0
41
+ description:
42
+ email: kelsey@lucid.nz
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - README.md
48
+ - lib/lucid_intercom.rb
49
+ - lib/lucid_intercom/attributes.rb
50
+ - lib/lucid_intercom/attributes/base.rb
51
+ - lib/lucid_intercom/attributes/company.rb
52
+ - lib/lucid_intercom/attributes/custom.rb
53
+ - lib/lucid_intercom/attributes/user.rb
54
+ - lib/lucid_intercom/credentials.rb
55
+ - lib/lucid_intercom/errors.rb
56
+ - lib/lucid_intercom/errors/error.rb
57
+ - lib/lucid_intercom/errors/missing_credentials_error.rb
58
+ - lib/lucid_intercom/errors/request_error.rb
59
+ - lib/lucid_intercom/events.rb
60
+ - lib/lucid_intercom/events/base.rb
61
+ - lib/lucid_intercom/events/changed_plan.rb
62
+ - lib/lucid_intercom/events/installed.rb
63
+ - lib/lucid_intercom/events/uninstalled.rb
64
+ - lib/lucid_intercom/render_snippet.rb
65
+ - lib/lucid_intercom/send_event.rb
66
+ - lib/lucid_intercom/snippet.html.erb
67
+ - lib/lucid_intercom/update_user.rb
68
+ - lib/lucid_intercom/version.rb
69
+ homepage: https://github.com/lucidnz/gem-lucid_intercom
70
+ licenses:
71
+ - ISC
72
+ metadata: {}
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubyforge_project:
89
+ rubygems_version: 2.7.3
90
+ signing_key:
91
+ specification_version: 4
92
+ summary: Lucid integration for Intercom
93
+ test_files: []