analytics-ruby 0.1.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.md CHANGED
@@ -1,3 +1,7 @@
1
+ 0.2.0 / 2013-3-21
2
+ ===========
3
+ * Adding flush method
4
+
1
5
  0.1.4 / 2013-3-19
2
6
  ===========
3
7
  * Adding ClassMethods for more extensibility by [arronmabrey](https://github.com/arronmabrey)
Binary file
@@ -17,6 +17,11 @@ module AnalyticsRuby
17
17
  return false unless @client
18
18
  @client.identify(options)
19
19
  end
20
+
21
+ def flush
22
+ return false unless @client
23
+ @client.flush
24
+ end
20
25
  end
21
26
  extend ClassMethods
22
27
  end
@@ -15,7 +15,7 @@ module AnalyticsRuby
15
15
  # :secret - String of your project's secret
16
16
  # :max_queue_size - Fixnum of the max calls to remain queued (optional)
17
17
  # :on_error - Proc which handles error calls from the API
18
- def initialize (options = {})
18
+ def initialize(options = {})
19
19
 
20
20
  @queue = Queue.new
21
21
  @secret = options[:secret]
@@ -24,7 +24,17 @@ module AnalyticsRuby
24
24
  check_secret
25
25
 
26
26
  @consumer = AnalyticsRuby::Consumer.new(@queue, @secret, options)
27
- Thread.new { @consumer.run }
27
+ @thread = Thread.new { @consumer.run }
28
+ end
29
+
30
+ # public: Synchronously waits until the consumer has flushed the queue.
31
+ # Use only for scripts which are not long-running, and will
32
+ # specifically exit
33
+ #
34
+ def flush
35
+ while !@queue.empty? || @consumer.is_requesting?
36
+ sleep(0.1)
37
+ end
28
38
  end
29
39
 
30
40
  # public: Tracks an event
@@ -24,6 +24,8 @@ module AnalyticsRuby
24
24
  @on_error = options[:on_error] || Proc.new { |status, error| }
25
25
 
26
26
  @current_batch = []
27
+
28
+ @mutex = Mutex.new
27
29
  end
28
30
 
29
31
  # public: Continuously runs the loop to check for new events
@@ -37,18 +39,33 @@ module AnalyticsRuby
37
39
  # public: Flush some events from our queue
38
40
  #
39
41
  def flush
40
-
41
42
  # Block until we have something to send
42
- @current_batch << @queue.pop()
43
+ item = @queue.pop()
43
44
 
44
- until @current_batch.length >= @batch_size || @queue.empty?
45
- @current_batch << @queue.pop()
46
- end
45
+ # Synchronize on additions to the current batch
46
+ @mutex.synchronize {
47
+ @current_batch << item
48
+ until @current_batch.length >= @batch_size || @queue.empty?
49
+ @current_batch << @queue.pop()
50
+ end
51
+ }
47
52
 
48
53
  req = AnalyticsRuby::Request.new
49
54
  res = req.post(@secret, @current_batch)
50
55
  @on_error.call(res.status, res.error) unless res.status == 200
51
- @current_batch = []
56
+ @mutex.synchronize {
57
+ @current_batch = []
58
+ }
59
+ end
60
+
61
+ # public: Check whether we have outstanding requests.
62
+ #
63
+ def is_requesting?
64
+ requesting = nil
65
+ @mutex.synchronize {
66
+ requesting = !@current_batch.empty?
67
+ }
68
+ requesting
52
69
  end
53
70
 
54
71
  end
@@ -1,3 +1,3 @@
1
1
  module AnalyticsRuby
2
- VERSION = '0.1.4'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -13,7 +13,6 @@ describe Analytics::Client do
13
13
  it 'should not error if a secret is supplied' do
14
14
  Analytics::Client.new secret: AnalyticsHelpers::SECRET
15
15
  end
16
-
17
16
  end
18
17
 
19
18
  describe '#track' do
@@ -33,7 +32,6 @@ describe Analytics::Client do
33
32
  it 'should not error with the required options' do
34
33
  @client.track AnalyticsHelpers::Queued::TRACK
35
34
  end
36
-
37
35
  end
38
36
 
39
37
 
@@ -50,9 +48,20 @@ describe Analytics::Client do
50
48
  it 'should not error with the required options' do
51
49
  @client.identify AnalyticsHelpers::Queued::IDENTIFY
52
50
  end
53
-
54
51
  end
55
52
 
53
+ describe '#flush' do
54
+ before(:all) do
55
+ @client = Analytics::Client.new secret: AnalyticsHelpers::SECRET
56
+ end
57
+
58
+ it 'should wait for the queue to finish on a flush' do
59
+ @client.identify AnalyticsHelpers::Queued::IDENTIFY
60
+ @client.track AnalyticsHelpers::Queued::TRACK
61
+ @client.flush
62
+ @client.queued_messages.should == 0
63
+ end
64
+ end
56
65
  end
57
66
 
58
67
 
@@ -58,4 +58,31 @@ describe Analytics::Consumer do
58
58
  queue.should be_empty
59
59
  end
60
60
  end
61
+
62
+ describe '#is_requesting?' do
63
+
64
+ it 'should not return true if there isn\'t a current batch' do
65
+
66
+ queue = Queue.new
67
+ consumer = Analytics::Consumer.new(queue, 'testsecret')
68
+
69
+ consumer.is_requesting?.should == false
70
+ end
71
+
72
+ it 'should return true if there is a current batch' do
73
+
74
+ queue = Queue.new
75
+ queue << AnalyticsHelpers::Requested::TRACK
76
+ consumer = Analytics::Consumer.new(queue, 'testsecret')
77
+
78
+ Thread.new {
79
+ consumer.flush
80
+ consumer.is_requesting?.should == false
81
+ }
82
+
83
+ # sleep barely long enough to let thread flush the queue.
84
+ sleep(0.001)
85
+ consumer.is_requesting?.should == true
86
+ end
87
+ end
61
88
  end
@@ -55,4 +55,12 @@ describe Analytics do
55
55
  sleep(1)
56
56
  end
57
57
  end
58
+
59
+ describe '#flush' do
60
+
61
+ it 'should flush without error' do
62
+ Analytics.identify AnalyticsHelpers::Queued::IDENTIFY
63
+ Analytics.flush
64
+ end
65
+ end
58
66
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: analytics-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-19 00:00:00.000000000 Z
12
+ date: 2013-03-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
16
- requirement: &10550500 !ruby/object:Gem::Requirement
16
+ requirement: &10049160 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -24,10 +24,10 @@ dependencies:
24
24
  version: '0.10'
25
25
  type: :runtime
26
26
  prerelease: false
27
- version_requirements: *10550500
27
+ version_requirements: *10049160
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: faraday_middleware
30
- requirement: &13478460 !ruby/object:Gem::Requirement
30
+ requirement: &10048220 !ruby/object:Gem::Requirement
31
31
  none: false
32
32
  requirements:
33
33
  - - ! '>='
@@ -38,10 +38,10 @@ dependencies:
38
38
  version: '0.10'
39
39
  type: :runtime
40
40
  prerelease: false
41
- version_requirements: *13478460
41
+ version_requirements: *10048220
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: multi_json
44
- requirement: &13477720 !ruby/object:Gem::Requirement
44
+ requirement: &10047320 !ruby/object:Gem::Requirement
45
45
  none: false
46
46
  requirements:
47
47
  - - ~>
@@ -49,10 +49,10 @@ dependencies:
49
49
  version: '1.0'
50
50
  type: :runtime
51
51
  prerelease: false
52
- version_requirements: *13477720
52
+ version_requirements: *10047320
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: rake
55
- requirement: &13477340 !ruby/object:Gem::Requirement
55
+ requirement: &10046680 !ruby/object:Gem::Requirement
56
56
  none: false
57
57
  requirements:
58
58
  - - ! '>='
@@ -60,10 +60,10 @@ dependencies:
60
60
  version: '0'
61
61
  type: :development
62
62
  prerelease: false
63
- version_requirements: *13477340
63
+ version_requirements: *10046680
64
64
  - !ruby/object:Gem::Dependency
65
65
  name: rspec
66
- requirement: &13476880 !ruby/object:Gem::Requirement
66
+ requirement: &10044520 !ruby/object:Gem::Requirement
67
67
  none: false
68
68
  requirements:
69
69
  - - ! '>='
@@ -71,7 +71,7 @@ dependencies:
71
71
  version: '0'
72
72
  type: :development
73
73
  prerelease: false
74
- version_requirements: *13476880
74
+ version_requirements: *10044520
75
75
  description: The Segment.io ruby analytics library
76
76
  email: friends@segment.io
77
77
  executables: []
@@ -88,6 +88,7 @@ files:
88
88
  - lib/analytics-ruby/version.rb
89
89
  - lib/analytics-ruby/json.rb
90
90
  - lib/analytics-ruby/client.rb
91
+ - analytics-ruby-0.1.4.gem
91
92
  - History.md
92
93
  - analytics-ruby.gemspec
93
94
  - Rakefile