intercom 3.9.5 → 4.1.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.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +406 -236
  3. data/Rakefile +1 -1
  4. data/changes.txt +32 -0
  5. data/lib/intercom/api_operations/archive.rb +2 -1
  6. data/lib/intercom/api_operations/delete.rb +16 -0
  7. data/lib/intercom/api_operations/find.rb +5 -2
  8. data/lib/intercom/api_operations/find_all.rb +4 -3
  9. data/lib/intercom/api_operations/list.rb +4 -1
  10. data/lib/intercom/api_operations/load.rb +4 -2
  11. data/lib/intercom/api_operations/nested_resource.rb +70 -0
  12. data/lib/intercom/api_operations/save.rb +6 -4
  13. data/lib/intercom/api_operations/scroll.rb +4 -5
  14. data/lib/intercom/api_operations/search.rb +3 -2
  15. data/lib/intercom/article.rb +7 -0
  16. data/lib/intercom/base_collection_proxy.rb +73 -0
  17. data/lib/intercom/client.rb +36 -25
  18. data/lib/intercom/client_collection_proxy.rb +17 -39
  19. data/lib/intercom/collection.rb +7 -0
  20. data/lib/intercom/company.rb +8 -0
  21. data/lib/intercom/contact.rb +22 -3
  22. data/lib/intercom/conversation.rb +5 -0
  23. data/lib/intercom/data_attribute.rb +7 -0
  24. data/lib/intercom/deprecated_leads_collection_proxy.rb +22 -0
  25. data/lib/intercom/deprecated_resources.rb +13 -0
  26. data/lib/intercom/errors.rb +3 -0
  27. data/lib/intercom/extended_api_operations/segments.rb +3 -1
  28. data/lib/intercom/extended_api_operations/tags.rb +3 -1
  29. data/lib/intercom/lead.rb +21 -0
  30. data/lib/intercom/lib/dynamic_accessors.rb +9 -10
  31. data/lib/intercom/lib/typed_json_deserializer.rb +42 -37
  32. data/lib/intercom/note.rb +4 -0
  33. data/lib/intercom/request.rb +37 -33
  34. data/lib/intercom/scroll_collection_proxy.rb +38 -42
  35. data/lib/intercom/search_collection_proxy.rb +30 -65
  36. data/lib/intercom/section.rb +23 -0
  37. data/lib/intercom/segment.rb +4 -0
  38. data/lib/intercom/service/article.rb +20 -0
  39. data/lib/intercom/service/base_service.rb +7 -0
  40. data/lib/intercom/service/collection.rb +24 -0
  41. data/lib/intercom/service/company.rb +2 -12
  42. data/lib/intercom/service/contact.rb +31 -10
  43. data/lib/intercom/service/conversation.rb +12 -3
  44. data/lib/intercom/service/data_attribute.rb +20 -0
  45. data/lib/intercom/service/lead.rb +41 -0
  46. data/lib/intercom/service/note.rb +4 -8
  47. data/lib/intercom/service/section.rb +7 -0
  48. data/lib/intercom/service/subscription.rb +2 -2
  49. data/lib/intercom/service/tag.rb +9 -9
  50. data/lib/intercom/service/visitor.rb +17 -8
  51. data/lib/intercom/tag.rb +4 -0
  52. data/lib/intercom/traits/api_resource.rb +44 -18
  53. data/lib/intercom/traits/dirty_tracking.rb +8 -1
  54. data/lib/intercom/user.rb +12 -3
  55. data/lib/intercom/utils.rb +13 -2
  56. data/lib/intercom/version.rb +1 -1
  57. data/lib/intercom/visitor.rb +0 -2
  58. data/lib/intercom.rb +33 -22
  59. data/spec/spec_helper.rb +843 -520
  60. data/spec/unit/intercom/admin_spec.rb +2 -2
  61. data/spec/unit/intercom/article_spec.rb +40 -0
  62. data/spec/unit/intercom/base_collection_proxy_spec.rb +47 -0
  63. data/spec/unit/intercom/client_collection_proxy_spec.rb +41 -41
  64. data/spec/unit/intercom/client_spec.rb +25 -26
  65. data/spec/unit/intercom/collection_spec.rb +32 -0
  66. data/spec/unit/intercom/company_spec.rb +18 -14
  67. data/spec/unit/intercom/contact_spec.rb +385 -33
  68. data/spec/unit/intercom/conversation_spec.rb +55 -7
  69. data/spec/unit/intercom/count_spec.rb +4 -4
  70. data/spec/unit/intercom/data_attribute_spec.rb +40 -0
  71. data/spec/unit/intercom/deprecated_leads_collection_proxy_spec.rb +17 -0
  72. data/spec/unit/intercom/event_spec.rb +9 -11
  73. data/spec/unit/intercom/job_spec.rb +24 -24
  74. data/spec/unit/intercom/lead_spec.rb +57 -0
  75. data/spec/unit/intercom/lib/flat_store_spec.rb +22 -20
  76. data/spec/unit/intercom/message_spec.rb +1 -1
  77. data/spec/unit/intercom/note_spec.rb +4 -10
  78. data/spec/unit/intercom/request_spec.rb +1 -1
  79. data/spec/unit/intercom/scroll_collection_proxy_spec.rb +40 -39
  80. data/spec/unit/intercom/search_collection_proxy_spec.rb +32 -28
  81. data/spec/unit/intercom/section_spec.rb +32 -0
  82. data/spec/unit/intercom/segment_spec.rb +2 -2
  83. data/spec/unit/intercom/subscription_spec.rb +5 -6
  84. data/spec/unit/intercom/tag_spec.rb +22 -14
  85. data/spec/unit/intercom/team_spec.rb +2 -2
  86. data/spec/unit/intercom/traits/api_resource_spec.rb +107 -52
  87. data/spec/unit/intercom/user_spec.rb +224 -226
  88. data/spec/unit/intercom/visitor_spec.rb +49 -0
  89. data/spec/unit/intercom_spec.rb +5 -3
  90. metadata +34 -8
  91. data/lib/intercom/customer.rb +0 -10
  92. data/lib/intercom/service/customer.rb +0 -14
  93. data/spec/unit/intercom/visitors_spec.rb +0 -61
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'intercom/lib/flat_store'
2
4
  require 'intercom/lib/dynamic_accessors'
