thinkingdata-ruby 1.1.0 → 1.2.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 +5 -5
- data/CHANGELOG.md +4 -0
- data/lib/thinkingdata-ruby/batch_consumer.rb +10 -3
- data/lib/thinkingdata-ruby/debug_consumer.rb +9 -3
- data/lib/thinkingdata-ruby/tracker.rb +82 -17
- data/lib/thinkingdata-ruby/version.rb +1 -1
- metadata +3 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: 3885c858dfa78a2f34e1803351c1f3b20ed9f67378d7cf3033c0e840e3f9c60a
         | 
| 4 | 
            +
              data.tar.gz: c0c954d2974d3000f708dd2ff6340a0799dd8a5c0aac84832c9b7fd245550381
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 9505c957f69a7270ed77b4b8a5a84828c5976aefebcea9635b4a4563182c134b102c75a7c2a3bc0ff55131465d3b588a3a878c9587a371303f61ae2ab0f257d8
         | 
| 7 | 
            +
              data.tar.gz: 2bb4637c114d94bdf36f210588226d7bb8c7306377f6500d0b3b530f92e22ef7c3776b0ee48230bb4fc1e9bfe4bccfcd2e19c4b73c7861d1bd275d3a37e02f02
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    
| @@ -6,9 +6,10 @@ module TDAnalytics | |
| 6 6 | 
             
              # 有数据时,首先会加入本地缓冲区,当条数到达上限后会发起上报
         | 
| 7 7 | 
             
              class BatchConsumer
         | 
| 8 8 | 
             
                # 默认缓冲区大小
         | 
| 9 | 
            -
                 | 
| 9 | 
            +
                DEFAULT_LENGTH = 20
         | 
| 10 | 
            +
                MAX_LENGTH = 2000
         | 
