thinkingdata-ruby 1.0.0 → 1.1.0

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: 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