3
5
  require 'intercom/lib/dynamic_accessors_on_method_missing'
@@ -6,16 +8,19 @@ require 'intercom/lib/typed_json_deserializer'
6
8
 
7
9
  module Intercom
8
10
  module Traits
9
-
10
11
  module ApiResource
11
12
  include DirtyTracking
12
13
 
13
- attr_accessor :id
14
+ attr_accessor :id, :client
14
15
 
15
16
  def initialize(attributes = {})
16
17
  from_hash(attributes)
17
18
  end
18
19
 
20
+ def ==(other)
21
+ self.class == other.class && to_json == other.to_json
22
+ end
23
+
19
24
  def from_response(response)
20
25
  from_hash(response)
21
26
  reset_changed_fields!
@@ -31,49 +36,71 @@ module Intercom
31
36
  end
32
37
 
33
38
  def to_hash
34
- instance_variables_excluding_dirty_tracking_field.inject({}) do |hash, variable|
35
- hash[variable.to_s.delete("@")] = instance_variable_get(variable)
36
- hash
39
+ instance_variables_excluding_dirty_tracking_field.each_with_object({}) do |variable, hash|
40
+ hash[variable.to_s.delete('@')] = instance_variable_get(variable)
41
+ end
42
+ end
43
+
44
+ def to_json(*args)
45
+ instance_variables_excluding_dirty_tracking_field.each_with_object({}) do |variable, hash|
46
+ next if variable == :@client
47
+
48
+ value = instance_variable_get(variable)
49
+ hash[variable.to_s.delete('@')] = value.respond_to?(:to_json) ? value.to_json(*args) : value
37
50
  end
38
51
  end
39
52
 
40
53
  def to_submittable_hash
41
54
  submittable_hash = {}
42
55
  to_hash.each do |attribute, value|
43
- submittable_hash[attribute] = value if submittable_attribute?(attribute, value)
56
+ next unless submittable_attribute?(attribute, value)
57
+
58
+ submittable_hash[attribute] = value.respond_to?(:to_submittable_hash) ? value.to_submittable_hash : value
44
59
  end
45
60
  submittable_hash
46
61
  end
47
62
 
48
63
  def method_missing(method_sym, *arguments, &block)
49
- Lib::DynamicAccessorsOnMethodMissing.new(method_sym, *arguments, self).
50
- define_accessors_or_call { super }
64
+ Lib::DynamicAccessorsOnMethodMissing.new(method_sym, *arguments, self)
65
+ .define_accessors_or_call { super }
51
66
  end
52
67
 
53
68
  def flat_store_attribute?(attribute)
