thinkingdata-ruby 1.0.0 → 1.1.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: 8675f2f2b9e9e65ef523eb61d868ab087a048105
4
- data.tar.gz: a469f38692b16bcff8d1564b954a8691b3161cbf
3
+ metadata.gz: af3bee9acd623d7588b142a62e6ecef998c359c5
4
+ data.tar.gz: d9f7170bfc7dc600a58fcafbbfba45f92049f6d0
5
5
  SHA512:
6
- metadata.gz: 48b4d1a412fe55788a7be4a5bbb357ff6613669126ce03799b4a999bb647135266b363aef32ed002163bbb551b82b675199b10e3f6ceeceb8b0abdc61276f6c4
7
- data.tar.gz: 407c50cf1a0e731ca71b3c786d645cf389c16fa5bc82a13e9e708c5b718eab3edbf1a949aa229300580d4ec5e7acf0f80436660cfbd955d35a5b89e8726e784c
6
+ metadata.gz: 6adee954d6aee35f30ed2a97074ce00500a71b4c02f3b4c1dded0ca44bcfc0e1636a0a564b49b4640114eae5d5a34c978630a8247d59bc6d0547f47deacd2ba6
7
+ data.tar.gz: d9052f017aae1f57252b7a15abd921f4e23d026c6010bba6d868b39f638a63f782a6a47c1f2faaa46352da11372aae62769601c65e53cde3895ec8d12cbd3be6
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ **v1.1.0** (2020/02/11)
2
+ - 数据类型支持array类型
3
+ - 新增 user_append 接口,支持用户的数组类型的属性追加
4
+ - BatchConsumer 性能优化:支持选择是否压缩;移除 Base64 编码
5
+ - DebugConsumer 优化: 在服务端对数据进行更完备准确地校验
6
+
1
7
  **v1.0.0** (2019-11-20)
2
8
  - 支持三种模式的上报: DebugConsumer, BatchConsumer, LoggerConsumer.
3
9
  - 支持事件上报和用户属性上报.
data/demo/demo.rb CHANGED
@@ -6,10 +6,9 @@ require 'time'
6
6
 
7
7
  if __FILE__ == $0
8
8
  # 替换 DEMO_APPID 为您项目的 APP ID
9
- DEMO_APPID = 'b2a61feb9e56472c90c5bcb320dfb4ef'
9
+ DEMO_APPID = 'APPID'
10
10
  # 替换 SERVER_URL 为您项目的 URL
11
11
  SERVER_URL = 'https://sdk.tga.thinkinggame.cn'
12
-
13
12
  # 账号 ID
14
13
  DEMO_ACCOUNT_ID = 'ruby_demo_aid'
15
14
  # 访客 ID
@@ -18,24 +17,29 @@ if __FILE__ == $0
18
17
  # (可选) 定义一个错误处理器,当出现 Error 时会调用
19
18
  class MyErrorHandler < TDAnalytics::ErrorHandler
20
19
  def handle(error)
21
- puts error
22
- raise error
20
+ puts error
21
+ raise error
23
22
  end
24
23
  end
25
24
  my_error_handler = MyErrorHandler.new
26
25
 
27
26
  # 定义 consumer: consumer 实现了 add、flush、close 等接口,将经过 SDK 格式化的数据以不同的方式存储或者发送到接收端
28
27
  consumer = nil
29
- case ARGV[0]
30
- when '0'
28
+ $ARGV = 1
29
+ case $ARGV
30
+ when 0
31
31
  # LoggerConsumer,数据将写入本地文件(当前目录,按小时切分,前缀为 demolog),需要配合 Logbus 上传数据到 TA 服务器
32
32
  consumer = TDAnalytics::LoggerConsumer.new '.', 'hourly', prefix: 'demolog'
33
- when '1'
33
+ when 1
34
34
  # DebugConsumer,数据将被逐条同步的上报到 TA 服务器。出错时会返回详细的错误信息
35
35
  consumer = TDAnalytics::DebugConsumer.new(SERVER_URL, DEMO_APPID)
36
- when '2'
36
+ # 如果不想上传到TA,只想校验数据格式,可以如下初始化
37
+ # consumer = TDAnalytics::DebugConsumer.new(SERVER_URL, DEMO_APPID,false)
38
+ when 2
37
39
  # BatchConsumer,数据将先存入缓冲区,达到指定条数时上报,默认为 20 条
