time_trap 0.0.3 → 0.0.5

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: 9361576b04ddf585f8d821923da1e6ea6f5f72a4
4
- data.tar.gz: 66c919c5dee91255159444cd84a36f763f1974ee
3
+ metadata.gz: d30223f65f22ddaf031ee3b26a82f4ae4dc575a4
4
+ data.tar.gz: 6211bb8bcceb931d380cdf3baf4421ed921bc4da
5
5
  SHA512:
6
- metadata.gz: 2a4d5b58a2a1d820877ceb73565b5ffd68936aadb683c81bec8410c6f16b93c884deae21562ee0c18dd900a64fda10313e60eddf247b9f1d9fb7cf32147a9084
7
- data.tar.gz: 995f619ce1d64aa20e17859a5859d1f9b66e2cfd0f6e78d74ee0c5c2d1f96499a1ec18c86f814aea13dccec31627360ef2c911491b8c4a82d163e0aa048aac01
6
+ metadata.gz: 69686f11676f70fd77ab8ae7ec0fac6f4785f50b50773867d3ef2f2f0b4ce4015da44c7d42d87304eff0ed0e3f7a6499b29628ddaf259a2d885ad4a3b5d1e116
7
+ data.tar.gz: 832d5fb56b1685ed60b13ae06f92e22c654d51c65996f374ad9fbf1c28f0478feeb10eeedbfbd5aa07fd985957f9862d0297363d2ebd1ac466ebda54a706c169
data/.yardopts ADDED
@@ -0,0 +1 @@
1
+ --markup markdown
data/README.md CHANGED
@@ -1,33 +1,17 @@
1
- # Timetrap
1
+ # TimeTrap
2
2
 
