delighted 1.7.0.rc2 → 1.7.0

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: 6e251f1796dba9ffe7b7afcd1ce2ac727d0946ed
4
- data.tar.gz: 37c3ff30f9438afba34538fcd2d4887683df35bb
3
+ metadata.gz: 24e928b7535e1d51f72461238850e824b27b3920
4
+ data.tar.gz: 86001bae9ecc475902d0ce5f2d4ed1cc15d6f686
5
5
  SHA512:
6
- metadata.gz: 6097df943896ec66656aa159d0ab3e8470d2d0cc96535abadf113c343f79409e8930e6ef4d5251324dc30afb2957ad58f0cdd643e1edacb8e8b50ddd232441b4
7
- data.tar.gz: 4d59aceba9c83852a568e1edc47e28078b330efa4d95f3a506a412ef6b75794722aacb5169e641d339f62d6a6f99fcdf6dbb0cc589b8fdd5a8be23247100b0e2
6
+ metadata.gz: 1c62db83772abc00c2a6c1524c8a18f998b953ca227d8f521eaf2a3cb10e7457b078eac3d8d8473668e83c646e8f515a32700435fbc7a59edf715585f87e4eb7
7
+ data.tar.gz: 0cfa475365360aa17f5e7b81c215e07607eed6d10f867ba5269ef840c62aa88ca032944d613d11d7159b224593cbf0e2b67282aa1da5acdcad9621a7a99904fe
@@ -9,5 +9,4 @@ rvm:
9
9
  - 1.8.7
10
10
  - jruby-18mode
11
11
  - jruby-19mode
12
- - rbx-2
13
12
  - ree
@@ -1,4 +1,4 @@
1
- ## 1.7.0.rc2 (2017-10-03)
1
+ ## 1.7.0 (2017-10-18)
2
2
 
3
3
  Features:
4
4
 
@@ -54,6 +54,6 @@ Features:
54
54
 
55
55
  Features:
56
56
 
57
- - Add support for cancelling pending survey requests
57
+ - Add support for canceling pending survey requests
58
58
 
59
59
  ## 1.0.0 (2013-12-13)
data/README.md CHANGED
@@ -153,6 +153,20 @@ metrics = Delighted::Metrics.retrieve(:since => Time.utc(2013, 10, 01),
153
153
  :until => Time.utc(2013, 11, 01))
154
154
  ```
155
155
 
156
+ ## Rate limits
157
+
158
+ If a request is rate limited, a `Delighted::RateLimitedError` exception is raised. You can rescue that exception to implement exponential backoff or retry strategies. The exception provides a `#retry_after` method to tell you how many seconds you should wait before retrying. For example:
159
+
160
+ ```ruby
161
+ begin
162
+ metrics = Delighted::Metrics.retrieve
163
+ rescue Delighted::RateLimitedError => e
164
+ retry_after_seconds = e.retry_after
165
+ # wait for retry_after_seconds before retrying
166
+ # add your retry strategy here ...
167
+ end
168
+ ```
169
+
156
170
  ## <a name="advanced-configuration"></a> Advanced configuration & testing
157
171
 
158
172
  The following options are configurable for the client:
@@ -183,7 +197,6 @@ metrics_from_custom_shared_client = Delighted::Metrics.retrieve
183
197
 
184
198
  - Ruby MRI (1.8.7+)
185
199
  - JRuby (1.8 + 1.9 modes)
186
- - RBX (2.1.1)
187
200
  - REE (1.8.7-2012.02)
188
201
 
189
202
  ## Contributing
@@ -1,3 +1,3 @@
1
1
  module Delighted
2
- VERSION = "1.7.0.rc2"
2
+ VERSION = "1.7.0"
3
3
  end
@@ -86,7 +86,10 @@ class Delighted::SurveyResponseTest < Delighted::TestCase
86
86
  def test_creating_a_survey_response
87
87
  uri = URI.parse("https://api.delightedapp.com/v1/survey_responses")
88
88
  headers = { 'Authorization' => @auth_header, "Accept" => "application/json", 'Content-Type' => 'application/json', 'User-Agent' => "Delighted RubyGem #{Delighted::VERSION}" }