38
- consumer = TDAnalytics::BatchConsumer.new(SERVER_URL, DEMO_APPID, 3)
40
+ consumer = TDAnalytics::BatchConsumer.new(SERVER_URL, DEMO_APPID, 30)
41
+ #设置是否压缩数据,默认gzip压缩,内网可以这样设置
42
+ #consumer._set_compress(false)
39
43
  else
40
44
  # LoggerConsumer,数据将写入本地文件(当前目录,按天切分,前缀为 tda.log),需要配合 Logbus 上传数据到 TA 服务器
41
45
  consumer = TDAnalytics::LoggerConsumer.new
@@ -46,10 +50,10 @@ if __FILE__ == $0
46
50
 
47
51
  # 定义公共属性
48
52
  super_properties = {
49
- super_string: 'super_string',
50
- super_int: 1,
51
- super_bool: false,
52
- super_date: Time.rfc2822("Thu, 26 Oct 2019 02:26:12 +0545")
53
+ super_string: 'super_string',
54
+ super_int: 1,
55
+ super_bool: false,
56
+ super_date: Time.rfc2822("Thu, 26 Oct 2019 02:26:12 +0545")
53
57
  }
54
58
 
55
59
  # 设置公共事件属性,公共事件属性会添加到每个事件中
@@ -57,23 +61,24 @@ if __FILE__ == $0
57
61
 
58
62
  # 定义事件数据
59
63
  event = {
60
- # 事件名称 (必填)
61
- event_name: 'test_event',
62
- # 账号 ID (可选)
63
- account_id: DEMO_ACCOUNT_ID,
64
- # 访客 ID (可选),账号 ID 和访客 ID 不可以都为空
65
- distinct_id: DEMO_DISTINCT_ID,
66
- # 事件时间 (可选) 如果不填,将以调用接口时的时间作为事件时间
67
- time: Time.now,
68
- # 事件 IP (可选) 当传入 IP 地址时,后台可以解析所在地
69
- ip: '202.38.64.1',
70
- # 事件属性 (可选)
71
- properties: {
72
- prop_date: Time.now,
73
- prop_double: 134.1,
74
- prop_string: 'hello world',
75
- prop_bool: true,
76
- },
64
+ # 事件名称 (必填)
65
+ event_name: 'test_event',
66
+ # 账号 ID (可选)
67
+ account_id: DEMO_ACCOUNT_ID,
68
+ # 访客 ID (可选),账号 ID 和访客 ID 不可以都为空
69
+ distinct_id: DEMO_DISTINCT_ID,
70
+ # 事件时间 (可选) 如果不填,将以调用接口时的时间作为事件时间
71
+ time: Time.now,
72
+ # 事件 IP (可选) 当传入 IP 地址时,后台可以解析所在地
73
+ ip: '202.38.64.1',
74
+ # 事件属性 (可选)
75
+ properties: {
76
+ array: ["str1", "11", "22.22", "2020-02-11 17:02:52.415"],
77
+ prop_date: Time.now,
78
+ prop_double: 134.1,
79
+ prop_string: 'hello world',
80
+ prop_bool: true,
81
+ },
77
82
  }
78
83
 
79
84
  # 上报事件
@@ -84,31 +89,48 @@ if __FILE__ == $0
84
89
 
85
90
  # 定义用户属性数据
86
91
  user_data = {
87
- # 账号 ID (可选)
88
- account_id: DEMO_ACCOUNT_ID,
89
- # 访客 ID (可选),账号 ID 和访客 ID 不可以都为空
90
- distinct_id: DEMO_DISTINCT_ID,
91
- # 用户属性
92
- properties: {
93
- prop_date: Time.now,
94
- prop_double: 134.12,
95
- prop_string: 'hello',
96
- prop_int: 666,
97
- },
92
+ # 账号 ID (可选)
93
+ account_id: DEMO_ACCOUNT_ID,
94
+ # 访客 ID (可选),账号 ID 和访客 ID 不可以都为空
95
+ distinct_id: DEMO_DISTINCT_ID,
96
+ # 用户属性
97
+ properties: {
98
+ array: ["str1", 11, 22.22],
99
+ prop_date: Time.now,
100
+ prop_double: 134.12,
101
+ prop_string: 'hello',
102
+ prop_int: 666,
103
+ },
98
104
  }
