simple_segment 0.1.0.pre → 0.1.0.pre2

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: 894ef7cd8308bd97baa1ca0e58112a2977f9bef6
4
- data.tar.gz: d1c3fd40058bf4dacf28e28db2489f791d85ae3d
3
+ metadata.gz: e5979b1b25f12af923da26348d23edba401da59d
4
+ data.tar.gz: 5e5fb48ad7401d4f940074d82f6588f4efea2b84
5
5
  SHA512:
6
- metadata.gz: 40be6532c6e71cbc81adeae4bfd943b059b027310e4f7458cf9b8b4723a03f5317cb5c2ab0b74f187fadfe344536b066935ea0c8dded88e5210b1eb68e124aba
7
- data.tar.gz: 3d13dd7218a30366db53054cffae79ff5895e93ff9e8c34ad5570abf1d0b51337b9d259beac4619d2744032f2f30b6a1cc841fbb77facd92a0e7672d30085a62
6
+ metadata.gz: 528412610b190fa09d3db9ddfb7401b69752e475d699229315d260538b774dc2a0449f52870fc0a5ed1dc75d232684c44076c406e2ca50e16c1207cbe49c6501
7
+ data.tar.gz: 0b7c89ab4123685489cf5dbd79bf3650ddb58c70b63c36fa754a762047172f8dd39def607f3e68a0417b7276d0015adf0c7b2214bd1b93cf4ecb5ea996db746b
data/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  # SimpleSegment
2
2
 