89
- data = Delighted::JSON.dump({ :person => '123', :score => 10 })
89
+ data = OrderedHash.new
90
+ data[:person] = '123'
91
+ data[:score] = 10
92
+ data = Delighted::JSON.dump(data)
90
93
  response = Delighted::HTTPResponse.new(200, {}, Delighted::JSON.dump({ :id => '456', :person => '123', :score => 10 }))
91
94
  mock_http_adapter.expects(:request).with(:post, uri, headers, data).once.returns(response)
92
95
 
@@ -131,7 +134,10 @@ class Delighted::SurveyResponseTest < Delighted::TestCase
131
134
  def test_updating_a_survey_response
132
135
  uri = URI.parse("https://api.delightedapp.com/v1/survey_responses/456")
133
136
  headers = { 'Authorization' => @auth_header, "Accept" => "application/json", 'Content-Type' => 'application/json', 'User-Agent' => "Delighted RubyGem #{Delighted::VERSION}" }
134
- data = Delighted::JSON.dump({ :person => '123', :score => 10 })
137
+ data = OrderedHash.new
138
+ data[:person] = '123'
139
+ data[:score] = 10
140
+ data = Delighted::JSON.dump(data)
135
141
  response = Delighted::HTTPResponse.new(200, {}, Delighted::JSON.dump({ :id => '456', :person => '123', :score => 10 }))
136
142
  mock_http_adapter.expects(:request).with(:put, uri, headers, data).once.returns(response)
137
143
 
@@ -0,0 +1,192 @@
1
+ # From https://raw.githubusercontent.com/rails/rails/3-0-stable/activesupport/lib/active_support/ordered_hash.rb
2
+
3
+ begin
4
+ require 'psych'
5
+ rescue LoadError
6
+ end
7
+
8
+ require 'yaml'
9
+
10
+ YAML.add_builtin_type("omap") do |type, val|
11
+ OrderedHash[val.map(&:to_a).map(&:first)]
12
+ end
13
+
14
+ # OrderedHash is namespaced to prevent conflicts with other implementations
15
+ class OrderedHash < ::Hash #:nodoc:
16
+ def to_yaml_type
17
+ "!tag:yaml.org,2002:omap"
18
+ end
19
+
20
+ def encode_with(coder)
21
+ coder.represent_seq '!omap', map { |k,v| { k => v } }
22
+ end
23
+
24
+ def to_yaml(opts = {})
25
+ if YAML.const_defined?(:ENGINE) && !YAML::ENGINE.syck?
26
+ return super
27
+ end
28
+
29
+ YAML.quick_emit(self, opts) do |out|
30
+ out.seq(taguri) do |seq|
31
+ each do |k, v|
32
+ seq.add(k => v)
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ # Hash is ordered in Ruby 1.9!
39
+ if RUBY_VERSION < '1.9'
40
+
41
+ # In MRI the Hash class is core and written in C. In particular, methods are
42
+ # programmed with explicit C function calls and polymorphism is not honored.
43
+ #
44
+ # For example, []= is crucial in this implementation to maintain the @keys
45
+ # array but hash.c invokes rb_hash_aset() originally. This prevents method
46
+ # reuse through inheritance and forces us to reimplement stuff.
47
+ #
48
+ # For instance, we cannot use the inherited #merge! because albeit the algorithm
49
+ # itself would work, our []= is not being called at all by the C code.
50
+
51
+ def initialize(*args, &block)
52
+ super
53
+ @keys = []
54
+ end
55
+
56
+ def self.[](*args)
57
+ ordered_hash = new
58
+
59
+ if (args.length == 1 && args.first.is_a?(Array))
60
+ args.first.each do |key_value_pair|
61
+ next unless (key_value_pair.is_a?(Array))
62
+ ordered_hash[key_value_pair[0]] = key_value_pair[1]
63
+ end
64
+
65
+ return ordered_hash
66
+ end
67
+
68
+ unless (args.size % 2 == 0)
69
+ raise ArgumentError.new("odd number of arguments for Hash")
70
+ end
71
+
72
+ args.each_with_index do |val, ind|
73
+ next if (ind % 2 != 0)
74
+ ordered_hash[val] = args[ind + 1]
75
+ end
76
+
77
+ ordered_hash
78
+ end
79
+
80
+ def initialize_copy(other)
81
+ super
82
+ # make a deep copy of keys
83
+ @keys = other.keys
84
+ end
85
+
86
+ def []=(key, value)
87
+ @keys << key if !has_key?(key)
88
+ super
89
+ end
90
+
91
+ def delete(key)
92
+ if has_key? key
93
+ index = @keys.index(key)
94
+ @keys.delete_at index
95
+ end
96
+ super
97
+ end
98
+
99
+ def delete_if
100
+ super
101
+ sync_keys!
102
+ self
103
+ end
104
+
105
+ def reject!
106
+ super
107
+ sync_keys!
108
+ self
109
+ end
110
+
111
+ def reject(&block)
112
+ dup.reject!(&block)
113
+ end
114
+
115
+ def keys
116
+ @keys.dup
117
+ end
118
+
119
+ def values
120
+ @keys.collect { |key| self[key] }
121
+ end
122
+
123
+ def to_hash
124
+ self
125
+ end
126
+
127
+ def to_a
128
+ @keys.map { |key| [ key, self[key] ] }
129
+ end
130
+
131
+ def each_key
132
+ @keys.each { |key| yield key }
133
+ end
134
+
135
+ def each_value
136
+ @keys.each { |key| yield self[key]}
137
+ end
138
+
139
+ def each
140
+ @keys.each {|key| yield [key, self[key]]}
141
+ end
142
+
143
+ alias_method :each_pair, :each
144
+
145
+ def clear
146
+ super
147
+ @keys.clear
148
+ self
149
+ end
150
+
151
+ def shift
152
+ k = @keys.first
153
+ v = delete(k)
154
+ [k, v]
155
+ end
156
+
157
+ def merge!(other_hash)
158
+ if block_given?
159
+ other_hash.each { |k, v| self[k] = key?(k) ? yield(k, self[k], v) : v }
160
+ else
161
+ other_hash.each { |k, v| self[k] = v }
162
+ end
163
+ self
164
+ end
165
+
166
+ alias_method :update, :merge!
167
+
168
+ def merge(other_hash, &block)
169
+ dup.merge!(other_hash, &block)
170
+ end
171
+
172
+ # When replacing with another hash, the initial order of our keys must come from the other hash -ordered or not.
173
+ def replace(other)
174
+ super
175
+ @keys = other.keys
176
+ self
177
+ end
178
+
179
+ def invert
180
+ OrderedHash[self.to_a.map!{|key_value_pair| key_value_pair.reverse}]
181
+ end
182
+
183
+ def inspect
184
+ "#<OrderedHash #{super}>"
185
+ end
186
+
187
+ private
188
+ def sync_keys!
189
+ @keys.delete_if {|k| !has_key?(k)}
190
+ end
191
+ end
192
+ end
@@ -1,6 +1,7 @@
1
1
  require 'delighted'