99
105
  # 设置用户属性, 覆盖同名属性
100
106
  ta.user_set(user_data)
101
107
 
108
+ #追加user的一个或者多个列表的属性
109
+ user_data_arr = {
110
+ # 账号 ID (可选)
111
+ account_id: DEMO_ACCOUNT_ID,
112
+ # 访客 ID (可选),账号 ID 和访客 ID 不可以都为空
113
+ distinct_id: DEMO_DISTINCT_ID,
114
+ # 用户属性
115
+ properties: {
116
+ array: ["33", "44"],
117
+ },
118
+ }
119
+
120
+ ta.user_append(user_data_arr)
121
+
102
122
  # 设置用户属性,不会覆盖已经设置的同名属性
103
123
  user_data[:properties][:prop_int_new] = 800
104
124
  ta.user_set_once(user_data)
105
125
 
106
- # 删除某个用户属性
107
- # ta.user_unset(distinct_id: DEMO_DISTINCT_ID, property: :prop_string)
108
-
109
126
  # 累加用户属性
110
127
  ta.user_add(distinct_id: DEMO_DISTINCT_ID, properties: {prop_int: 10, prop_double: 15.88})
111
128
 
129
+
130
+ # 删除某个用户属性
131
+ ta.user_unset(distinct_id: DEMO_DISTINCT_ID, property: [:prop_string, :prop_int])
132
+
133
+
112
134
  # 删除用户。此操作之前的事件数据不会被删除
113
135
  # ta.user_del(distinct_id: DEMO_DISTINCT_ID)
114
136
 
@@ -1,4 +1,3 @@
1
- require 'base64'
2
1
  require 'json'
3
2
  require 'net/http'
4
3
 
@@ -9,14 +8,19 @@ module TDAnalytics
9
8
  # 默认缓冲区大小
10
9
  MAX_LENGTH = 20
11
10
 
12
- def initialize(server_url, app_id, max_buffer_length=MAX_LENGTH)
11
+ def initialize(server_url, app_id, max_buffer_length = MAX_LENGTH)
13
12
  @server_uri = URI.parse(server_url)
14
- @server_uri.path = '/logagent'
13
+ @server_uri.path = '/sync_server'
15
14
  @app_id = app_id
15
+ @compress = true
16
16
  @max_length = [max_buffer_length, MAX_LENGTH].min
17
17
  @buffers = []
18
18
  end
19
19
 
20
+ def _set_compress(compress)
21
+ @compress = compress
22
+ end
23
+
20
24
  def add(message)
21
25
  @buffers << message
22
26
  flush if @buffers.length >= @max_length
@@ -29,13 +33,17 @@ module TDAnalytics
29
33
  def flush
30
34
  begin
31
35
  @buffers.each_slice(@max_length) do |chunk|
32
- wio = StringIO.new("w")
33
- gzip_io = Zlib::GzipWriter.new(wio)
34
- gzip_io.write(chunk.to_json)
35
- gzip_io.close
36
- data = Base64.encode64(wio.string).gsub("\n", '')
37
-
38
- headers = {'Content-Type' => 'application/plaintext', 'appid' => @app_id}
36
+ if @compress
37
+ wio = StringIO.new("w")
38
+ gzip_io = Zlib::GzipWriter.new(wio)
39
+ gzip_io.write(chunk.to_json)
40
+ gzip_io.close
41
+ data = wio.string
42
+ else
43
+ data = chunk.to_json
44
+ end
45
+ compress_type = @compress ? 'gzip' : 'none'
46
+ headers = {'Content-Type' => 'application/plaintext', 'appid' => @app_id, 'compress' => compress_type}
39
47
  request = CaseSensitivePost.new(@server_uri.request_uri, headers)
40
48
  request.body = data
41
49
 
@@ -44,7 +52,7 @@ module TDAnalytics
44
52
  rescue => e
45
53
  raise ConnectionError.new("Could not connect to TA server, with error \"#{e.message}\".")
46
54
  end
47
-
55
+
48
56
  result = {}
49
57
  if response_code.to_i == 200
50
58
  begin
@@ -53,7 +61,7 @@ module TDAnalytics
53
61
  raise ServerError.new("Could not interpret TA server response: '#{response_body}'")