| 10 11 |  | 
| 11 | 
            -
                def initialize(server_url, app_id, max_buffer_length =  | 
| 12 | 
            +
                def initialize(server_url, app_id, max_buffer_length = DEFAULT_LENGTH)
         | 
| 12 13 | 
             
                  @server_uri = URI.parse(server_url)
         | 
| 13 14 | 
             
                  @server_uri.path = '/sync_server'
         | 
| 14 15 | 
             
                  @app_id = app_id
         | 
| @@ -43,7 +44,13 @@ module TDAnalytics | |
| 43 44 | 
             
                        data = chunk.to_json
         | 
| 44 45 | 
             
                      end
         | 
| 45 46 | 
             
                      compress_type = @compress ? 'gzip' : 'none'
         | 
| 46 | 
            -
                      headers = {'Content-Type' => 'application/plaintext', | 
| 47 | 
            +
                      headers = {'Content-Type' => 'application/plaintext',
         | 
| 48 | 
            +
                                 'appid' => @app_id,
         | 
| 49 | 
            +
                                 'compress' => compress_type,
         | 
| 50 | 
            +
                                 'TA-Integration-Type'=>'Ruby',
         | 
| 51 | 
            +
                                 'TA-Integration-Version'=>TDAnalytics::VERSION,
         | 
| 52 | 
            +
                                 'TA-Integration-Count'=>@buffers.count,
         | 
| 53 | 
            +
                                 'TA_Integration-Extra'=>'batch'}
         | 
| 47 54 | 
             
                      request = CaseSensitivePost.new(@server_uri.request_uri, headers)
         | 
| 48 55 | 
             
                      request.body = data
         | 
| 49 56 |  | 
| @@ -15,9 +15,15 @@ module TDAnalytics | |
| 15 15 |  | 
| 16 16 | 
             
                def add(message)
         | 
| 17 17 | 
             
                  puts message.to_json
         | 
| 18 | 
            +
                  headers =  {
         | 
| 19 | 
            +
                      'TA-Integration-Type'=>'Ruby',
         | 
| 20 | 
            +
                      'TA-Integration-Version'=>TDAnalytics::VERSION,
         | 
| 21 | 
            +
                      'TA-Integration-Count'=>'1',
         | 
| 22 | 
            +
                      'TA_Integration-Extra'=>'debug'
         | 
| 23 | 
            +
                  }
         | 
| 18 24 | 
             
                  form_data = {"data" => message.to_json, "appid" => @app_id, "dryRun" => @write_data ? "0" : "1", "source" => "server"}
         | 
| 19 25 | 
             
                  begin
         | 
| 20 | 
            -
                    response_code, response_body = request(@server_uri, form_data)
         | 
| 26 | 
            +
                    response_code, response_body = request(@server_uri, form_data,headers)
         | 
| 21 27 | 
             
                  rescue => e
         | 
| 22 28 | 
             
                    raise ConnectionError.new("Could not connect to TA server, with error \"#{e.message}\".")
         | 
| 23 29 | 
             
                  end
         | 
| @@ -36,8 +42,8 @@ module TDAnalytics | |
| 36 42 | 
             
                  end
         | 
| 37 43 | 
             
                end
         | 
| 38 44 |  | 
| 39 | 
            -
                def request(uri, form_data)
         | 
| 40 | 
            -
                  request = Net::HTTP::Post.new(uri.request_uri)
         | 
| 45 | 
            +
                def request(uri, form_data,headers)
         | 
| 46 | 
            +
                  request = Net::HTTP::Post.new(uri.request_uri,headers)
         | 
| 41 47 | 
             
                  request.set_form_data(form_data)
         | 
| 42 48 |  | 
| 43 49 | 
             
                  client = Net::HTTP.new(uri.host, uri.port)
         | 
| @@ -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,first_check_id:nil, skip_local_check: false)
         | 
| 71 71 | 
             
                  begin
         | 
| 72 72 | 
             
                    _check_name event_name
         | 
| 73 73 | 
             
                    _check_id(distinct_id, account_id)
         | 
| @@ -85,11 +85,80 @@ module TDAnalytics | |
| 85 85 | 
             
                  data[:account_id] = account_id if account_id
         | 
| 86 86 | 
             
                  data[:time] = time if time
         | 
| 87 87 | 
             
                  data[:ip] = ip if ip
         | 
| 88 | 
            +
                  data[:first_check_id] = first_check_id if first_check_id
         | 
| 88 89 | 
             
                  data[:properties] = properties
         | 
| 89 90 |  | 
| 90 91 | 
             
                  _internal_track(:track, data)
         | 
| 91 92 | 
             
                end
         | 
| 92 93 |  | 
| 94 | 
            +
                #   上报事件数据可进行更新. 每个事件都包含一个事件名和事件ID以及 Hash 对象的时间属性. 其参数说明如下:
         | 
| 95 | 
            +
                #   event_name: (必须) 事件名 必须是英文字母开头,可以包含字母、数字和 _, 长度不超过 50 个字符.
         | 
| 96 | 
            +
                #   event_id:(必须) event_name + event_id 会作为一条事件的唯一键
         | 
| 97 | 
            +
                #   distinct_id: (可选) 访客 ID
         | 
| 98 | 
            +
                #   account_id: (可选) 账号ID distinct_id 和 account_id 不能同时为空
         | 
| 99 | 
            +
                #   properties: (可选) Hash 事件属性。支持四种类型的值:字符串、数值、Time、boolean
         | 
| 100 | 
            +
                #   time: (可选)Time 事件发生时间,如果不传默认为系统当前时间
         | 
| 101 | 
            +
                #   ip: (可选) 事件 IP,如果传入 IP 地址,后端可以通过 IP 地址解析事件发生地点
         | 
| 102 | 
            +
                #   skip_local_check: (可选) boolean 表示是否跳过本地检测
         | 
| 103 | 
            +
                def track_overwrite(event_name: nil,event_id: nil, distinct_id: nil, account_id: nil, properties: {}, time: nil, ip: nil, skip_local_check: false)
         | 
| 104 | 
            +
                  begin
         | 
| 105 | 
            +
                    _check_name event_name
         | 
| 106 | 
            +
                    _check_event_id event_id
         | 
| 107 | 
            +
                    _check_id(distinct_id, account_id)
         | 
| 108 | 
            +
                    unless skip_local_check
         | 
| 109 | 
            +
                      _check_properties(:track_overwrite, properties)
         | 
| 110 | 
            +
                    end
         | 
| 111 | 
            +
                  rescue TDAnalyticsError => e
         | 
| 112 | 
            +
                    @error_handler.handle(e)
         | 
| 113 | 
            +
                    return false
         | 
| 114 | 
            +
                  end
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                  data = {}
         | 
| 117 | 
            +
                  data[:event_name] = event_name
         | 
| 118 | 
            +
                  data[:event_id] = event_id
         | 
| 119 | 
            +
                  data[:distinct_id] = distinct_id if distinct_id
         | 
| 120 | 
            +
                  data[:account_id] = account_id if account_id
         | 
| 121 | 
            +
                  data[:time] = time if time
         | 
| 122 | 
            +
                  data[:ip] = ip if ip
         | 
| 123 | 
            +
                  data[:properties] = properties
         | 
| 124 | 
            +
                  _internal_track(:track_overwrite, data)
         | 
| 125 | 
            +
                end
         | 
| 126 | 
            +
             | 
| 127 | 
            +
             | 
| 128 | 
            +
             | 
| 129 | 
            +
                #   上报事件数据可进行覆盖. 每个事件都包含一个事件名和事件ID以及 Hash 对象的时间属性. 其参数说明如下:
         | 
| 130 | 
            +
                #   event_name: (必须) 事件名 必须是英文字母开头,可以包含字母、数字和 _, 长度不超过 50 个字符.
         | 
| 131 | 
            +
                #   event_id:(必须) event_name + event_id 会作为一条事件的唯一键
         | 
| 132 | 
            +
                #   distinct_id: (可选) 访客 ID
         | 
| 133 | 
            +
                #   account_id: (可选) 账号ID distinct_id 和 account_id 不能同时为空
         | 
| 134 | 
            +
                #   properties: (可选) Hash 事件属性。支持四种类型的值:字符串、数值、Time、boolean
         | 
| 135 | 
            +
                #   time: (可选)Time 事件发生时间,如果不传默认为系统当前时间
         | 
| 136 | 
            +
                #   ip: (可选) 事件 IP,如果传入 IP 地址,后端可以通过 IP 地址解析事件发生地点
         | 
| 137 | 
            +
                #   skip_local_check: (可选) boolean 表示是否跳过本地检测
         | 
| 138 | 
            +
                def track_update(event_name: nil,event_id: nil, distinct_id: nil, account_id: nil, properties: {}, time: nil, ip: nil, skip_local_check: false)
         | 
| 139 | 
            +
                  begin
         | 
| 140 | 
            +
                    _check_name event_name
         | 
| 141 | 
            +
                    _check_event_id event_id
         | 
| 142 | 
            +
                    _check_id(distinct_id, account_id)
         | 
| 143 | 
            +
                    unless skip_local_check
         | 
| 144 | 
            +
                      _check_properties(:track_update, properties)
         | 
| 145 | 
            +
                    end
         | 
| 146 | 
            +
                  rescue TDAnalyticsError => e
         | 
| 147 | 
            +
                    @error_handler.handle(e)
         | 
| 148 | 
            +
                    return false
         | 
| 149 | 
            +
                  end
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                  data = {}
         | 
| 152 | 
            +
                  data[:event_name] = event_name
         | 
| 153 | 
            +
                  data[:event_id] = event_id
         | 
| 154 | 
            +
                  data[:distinct_id] = distinct_id if distinct_id
         | 
| 155 | 
            +
                  data[:account_id] = account_id if account_id
         | 
| 156 | 
            +
                  data[:time] = time if time
         | 
| 157 | 
            +
                  data[:ip] = ip if ip
         | 
| 158 | 
            +
                  data[:properties] = properties
         | 
| 159 | 
            +
                  _internal_track(:track_update, data)
         | 
| 160 | 
            +
                end
         | 
| 161 | 
            +
             | 
| 93 162 | 
             
                # 设置用户属性. 如果出现同名属性,则会覆盖之前的值.
         | 
| 94 163 | 
             
                #   distinct_id: (可选) 访客 ID
         | 
| 95 164 | 
             
                #   account_id: (可选) 账号ID distinct_id 和 account_id 不能同时为空
         | 
| @@ -236,13 +305,13 @@ module TDAnalytics | |
| 236 305 | 
             
                private
         | 
| 237 306 |  | 
| 238 307 | 
             
                # 出现异常的时候返回 false, 否则 true
         | 
| 239 | 
            -
                def _internal_track(type, properties: {}, event_name: nil, account_id: nil, distinct_id: nil, ip: nil, time: Time.now)
         | 
| 308 | 
            +
                def _internal_track(type, properties: {}, event_name: nil, event_id:nil, account_id: nil, distinct_id: nil, ip: nil,first_check_id: nil, time: Time.now)
         | 
| 240 309 | 
             
                  if account_id == nil && distinct_id == nil
         | 
| 241 310 | 
             
                    raise IllegalParameterError.new('account id or distinct id must be provided.')
         | 
| 242 311 | 
             
                  end
         | 
| 243 312 |  | 
| 244 | 
            -
                  if type == :track
         | 
| 245 | 
            -
                    raise IllegalParameterError.new('event name is empty | 
| 313 | 
            +
                  if type == :track || type == :track_update || type == :track_overwrite
         | 
| 314 | 
            +
                    raise IllegalParameterError.new('event name is empty') if event_name == nil
         | 
| 246 315 | 
             
                    properties = {'#zone_offset': time.utc_offset / 3600.0}.merge(LIB_PROPERTIES).merge(@super_properties).merge(properties)
         | 
| 247 316 | 
             
                  end
         | 
| 248 317 |  | 
| @@ -259,10 +328,12 @@ module TDAnalytics | |
| 259 328 | 
             
                      'properties' => properties,
         | 
| 260 329 | 
             
                  }
         | 
| 261 330 |  | 
| 262 | 
            -
                  data['#event_name'] = event_name if type == :track
         | 
| 331 | 
            +
                  data['#event_name'] = event_name if (type == :track || type == :track_update || :track_overwrite)
         | 
| 332 | 
            +
                  data['#event_id'] = event_id if (type == :track_update || type == :track_overwrite)
         | 
| 263 333 | 
             
                  data['#account_id'] = account_id if account_id
         | 
| 264 334 | 
             
                  data['#distinct_id'] = distinct_id if distinct_id
         | 
| 265 335 | 
             
                  data['#ip'] = ip if ip
         | 
| 336 | 
            +
                  data['#first_check_id'] = first_check_id if first_check_id
         | 
| 266 337 | 
             
                  data['#uuid'] = SecureRandom.uuid if @uuid
         | 
| 267 338 |  | 
| 268 339 | 
             
                  ret = true
         | 
| @@ -281,6 +352,11 @@ module TDAnalytics | |
| 281 352 | 
             
                  time.strftime("%Y-%m-%d %H:%M:%S.#{((time.to_f * 1000.0).to_i % 1000).to_s.rjust(3, "0")}")
         | 
| 282 353 | 
             
                end
         | 
| 283 354 |  | 
| 355 | 
            +
                def _check_event_id(event_id)
         | 
| 356 | 
            +
                  raise IllegalParameterError.new("the event_id or property cannot be nil") if event_id.nil?
         | 
| 357 | 
            +
                  true
         | 
| 358 | 
            +
                end
         | 
| 359 | 
            +
             | 
| 284 360 | 
             
                # 属性名或者事件名检查
         | 
| 285 361 | 
             
                def _check_name(name)
         | 
| 286 362 | 
             
                  raise IllegalParameterError.new("the name of event or property cannot be nil") if name.nil?
         | 
| @@ -288,10 +364,6 @@ module TDAnalytics | |
| 288 364 | 
             
                  unless name.instance_of?(String) || name.instance_of?(Symbol)
         | 
| 289 365 | 
             
                    raise IllegalParameterError.new("#{name} is invalid. It must be String or Symbol")
         | 
| 290 366 | 
             
                  end
         | 
| 291 | 
            -
             | 
| 292 | 
            -
                  unless name =~ /^[a-zA-Z][a-zA-Z0-9_]{1,49}$/
         | 
| 293 | 
            -
                    raise IllegalParameterError.new("#{name} is invalid. It must be string starts with letters and contains letters, numbers, and _ with max length of 50")
         | 
| 294 | 
            -
                  end
         | 
| 295 367 | 
             
                  true
         | 
| 296 368 | 
             
                end
         | 
| 297 369 |  | 
| @@ -303,6 +375,7 @@ module TDAnalytics | |
| 303 375 |  | 
| 304 376 | 
             
                  properties.each do |k, v|
         | 
| 305 377 | 
             
                    _check_name k
         | 
| 378 | 
            +
                    next if v.nil?
         | 
| 306 379 | 
             
                    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 380 | 
             
                      raise IllegalParameterError.new("The value of properties must be type in Integer, Float, Symbol, String, Array,and Time")
         | 
| 308 381 | 
             
                    end
         | 
| @@ -324,14 +397,6 @@ module TDAnalytics | |
| 324 397 | 
             
                # 检查用户 ID 合法性
         | 
| 325 398 | 
             
                def _check_id(distinct_id, account_id)
         | 
| 326 399 | 
             
                  raise IllegalParameterError.new("account id or distinct id must be provided.") if distinct_id.nil? && account_id.nil?
         | 
| 327 | 
            -
             | 
| 328 | 
            -
                  unless distinct_id.nil?
         | 
| 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
         | 
| 330 | 
            -
                  end
         | 
| 331 | 
            -
             | 
| 332 | 
            -
                  unless account_id.nil?
         | 
| 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
         | 
| 334 | 
            -
                  end
         | 
| 335 400 | 
             
                end
         | 
| 336 401 | 
             
              end
         | 
| 337 402 | 
             
            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. | 
| 4 | 
            +
              version: 1.2.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - ThinkingData
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2020- | 
| 11 | 
            +
            date: 2020-08-28 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies: []
         | 
| 13 13 | 
             
            description: The official ThinkingData Analytics API for ruby
         | 
| 14 14 | 
             
            email: sdk@thinkingdata.cn
         | 
| @@ -48,8 +48,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 48 48 | 
             
                - !ruby/object:Gem::Version
         | 
| 49 49 | 
             
                  version: '0'
         | 
| 50 50 | 
             
            requirements: []
         | 
| 51 | 
            -
             | 
| 52 | 
            -
            rubygems_version: 2.5.2.3
         | 
| 51 | 
            +
            rubygems_version: 3.0.3
         | 
| 53 52 | 
             
            signing_key: 
         | 
| 54 53 | 
             
            specification_version: 4
         | 
| 55 54 | 
             
            summary: Official ThinkingData Analytics API for ruby
         |