3
- Timetrap impelents a moving window data structure for keeping track of top-k things
3
+ TimeTrap impelents a moving window data structure for keeping track of top-k things
4
4
  as they are created (eg. tweets, exceptions in a log file, or :Q
5
5
 
6
6
  ## Installation
7
7
 
8
- Add this line to your application's Gemfile:
9
-
10
- gem 'time_trap'
11
-
12
- And then execute:
13
-
14
- $ bundle
15
-
16
- Or install it yourself as:
17
-
18
- $ gem install time_trap
8
+ |||
9
+ |---|---|
10
+ |bundler|gem 'time_trap'|
11
+ |raw gem|gem install time_trap|
19
12
 
20
13
  ## Usage
21
14
 
22
15
  tt = TimeTrap.new
23
16
  tt.add("benedict")
24
17
  tt.add("cumberbatch")
25
-
26
-
27
- ## Contributing
28
-
29
- 1. Fork it ( http://github.com/<my-github-username>/timetrap/fork )
30
- 2. Create your feature branch (`git checkout -b my-new-feature`)
31
- 3. Commit your changes (`git commit -am 'Add some feature'`)
32
- 4. Push to the branch (`git push origin my-new-feature`)
33
- 5. Create new Pull Request
@@ -1,3 +1,5 @@
1
+ # Deque is an inplementation of a [double ended queue] (https://en.wikipedia.org/wiki/Double-ended_queue)
2
+ # currently implemented using an array
1
3
  class Deque
2
4
  attr_accessor :queue
3
5
 
@@ -5,27 +7,35 @@ class Deque
5
7
  @queue = []
6
8
  end
7
9
 
10
+ # @return [Object] return earliest object added
8
11
  def first
9
12
  return @queue.last
10
13
  end
11
14
 
15
+ # @return [Object] return most recent object added
12
16
  def last
13
17
  return @queue.first
14
18
  end
15
-
19
+
20
+ # @param [FixNum] time time value to pushed into queue
16
21
  def push(time=Time.now.to_i)
17
22
  @queue << time
18
23
  return time
19
24
  end
20
25
 
26
+ # @return [FixNum] return most recent time added
21
27
  def pop
22
28
  return @queue.shift
23
29
  end
24
30
 
31
+ # @return [FixNum] return count of objects in queue
25
32
  def count
26
33
  return @queue.size
27
34
  end
28
35
 
36
+ # @param [FixNum] start_time beginning of time range for window
37
+ # @param [FixNum] end_time end of time range for window
38
+ # @return [Array] returns array of time entries contained in window
29
39
  def window(start_time, end_time)
30
40
  ret = @queue.select {|data_time| data_time >= start_time && data_time <= end_time }
31
41
  return ret
data/lib/timetrap.rb CHANGED
@@ -1,8 +1,84 @@
1
- require "timetrap/timetrap"
2
- require "timetrap/version"
3
- require "timetrap/deque"
4
1
 
2
+ # TimeTrap is a data structure that allows stores instances of keys added over time.
3
+ # At its core, TimeTrap is a hash where keys are data instances tracked and values are
4
+ # arrays of time(s) when teh data instance occurred.
5
5
 
6
- module Timetrap
7
- # Your code goes here...
6
+ class TimeTrap
7
+ include Enumerable
8
+
9
+ def initialize
10
+ @tt = {}
11
+ end
12
+
13
+ # Add an instance of value to timetrap. time defaults to seconds since
14
+ # epoch unless you provide a value.
15
+ def add(value, time=Time.now.to_i)
16
+ @tt[value] ||= Deque.new
17
+ return @tt[value].push(time)
18
+ end
19
+
20
+ # @param [Object] value key to retrieve.
21
+ # @return [Array] array of time instances the value was added
22
+ def get(value)
23
+ ret = @tt[value].nil? ? nil : @tt[value].queue
24
+ return ret
25
+ end
26
+
27
+ # @return [Array] array of values that have been added
28
+ def keys
29
+ return @tt.keys
30
+ end
31
+
32
+ # allows block code to be run on each entry in TimeTrap
33
+ def each(&block)
34
+ @tt.each(&block)
35
+ end
36
+
37
+ # removes k/v from TimeTrap if block code evaluates to true
38
+ # @return [TimeTrap] TimeTrap instance with deleted entries removed
39
+ def delete_if(&block)
40
+ @tt.delete_if(&block)
41
+ end
42
+
43
+ # @return [Array] of values sorted by argued block code
44
+ def sort_by(&block)
45
+ @tt.sort_by(&block)
46
+ end
47
+
48
+ # @param [Fixnum] rank number of entries to return
49
+ # @return [Array] array of keys sorted by number of instances
50
+ def top(rank)
51
+ ret = @tt.sort_by {|k,v| -v.count}.map{|k,v| k}
52
+ return ret[0..rank - 1]
53
+ end
54
+
55
+ # @param [Fixnum] secs number of seconds before current time for window
56
+ # @return [Hash] returns hash of values in window key=added data, value = count
57
+ # of occurences in last argued secondswindow
58
+ def last(secs)
59
+ t = Time.now.to_i
60
+ return window(t - secs, t)
61
+ end
62
+
63
+ # @param [Object] key key to look up in TimeTrap
64
+ # @return [bool] obvious??
65
+ def has_key?(key)
66
+ return @tt.has_key?(key)
67
+ end
68
+
69
+ # @return count of distinct keys which have been added
70
+ def count
71
+ return @tt.count
72
+ end
73
+
74
+ # @param [FixNum] start_sec beginning on time frame
75
+ # @param [FixNum] end_sec end of time frame
76
+ # @return [Hash] key = value added to TimeTrap, value = count of instances in the window
77
+ def window(start_sec, end_sec)
78
+ ret = {}
79
+ @tt.each {|k,v| ret[k] = v.window(start_sec, end_sec).count if v.window(start_sec, end_sec).count > 0}
80
+ return ret
81
+ end
8
82
  end
83
+
84
+ require 'timetrap/deque'
@@ -16,6 +16,18 @@ describe TimeTrap do
16
16
  end
17
17
  end
18
18
 
19
+ context "#get" do
20
+ it "allows retrieval of values" do
21
+ t = Time.now.to_i
22
+ ttrap.add("test_1", t)
23
+ expect(ttrap.get("test_1")).to match_array([t])
24
+ end
25
+
26
+ it "returns nil for keys that haven't been added" do
27
+ expect(ttrap.get("test_1")).to be_nil
28
+ end
29
+ end
30
+
19
31
  context "#count" do
20
32
  it "keeps count of objects added" do
21
33
  time = ttrap.add("test_1")
data/time_trap.gemspec CHANGED
@@ -1,16 +1,15 @@
1
1
  # coding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'timetrap/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
6
  spec.name = "time_trap"
8
- spec.version = Timetrap::VERSION
7
+ spec.version = "0.0.5"
9
8
  spec.authors = ["Pat Farrell"]
10
9
  spec.email = ["mr.patfarrell@gmail.com"]
11
10
  spec.summary = %q{"exposes a data structure suitable for capturing and inspecting moving windows of data"}
12
11
  spec.description = %q{"timetrap is a work in progress to create a simple data strucutre that allows for windowed inspection of counts added to a hash"}
13
- spec.homepage = "http://github.com/pfarrell/timetrap"
12
+ spec.homepage = "https://rubygems.org/gems/time_trap"
14
13
  spec.license = "MIT"
15
14
 
16
15
  spec.files = `git ls-files -z`.split("\x0")
@@ -20,9 +19,10 @@ Gem::Specification.new do |spec|
20
19
 
21
20
 
22
21
  spec.add_development_dependency "bundler", "~> 1.5"
23
- spec.add_development_dependency "rake"
24
- spec.add_development_dependency "rspec"
25
- spec.add_development_dependency "simplecov"
26
- spec.add_development_dependency "yard"
27
- spec.add_development_dependency "byebug"
22
+ spec.add_development_dependency "rake", "~> 10.1"
23
+ spec.add_development_dependency "rspec", "~> 2.14"
24
+ spec.add_development_dependency "simplecov", "~> 0.8"
25
+ spec.add_development_dependency "yard", "~> 0.8"
26
+ spec.add_development_dependency "byebug", "~> 2.7"
27
+ spec.add_development_dependency "markdown", "~> 1.1"
28
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: time_trap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pat Farrell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-26 00:00:00.000000000 Z
11
+ date: 2014-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -28,72 +28,86 @@ dependencies:
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '10.1'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '10.1'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '2.14'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '2.14'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: simplecov
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '0.8'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: '0.8'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: yard
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: '0.8'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: '0.8'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: byebug
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: '2.7'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.7'
97
+ - !ruby/object:Gem::Dependency
98
+ name: markdown
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.1'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: '0'
110
+ version: '1.1'
97
111
  description: "\"timetrap is a work in progress to create a simple data strucutre that
98
112
  allows for windowed inspection of counts added to a hash\""
99
113
  email:
@@ -104,19 +118,18 @@ extra_rdoc_files: []
104
118
  files:
105
119
  - ".gitignore"
106
120
  - ".rspec"
121
+ - ".yardopts"
107
122
  - Gemfile
108
123
  - LICENSE.txt
109
124
  - README.md
110
125
  - Rakefile
111
126
  - lib/timetrap.rb
112
127
  - lib/timetrap/deque.rb
113
- - lib/timetrap/timetrap.rb
114
- - lib/timetrap/version.rb
115
128
  - spec/spec_helper.rb
116
129
  - spec/timetrap/deque_spec.rb
117
- - spec/timetrap/timetrap_spec.rb
130
+ - spec/timetrap_spec.rb
118
131
  - time_trap.gemspec
119
- homepage: http://github.com/pfarrell/timetrap
132
+ homepage: https://rubygems.org/gems/time_trap
120
133
  licenses:
121
134
  - MIT
122
135
  metadata: {}
@@ -144,5 +157,5 @@ summary: "\"exposes a data structure suitable for capturing and inspecting movin
144
157
  test_files:
145
158
  - spec/spec_helper.rb
146
159
  - spec/timetrap/deque_spec.rb
147
- - spec/timetrap/timetrap_spec.rb
160
+ - spec/timetrap_spec.rb
148
161
  has_rdoc:
@@ -1,56 +0,0 @@
1
- class TimeTrap
2
- include Enumerable
3
-
4
- def initialize
5
- @tt = {}
6
- end
7
-
8
- def add(value, time=Time.now.to_i)
9
- @tt[value] ||= Deque.new
10
- return @tt[value].push(time)
11
- end
12
-
13
- def get(value)
14
- return @tt[value].queue
15
- end
16
-
17
- def keys
18
- return @tt.keys
19
- end
20
-
21
- def each(&block)
22
- @tt.each(&block)
23
- end
24
-
25
- def delete_if(&block)
26
- @tt.delete_if(&block)
27
- end
28
-
29
- def sort_by(&block)
30
- @tt.sort_by(&block)
31
- end
32
-
33
- def top(rank)
34
- ret = @tt.sort_by {|k,v| -v.count}.map{|k,v| k}
35
- return ret[0..rank - 1]
36
- end
37
-
38
- def last(secs)
39
- t = Time.now.to_i
40
- return window(t - secs, t)
41
- end
42
-
43
- def has_key?(key)
44
- return @tt.has_key?(key)
45
- end
46
-
47
- def count
48
- return @tt.count
49
- end
50
-
51
- def window(start_sec, end_sec)
52
- ret = {}
53
- @tt.each {|k,v| ret[k] = v.window(start_sec, end_sec).count if v.window(start_sec, end_sec).count > 0}
54
- return ret
55
- end
56
- end
@@ -1,3 +0,0 @@
1
- module Timetrap
2
- VERSION = "0.0.3"
3
- end