54
62
  end
55
63
  end
56
-
64
+
57
65
  if result['code'] != 0
58
66
  raise ServerError.new("Could not write to TA, server responded with #{response_code} returning: '#{response_body}'")
59
67
  end
@@ -84,11 +92,11 @@ module TDAnalytics
84
92
  @header = {}
85
93
  headers.each{|k,v| @header[k.to_s] = [v] }
86
94
  end
87
-
95
+
88
96
  def [](name)
89
97
  @header[name.to_s]
90
98
  end
91
-
99
+
92
100
  def []=(name, val)
93
101
  if val
94
102
  @header[name.to_s] = [val]
@@ -96,7 +104,7 @@ module TDAnalytics
96
104
  @header.delete(name.to_s)
97
105
  end
98
106
  end
99
-
107
+
100
108
  def capitalize(name)
101
109
  name
102
110
  end
@@ -6,15 +6,16 @@ module TDAnalytics
6
6
  # DebugConsumer 会返回详细的报错信息,建议在集成阶段先使用 DebugConsumer 调试接口
7
7
  class DebugConsumer
8
8
 
9
- def initialize(server_url, app_id)
9
+ def initialize(server_url, app_id, write_data = true)
10
10
  @server_uri = URI.parse(server_url)
11
- @server_uri.path = '/sync_data'
11
+ @server_uri.path = '/data_debug'
12
12
  @app_id = app_id
13
+ @write_data = write_data
13
14
  end
14
15
 
15
16
  def add(message)
16
17
  puts message.to_json
17
- form_data = {"data" => message.to_json, "appid" => @app_id, "debug" => 1}
18
+ form_data = {"data" => message.to_json, "appid" => @app_id, "dryRun" => @write_data ? "0" : "1", "source" => "server"}
18
19
  begin
19
20
  response_code, response_body = request(@server_uri, form_data)
20
21
  rescue => e
@@ -30,9 +31,7 @@ module TDAnalytics
30
31
  end
31
32
  end
32
33
 
33
- puts result
34
-
35
- if result['code'] != 0
34
+ if result['errorLevel'] != 0
36
35
  raise ServerError.new("Could not write to TA, server responded with #{response_code} returning: '#{response_body}'")
37
36
  end
38
37
  end
@@ -31,7 +31,7 @@ module TDAnalytics
31
31
  # ErrorHandler 的定义可以参考 thinkingdata-ruby/errors.rb
32
32
  #
33
33
  # uuid 如果为 true,每条数据都会被带上随机 UUID 作为 #uuid 属性的值上报,该值不会入库,仅仅用于后台做数据重复检测
34
- def initialize(consumer, error_handler=nil, uuid: false)
34
+ def initialize(consumer, error_handler = nil, uuid: false)
35
35
  @error_handler = error_handler || ErrorHandler.new
36
36
  @consumer = consumer
37
37
  @super_properties = {}
@@ -67,7 +67,7 @@ module TDAnalytics
67
67
  # time: (可选)Time 事件发生时间,如果不传默认为系统当前时间
68
68
  # ip: (可选) 事件 IP,如果传入 IP 地址,后端可以通过 IP 地址解析事件发生地点
69
69
  # skip_local_check: (可选) boolean 表示是否跳过本地检测
70
- def track(event_name:nil, distinct_id:nil, account_id:nil, properties:{}, time:nil, ip:nil, skip_local_check: false)
70
+ def track(event_name: nil, distinct_id: nil, account_id: nil, properties: {}, time: nil, ip: nil, skip_local_check: false)
71
71
  begin
72
72
  _check_name event_name
73
73
  _check_id(distinct_id, account_id)
@@ -94,7 +94,7 @@ module TDAnalytics
94
94
  # distinct_id: (可选) 访客 ID
95
95
  # account_id: (可选) 账号ID distinct_id 和 account_id 不能同时为空
96
96
  # properties: (可选) Hash 用户属性。支持四种类型的值:字符串、数值、Time、boolean
97
- def user_set(distinct_id:nil, account_id:nil, properties:{}, ip:nil)
97
+ def user_set(distinct_id: nil, account_id: nil, properties: {}, ip: nil)
98
98
  begin
99
99
  _check_id(distinct_id, account_id)