2
2
  require 'minitest/autorun'
3
3
  require 'mocha/setup'
4
+ require 'support/ordered_hash'
4
5
 
5
6
  class Delighted::TestCase < Minitest::Test
6
7
  include Mocha
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: delighted
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0.rc2
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Dodwell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-03 00:00:00.000000000 Z
11
+ date: 2017-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json
@@ -102,6 +102,7 @@ files:
102
102
  - lib/delighted/utils.rb
103
103
  - lib/delighted/version.rb
104
104
  - test/delighted_test.rb
105
+ - test/support/ordered_hash.rb
105
106
  - test/test_helper.rb
106
107
  homepage: https://github.com/delighted/delighted-ruby
107
108
  licenses:
@@ -118,9 +119,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
118
119
  version: '0'
119
120
  required_rubygems_version: !ruby/object:Gem::Requirement
120
121
  requirements:
121
- - - ">"
122
+ - - ">="
122
123
  - !ruby/object:Gem::Version
123
- version: 1.3.1
124
+ version: '0'
124
125
  requirements: []
125
126
  rubyforge_project:
126
127
  rubygems_version: 2.6.13
@@ -130,4 +131,5 @@ summary: Delighted is the fastest and easiest way to gather actionable feedback
130
131
  your customers.
131
132
  test_files:
132
133
  - test/delighted_test.rb
134
+ - test/support/ordered_hash.rb
133
135
  - test/test_helper.rb