3
- **Warning** The project is in development and is not ready for production use yet!
4
-
5
3
  [![Build Status](https://travis-ci.org/whatthewhat/simple_segment.svg?branch=master)](https://travis-ci.org/whatthewhat/simple_segment)
6
4
 
7
5
  A simple synchronous Ruby API client for [segment.io](segment.io).
@@ -18,15 +16,13 @@ SimpleSegment allows for manual control of when and how the events are sent to S
18
16
  - `analytics.page(...)`
19
17
  - `analytics.alias(...)`
20
18
  - `analytics.flush` (no op for backwards compatibility with the official gem)
19
+ - Ability to manually batch events with `analytics.batch`
21
20
 
22
- ### Planned
23
-
24
- - Ability to manually batch events, https://segment.com/docs/libraries/http/#import
25
- - Configurable network error handling
26
- - Configurable logging
21
+ [List of planned features](https://github.com/whatthewhat/simple_segment/issues?q=is%3Aissue+is%3Aopen+label%3Afeature)
27
22
 
28
23
  The plan is to be an drop in replacement for the official gem, so all the APIs will stay the same whenever possible.
29
24
 
25
+
30
26
  ## Installation
31
27
 
32
28
  Add this line to your application's Gemfile:
@@ -49,7 +45,10 @@ Create a client instance:
49
45
 
50
46
  ```ruby
51
47
  analytics = SimpleSegment::Client.new({
52
- write_key: 'YOUR_WRITE_KEY'
48
+ write_key: 'YOUR_WRITE_KEY', # required
49
+ on_error: proc { |error_code, error_body, response, exception|
50
+ # defaults to an empty proc
51
+ }
53
52
  })
54
53
  ```
55
54
 
@@ -66,6 +65,21 @@ analytics.track(
66
65
 
67
66
  If you find inconsistencies with `analytics-ruby` feel free to file an issue.
68
67
 
68
+ ### Batching
69
+
70
+ You can manually batch events with `analytics.batch`:
71
+
72
+ ```ruby
73
+ analytics.batch do |batch|
74
+ batch.context = {...} # shared context for all events
75
+ batch.integrations = {...} # shared integrations hash for all events
76
+ batch.identify(...)
77
+ batch.track(...)
78
+ batch.track(...)
79
+ ...
80
+ end
81
+ ```
82
+
69
83
  ## Development
70
84
 
71
85
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/bin/console CHANGED
@@ -6,9 +6,5 @@ require "simple_segment"
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
8
8
 
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start
9
+ require "pry"
10
+ Pry.start
@@ -0,0 +1,50 @@
1
+ module SimpleSegment
2
+ class Batch
3
+ include SimpleSegment::Utils
4
+
5
+ attr_reader :config, :payload
6
+ attr_accessor :context, :integrations
7
+
8
+ def initialize(config)
9
+ @config = config
10
+ @payload = { batch: [] }
11
+ @context = {}
12
+ @integrations = {}
13
+ end
14
+
15
+ def identify(options)
16
+ add(Operations::Identify, options, __method__)
17
+ end
18
+
19
+ def track(options)
20
+ add(Operations::Track, options, __method__)
21
+ end
22
+
23
+ def page(options)
24
+ add(Operations::Page, options, __method__)
25
+ end
26
+
27
+ def group(options)
28
+ add(Operations::Group, options, __method__)
29
+ end
30
+
31
+ def commit
32
+ if payload[:batch].length == 0
33
+ raise ArgumentError, 'A batch must contain at least one action'
34
+ end
35
+ payload[:context] = context
36
+ payload[:integrations] = integrations
37
+
38
+ Request.new('/v1/import', config).post(payload)
39
+ end
40
+
41
+ private
42
+
43
+ def add(operation_class, options, action)
44
+ operation = operation_class.new(symbolize_keys(options), config)
45
+ operation_payload = operation.build_payload
46
+ operation_payload[:action] = action
47
+ payload[:batch] << operation_payload
48
+ end
49
+ end
50
+ end
@@ -1,6 +1,7 @@
1
1
  require 'simple_segment/utils'
2
2
  require 'simple_segment/configuration'
3
3
  require 'simple_segment/operations'
4
+ require 'simple_segment/batch'
4
5
 
5
6
  module SimpleSegment
6
7
  class Client
@@ -71,6 +72,12 @@ module SimpleSegment
71
72
  Operations::Alias.new(symbolize_keys(options), config).call
72
73
  end
73
74
 
75
+ def batch
76
+ batch = Batch.new(config)
77
+ yield(batch)
78
+ batch.commit
79
+ end
80
+
74
81
  # A no op, added for backwards compatibility with `analytics-ruby`
75
82
  def flush
76
83
  end
@@ -2,11 +2,12 @@ module SimpleSegment
2
2
  class Configuration
3
3
  include SimpleSegment::Utils
4
4
 
5
- attr_reader :write_key
5
+ attr_reader :write_key, :on_error
6
6
 
7
7
  def initialize(settings = {})
8
8
  symbolized_settings = symbolize_keys(settings)
9
9
  @write_key = symbolized_settings[:write_key]
10
+ @on_error = symbolized_settings[:on_error] || proc {}
10
11
  raise ArgumentError, 'Missing required option :write_key' unless @write_key
11
12
  end
12
13
  end
@@ -5,8 +5,6 @@ module SimpleSegment
5
5
  Request.new('/v1/alias', config).post(build_payload)
6
6
  end
7
7
 
8
- private
9
-
10
8
  def build_payload
11
9
  raise ArgumentError, 'previous_id must be present' unless options[:previous_id]
12
10
 
@@ -5,8 +5,6 @@ module SimpleSegment
5
5
  Request.new('/v1/group', config).post(build_payload)
6
6
  end
7
7
 
8
- private
9
-
10
8
  def build_payload
11
9
  raise ArgumentError, 'group_id must be present' unless options[:group_id]
12
10
 
@@ -5,8 +5,6 @@ module SimpleSegment
5
5
  Request.new('/v1/identify', config).post(build_payload)
6
6
  end
7
7
 
8
- private
9
-
10
8
  def build_payload
11
9
  base_payload.merge({
12
10
  traits: options[:traits]
@@ -5,8 +5,6 @@ module SimpleSegment
5
5
  Request.new('/v1/page', config).post(build_payload)
6
6
  end
7
7
 
8
- private
9
-
10
8
  def build_payload
11
9
  base_payload.merge({
12
10
  name: options[:name],
@@ -5,9 +5,7 @@ module SimpleSegment
5
5
  Request.new('/v1/track', config).post(build_payload)
6
6
  end
7
7
 
8
- private
9
-
10
- def build_payload(current_time = Time.now)
8
+ def build_payload
11
9
  raise ArgumentError, 'event name must be present' unless options[:event]
12
10
 
13
11
  base_payload.merge({
@@ -6,22 +6,31 @@ module SimpleSegment
6
6
  'accept' => 'application/json'
7
7
  }.freeze
8
8
 
9
- attr_reader :path, :write_key
9
+ attr_reader :path, :write_key, :error_handler
10
10
 
11
11
  def initialize(path, config)
12
12
  @path = path
13
13
  @write_key = config.write_key
14
+ @error_handler = config.on_error
14
15
  end
15
16
 
16
17
  def post(payload, headers: DEFAULT_HEADERS)
18
+ response, status_code, response_body = nil, nil, nil
17
19
  uri = URI(BASE_URL)
20
+ payload = JSON.generate(payload)
21
+
18
22
  Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
19
- payload = JSON.generate(payload)
20
23
  request = Net::HTTP::Post.new(path, headers)
21
24
  request.basic_auth write_key, nil
22
-
23
- http.request(request, payload)
25
+ http.request(request, payload).tap { |res|
26
+ status_code = res.code
27
+ response_body = res.body
28
+ response = res
29
+ response.value
30
+ }
24
31
  end
32
+ rescue StandardError => e
33
+ error_handler.call(status_code, response_body, e, response)
25
34
  end
26
35
  end
27
36
  end
@@ -1,3 +1,3 @@
1
1
  module SimpleSegment
2
- VERSION = '0.1.0.pre'
2
+ VERSION = '0.1.0.pre2'
3
3
  end
@@ -24,4 +24,5 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "rspec", "~> 3.0"
25
25
  spec.add_development_dependency "webmock", "~> 1.24"
26
26
  spec.add_development_dependency "timecop", "~> 0.8.0"
27
+ spec.add_development_dependency "pry"
27
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_segment
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre
4
+ version: 0.1.0.pre2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikhail Topolskiy
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-24 00:00:00.000000000 Z
11
+ date: 2016-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 0.8.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  description: SimpleSegment allows for manual control of when and how the events are
84
98
  sent to Segment.
85
99
  email:
@@ -98,6 +112,7 @@ files:
98
112
  - bin/console
99
113
  - bin/setup
100
114
  - lib/simple_segment.rb
115
+ - lib/simple_segment/batch.rb
101
116
  - lib/simple_segment/client.rb
102
117
  - lib/simple_segment/configuration.rb
103
118
  - lib/simple_segment/operations.rb