100
100
  _check_properties(:user_set, properties)
@@ -104,15 +104,15 @@ module TDAnalytics
104
104
  end
105
105
 
106
106
  _internal_track(:user_set,
107
- distinct_id: distinct_id,
108
- account_id: account_id,
109
- properties: properties,
110
- ip: ip,
107
+ distinct_id: distinct_id,
108
+ account_id: account_id,
109
+ properties: properties,
110
+ ip: ip,
111
111
  )
112
112
  end
113
113
 
114
114
  # 设置用户属性. 如果有重名属性,则丢弃, 参数与 user_set 相同
115
- def user_set_once(distinct_id:nil, account_id:nil, properties:{}, ip:nil)
115
+ def user_set_once(distinct_id: nil, account_id: nil, properties: {}, ip: nil)
116
116
  begin
117
117
  _check_id(distinct_id, account_id)
118
118
  _check_properties(:user_setOnce, properties)
@@ -122,15 +122,32 @@ module TDAnalytics
122
122
  end
123
123
 
124
124
  _internal_track(:user_setOnce,
125
- distinct_id: distinct_id,
126
- account_id: account_id,
127
- properties: properties,
128
- ip: ip,
125
+ distinct_id: distinct_id,
126
+ account_id: account_id,
127
+ properties: properties,
128
+ ip: ip,
129
129
  )
130
130
  end
131
131
 
132
+ # 追加用户的一个或多个列表类型的属性
133
+ def user_append(distinct_id: nil, account_id: nil, properties: {})
134
+ begin
135
+ _check_id(distinct_id, account_id)
136
+ _check_properties(:user_append, properties)
137
+ rescue TDAnalyticsError => e
138
+ @error_handler.handle(e)
139
+ return false
140
+ end
141
+
142
+ _internal_track(:user_append,
143
+ distinct_id: distinct_id,
144
+ account_id: account_id,
145
+ properties: properties,
146
+ )
147
+ end
148
+
132
149
  # 删除用户属性, property 可以传入需要删除的用户属性的 key 值,或者 key 值数组
133
- def user_unset(distinct_id:nil, account_id:nil, property:nil)
150
+ def user_unset(distinct_id: nil, account_id: nil, property: nil)
134
151
  properties = {}
135
152
  if property.is_a?(Array)
136
153
  property.each do |k|
@@ -149,9 +166,9 @@ module TDAnalytics
149
166
  end
150
167
 
151
168
  _internal_track(:user_unset,
152
- distinct_id: distinct_id,
153
- account_id: account_id,
154
- properties: properties,
169
+ distinct_id: distinct_id,
170
+ account_id: account_id,
171
+ properties: properties,
155
172
  )
156
173
  end
157
174
 
@@ -159,7 +176,7 @@ module TDAnalytics
159
176
  # distinct_id: (可选) 访客 ID
160
177
  # account_id: (可选) 账号ID distinct_id 和 account_id 不能同时为空
161
178
  # properties: (可选) Hash 数值类型的用户属性
162
- def user_add(distinct_id:nil, account_id:nil, properties:{})
179
+ def user_add(distinct_id: nil, account_id: nil, properties: {})
163
180
  begin
164
181
  _check_id(distinct_id, account_id)
165
182
  _check_properties(:user_add, properties)
@@ -169,14 +186,14 @@ module TDAnalytics
169
186
  end
170
187
 
171
188
  _internal_track(:user_add,
172
- distinct_id: distinct_id,
173
- account_id: account_id,
174
- properties: properties,
189
+ distinct_id: distinct_id,
190
+ account_id: account_id,
191
+ properties: properties,
175
192
  )
176
193
  end
177
194
 
178
195
  # 删除用户,用户之前的事件数据不会被删除
179
- def user_del(distinct_id:nil, account_id:nil)
196
+ def user_del(distinct_id: nil, account_id: nil)
180
197
  begin
181
198
  _check_id(distinct_id, account_id)
182
199
  rescue TDAnalyticsError => e
@@ -185,8 +202,8 @@ module TDAnalytics
185
202
  end
186
203
 
187
204
  _internal_track(:user_del,
188
- distinct_id: distinct_id,
189
- account_id: account_id,
205
+ distinct_id: distinct_id,
206
+ account_id: account_id,
190
207
  )
191
208
  end