54
- (respond_to?(:flat_store_attributes)) && (flat_store_attributes.map(&:to_s).include?(attribute.to_s))
69
+ respond_to?(:flat_store_attributes) && flat_store_attributes.map(&:to_s).include?(attribute.to_s)
55
70
  end
56
71
 
57
72
  private
58
73
 
59
74
  def initialize_property(attribute, value)
75
+ return if addressable_list?(attribute, value)
76
+
60
77
  Lib::DynamicAccessors.define_accessors(attribute, value, self) unless accessors_already_defined?(attribute)
61
78
  set_property(attribute, value)
62
79
  end
63
80
 
81
+ def addressable_list?(attribute, value)
82
+ return false unless typed_property?(attribute, value)
83
+
84
+ value['type'] == 'list' && value['url']
85
+ end
86
+
64
87
  def accessors_already_defined?(attribute)
65
88
  respond_to?(attribute) && respond_to?("#{attribute}=")
66
89
  end
67
90
 
68
91
  def set_property(attribute, value)
92
+ value_to_set = parsed_value_for_attribute(attribute, value)
93
+ call_setter_for_attribute(attribute, value_to_set)
94
+ end
95
+
96
+ def parsed_value_for_attribute(attribute, value)
69
97
  if typed_property?(attribute, value)
70
- value_to_set = Intercom::Lib::TypedJsonDeserializer.new(value).deserialize
98
+ Intercom::Lib::TypedJsonDeserializer.new(value, client).deserialize
71
99
  elsif flat_store_attribute?(attribute)
72
- value_to_set = Intercom::Lib::FlatStore.new(value)
100
+ Intercom::Lib::FlatStore.new(value)
73
101
  else
74
- value_to_set = value
102
+ value
75
103
  end
76
- call_setter_for_attribute(attribute, value_to_set)
77
104
  end
78
105
 
79
106
  def custom_attribute_field?(attribute)
@@ -97,12 +124,12 @@ module Intercom
97
124
  end
98
125
 
99
126
  def typed_value?(value)
100
- value.is_a? Hash and !!value['type']
127
+ value.is_a?(Hash) && !!value['type']
101
128
  end
102
129
 
103
130
  def call_setter_for_attribute(attribute, value)
104
- setter_method = "#{attribute.to_s}="
105
- self.send(setter_method, value)
131
+ setter_method = "#{attribute}="
132
+ send(setter_method, value)
106
133
  end
107
134
 
108
135
  def initialize_missing_flat_store_attributes
@@ -120,7 +147,7 @@ module Intercom
120
147
 
121
148
  module ClassMethods
122
149
  def from_api(api_response)
123
- object = self.new
150
+ object = new
124
151
  object.from_response(api_response)
125
152
  object
126
153
  end
@@ -129,7 +156,6 @@ module Intercom
129
156
  def self.included(base)
130
157
  base.extend(ClassMethods)
131
158
  end
132
-
133
159
  end
134
160
  end
135
161
  end
@@ -22,7 +22,14 @@ module Intercom
22
22
 
23
23
  def field_changed?(field_name)
24
24
  @changed_fields ||= Set.new
25
- @changed_fields.include?(field_name.to_s)
25
+ field = instance_variable_get("@#{field_name}")
26
+ if field.respond_to?(:field_changed?)
27
+ field.to_hash.any? do |attribute, _|
28
+ field.field_changed?(attribute)
29
+ end
30
+ else
31
+ @changed_fields.include?(field_name.to_s)
32
+ end
26
33
  end
27
34
 
28
35
  def instance_variables_excluding_dirty_tracking_field
data/lib/intercom/user.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'intercom/traits/incrementable_attributes'
2
4
  require 'intercom/traits/api_resource'
3
5
 
@@ -6,9 +8,16 @@ module Intercom
6
8
  include Traits::IncrementableAttributes
7
9
  include Traits::ApiResource
8
10
 
9
- def identity_vars ; [:id, :email, :user_id] ; end
10
- def flat_store_attributes ; [:custom_attributes] ; end
11
- def update_verb ; 'post' ; end
11
+ def identity_vars
12
+ %i[id email user_id]
13
+ end
14
+
15
+ def flat_store_attributes
16
+ [:custom_attributes]
17
+ end
12
18
 
19
+ def update_verb
20
+ 'post'
21
+ end
13
22
  end
14
23
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Intercom
2
4
  module Utils
3
5
  class << self
@@ -7,6 +9,7 @@ module Intercom
7
9
 
8
10
  def pluralize(str)
9
11
  return str.gsub(/y$/, 'ies') if str =~ /y$/