192
209
 
@@ -219,7 +236,7 @@ module TDAnalytics
219
236
  private
220
237
 
221
238
  # 出现异常的时候返回 false, 否则 true
222
- def _internal_track(type, properties:{}, event_name:nil, account_id:nil, distinct_id:nil, ip:nil, time:Time.now)
239
+ def _internal_track(type, properties: {}, event_name: nil, account_id: nil, distinct_id: nil, ip: nil, time: Time.now)
223
240
  if account_id == nil && distinct_id == nil
224
241
  raise IllegalParameterError.new('account id or distinct id must be provided.')
225
242
  end
@@ -231,22 +248,22 @@ module TDAnalytics
231
248
 
232
249
  # 格式化 Time 类型
233
250
  properties.each do |k, v|
234
- if v.is_a?(Time)
235
- properties[k] = _format_time(v)
236
- end
251
+ if v.is_a?(Time)
252
+ properties[k] = _format_time(v)
253
+ end
237
254
  end
238
255
 
239
256
  data = {
240
- '#type' => type,
241
- '#time' => _format_time(time),
242
- 'properties' => properties,
257
+ '#type' => type,
258
+ '#time' => _format_time(time),
259
+ 'properties' => properties,
243
260
  }
244
261
 
245
262
  data['#event_name'] = event_name if type == :track
246
263
  data['#account_id'] = account_id if account_id
247
264
  data['#distinct_id'] = distinct_id if distinct_id
248
265
  data['#ip'] = ip if ip
249
- data['#uuid'] = SecureRandom.uuid if @uuid
266
+ data['#uuid'] = SecureRandom.uuid if @uuid
250
267
 
251
268
  ret = true
252
269
  begin
@@ -286,13 +303,20 @@ module TDAnalytics
286
303
 
287
304
  properties.each do |k, v|
288
305
  _check_name k
289
- unless v.is_a?(Integer) || v.is_a?(Float) || v.is_a?(Symbol) || v.is_a?(String) || v.is_a?(Time) || !!v == v
290
- raise IllegalParameterError.new("The value of properties must be type in Integer, Float, Symbol, String, and Time")
306
+ unless v.is_a?(Integer) || v.is_a?(Float) || v.is_a?(Symbol) || v.is_a?(String) || v.is_a?(Time) || !!v == v || v.is_a?(Array)
307
+ raise IllegalParameterError.new("The value of properties must be type in Integer, Float, Symbol, String, Array,and Time")
291
308
  end
292
309
 
293
310
  if type == :user_add
294
311
  raise IllegalParameterError.new("Property value for user add must be numbers") unless v.is_a?(Integer) || v.is_a?(Float)
295
312
  end
313
+ if v.is_a?(Array)
314
+ v.each_index do |i|
315
+ if v[i].is_a?(Time)
316
+ v[i] = _format_time(v[i])
317
+ end
318
+ end
319
+ end
296
320
  end
297
321
  true
298
322
  end
@@ -302,11 +326,11 @@ module TDAnalytics
302
326
  raise IllegalParameterError.new("account id or distinct id must be provided.") if distinct_id.nil? && account_id.nil?
303
327
 
304
328
  unless distinct_id.nil?
305
- raise IllegalParameterError.new("The length of distinct id should in (0, 64]") if distinct_id.to_s.length < 1 || distinct_id.to_s.length > 64
329
+ raise IllegalParameterError.new("The length of distinct id should in (0, 64]") if distinct_id.to_s.length < 1 || distinct_id.to_s.length > 64
306
330
  end
307
331
 
308
332
  unless account_id.nil?
309
- raise IllegalParameterError.new("The length of account id should in (0, 64]") if account_id.to_s.length < 1 || account_id.to_s.length > 64
333
+ raise IllegalParameterError.new("The length of account id should in (0, 64]") if account_id.to_s.length < 1 || account_id.to_s.length > 64
310
334
  end
311
335
  end
312
336
  end
@@ -1,3 +1,3 @@
1
1
  module TDAnalytics
2
- VERSION = '1.0.0'
2
+ VERSION = '1.1.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thinkingdata-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ThinkingData
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-20 00:00:00.000000000 Z
11
+ date: 2020-02-11 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: The official ThinkingData Analytics API for ruby
14
14
  email: sdk@thinkingdata.cn