12
+
10
13
  "#{str}s"
11
14
  end
12
15
 
@@ -23,7 +26,13 @@ module Intercom
23
26
  end
24
27
 
25
28
  def resource_class_to_singular_name(resource_class)
26
- resource_class.to_s.split('::')[-1].downcase
29
+ resource_name = resource_class.to_s.split('::')[-1]
30
+ resource_name = maybe_underscore_name(resource_name)
31
+ resource_name.downcase
32
+ end
33
+
34
+ def maybe_underscore_name(resource_name)
35
+ resource_name.gsub!(/(.)([A-Z])/, '\1_\2') || resource_name
27
36
  end
28
37
 
29
38
  def resource_class_to_collection_name(resource_class)
@@ -52,9 +61,11 @@ module Intercom
52
61
  end
53
62
 
54
63
  def entity_key_from_type(type)
64
+ return 'data' if type == 'list'
65
+
55
66
  is_list = type.split('.')[1] == 'list'
56
67
  entity_name = type.split('.')[0]
57
- is_list ? Utils.pluralize(entity_name) : entity_name
68
+ is_list ? Utils.pluralize(entity_name) : entity_name
58
69
  end
59
70
  end
60
71
  end
@@ -1,3 +1,3 @@
1
1
  module Intercom #:nodoc:
2
- VERSION = "3.9.5"
2
+ VERSION = "4.1.3"
3
3
  end
@@ -8,7 +8,5 @@ module Intercom
8
8
 
9
9
  def identity_vars ; [:id, :email, :user_id] ; end
10
10
  def flat_store_attributes ; [:custom_attributes] ; end
11
- def update_verb ; 'put' ; end
12
-
13
11
  end
14
12
  end
data/lib/intercom.rb CHANGED
@@ -1,41 +1,52 @@
1
- require "intercom/version"
1
+ # frozen_string_literal: true
2
+
3
+ require 'intercom/version'
2
4
  require 'intercom/service/admin'
5
+ require 'intercom/service/article'
6
+ require 'intercom/service/collection'
3
7
  require 'intercom/service/company'
4
8
  require 'intercom/service/contact'
5
9
  require 'intercom/service/conversation'
6
10
  require 'intercom/service/count'
7
- require 'intercom/service/customer'
8
11
  require 'intercom/service/event'
9
12
  require 'intercom/service/message'
10
13
  require 'intercom/service/note'
11
14
  require 'intercom/service/job'
12
15
  require 'intercom/service/subscription'
13
16
  require 'intercom/service/segment'
17
+ require 'intercom/service/section'
14
18
  require 'intercom/service/tag'
15
19
  require 'intercom/service/team'
16
- require 'intercom/service/user'
17
20
  require 'intercom/service/visitor'
21
+ require 'intercom/service/user'
22
+ require 'intercom/service/lead'
23
+ require 'intercom/deprecated_resources.rb'
18
24
  require 'intercom/options'
19
25
  require 'intercom/client'
20
- require "intercom/contact"
21
- require "intercom/count"
22
- require "intercom/customer"
23
- require "intercom/user"
24
- require "intercom/company"
25
- require "intercom/note"
26
- require "intercom/job"
27
- require "intercom/tag"
28
- require "intercom/segment"
29
- require "intercom/event"
30
- require "intercom/conversation"
31
- require "intercom/message"
32
- require "intercom/admin"
33
- require "intercom/request"
34
- require "intercom/subscription"
35
- require "intercom/team"
36
- require "intercom/errors"
37
- require "intercom/visitor"
38
- require "json"
26
+ require 'intercom/contact'
27
+ require 'intercom/user'
28
+ require 'intercom/lead'
29
+ require 'intercom/count'
30
+ require 'intercom/collection'
31
+ require 'intercom/company'
32
+ require 'intercom/service/data_attribute'
33
+ require 'intercom/note'
34
+ require 'intercom/job'
35
+ require 'intercom/tag'
36
+ require 'intercom/segment'
37
+ require 'intercom/section'
38
+ require 'intercom/event'
39
+ require 'intercom/conversation'
40
+ require 'intercom/message'
41
+ require 'intercom/admin'
42
+ require 'intercom/article'
43
+ require 'intercom/request'
44
+ require 'intercom/subscription'
45
+ require 'intercom/team'
46
+ require 'intercom/errors'
47
+ require 'intercom/visitor'
48
+ require 'intercom/data_attribute'
49
+ require 'json'
39
50
 
40
51
  ##
41
52
  # Intercom is a customer relationship management and messaging tool for web app owners