logworm 0.6.1
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.
- data/CHANGELOG +17 -0
- data/Manifest +9 -0
- data/README +0 -0
- data/Rakefile +10 -0
- data/lib/base/config.rb +34 -0
- data/lib/base/db.rb +74 -0
- data/lib/base/query_builder.rb +112 -0
- data/lib/logworm.rb +3 -0
- data/logworm.gemspec +48 -0
- data/tests/builder_test.rb +52 -0
- metadata +153 -0
data/CHANGELOG
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
v0.6.1 fixed query builder
|
2
|
+
|
3
|
+
v0.6.0 added query builder
|
4
|
+
|
5
|
+
v0.5.1 removed memcache dependency, added memcache-client
|
6
|
+
|
7
|
+
v0.5.0 removed utils, moved them to separate gem
|
8
|
+
|
9
|
+
v0.4.1 added start and end options to lw-compute and lw-tail
|
10
|
+
|
11
|
+
v0.4.0 added lw-compute tool, to run aggregate queries
|
12
|
+
|
13
|
+
v0.3.0 added lw-heroku tool, to push configuration variables to heroku
|
14
|
+
|
15
|
+
v0.2.0 removed app/ libraries. Added tail as a utility, lw-tail as a command
|
16
|
+
|
17
|
+
v0.1.0 initial version.
|
data/Manifest
ADDED
data/README
ADDED
File without changes
|
data/Rakefile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'echoe'
|
2
|
+
Echoe.new('logworm', '0.6.1') do |p|
|
3
|
+
p.description = "logworm logging tool"
|
4
|
+
p.url = "http://www.logworm.com"
|
5
|
+
p.author = "Pomelo, LLC"
|
6
|
+
p.email = "schapira@pomelollc.com"
|
7
|
+
p.ignore_pattern = ["tmp/*", "script/*"]
|
8
|
+
p.development_dependencies = ["memcache-client", "hpricot", "oauth"]
|
9
|
+
p.runtime_dependencies = ["memcache-client", "hpricot", "oauth"]
|
10
|
+
end
|
data/lib/base/config.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module Logworm
|
4
|
+
class ConfigFileNotFound < Exception ; end
|
5
|
+
|
6
|
+
class Config
|
7
|
+
|
8
|
+
include ::Singleton
|
9
|
+
|
10
|
+
FILENAME = "./.logworm"
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@file_found = false
|
14
|
+
@consumer_key = @consumer_secret = @token_key = @token_secret = nil
|
15
|
+
begin
|
16
|
+
f = File.new(FILENAME, 'r')
|
17
|
+
@consumer_key, @consumer_secret, @token_key, @token_secret = f.readlines.map {|l| l.strip }
|
18
|
+
@file_found = true
|
19
|
+
rescue Errno::ENOENT => e
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def keys
|
24
|
+
[@consumer_key, @consumer_secret, @token_key, @token_secret]
|
25
|
+
end
|
26
|
+
|
27
|
+
def file_found?
|
28
|
+
@file_found and @consumer_key and @consumer_secret and @token_key and @token_secret
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
data/lib/base/db.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'oauth'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Logworm
|
5
|
+
class ForbiddenAccessException < Exception ; end
|
6
|
+
class DatabaseException < Exception ; end
|
7
|
+
class InvalidQueryException < Exception ; end
|
8
|
+
|
9
|
+
class DB
|
10
|
+
|
11
|
+
DB_HOST = "http://db.logworm.com"
|
12
|
+
|
13
|
+
def initialize(keys = nil)
|
14
|
+
if keys.is_a? Array and keys.size == 4
|
15
|
+
@consumer_key, @consumer_secret, @token, @token_secret = keys
|
16
|
+
elsif keys.is_a? Array and keys.size == 2
|
17
|
+
@consumer_key = ENV["#{ENV['APP_ID']}_APPS_KEY"]
|
18
|
+
@consumer_secret = ENV["#{ENV['APP_ID']}_APPS_SECRET"]
|
19
|
+
@token, @token_secret = keys
|
20
|
+
else
|
21
|
+
config = Logworm::Config.instance
|
22
|
+
if config.file_found?
|
23
|
+
@consumer_key, @consumer_secret, @token, @token_secret = config.keys
|
24
|
+
else
|
25
|
+
raise "Could not find .logworm file in current directory." if keys.is_a? FalseClass
|
26
|
+
@consumer_key, @consumer_secret = [ENV['LW_CONSUMER_KEY'], ENV['LW_CONSUMER_SECRET']]
|
27
|
+
@token, @token_secret = [ENV['LW_PROJECT_KEY'], ENV['LW_PROJECT_SECRET']]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
raise ForbiddenAccessException.new("Missing keys") if @consumer_key.nil? or @consumer_secret.nil?
|
31
|
+
raise ForbiddenAccessException.new("Missing keys") if @token.nil? or @token_secret.nil?
|
32
|
+
@connection = OAuth::AccessToken.new(OAuth::Consumer.new(@consumer_key, @consumer_secret), @token, @token_secret)
|
33
|
+
end
|
34
|
+
|
35
|
+
def tables()
|
36
|
+
res = db_call(:get, "#{DB_HOST}/")
|
37
|
+
end
|
38
|
+
|
39
|
+
def query(table, cond)
|
40
|
+
res = db_call(:post, "#{DB_HOST}/queries", {:table => table, :query => cond})
|
41
|
+
end
|
42
|
+
|
43
|
+
def results(uri)
|
44
|
+
res = db_call(:get, uri)
|
45
|
+
raise InvalidQueryException.new("#{res['error']}") if res['error']
|
46
|
+
res["results"] = JSON.parse(res["results"])
|
47
|
+
res
|
48
|
+
end
|
49
|
+
|
50
|
+
def batch_log(entries)
|
51
|
+
db_call(:post, "#{DB_HOST}/log", {:entries => $lr_queue.to_json})
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
def db_call(method, uri, params = {})
|
56
|
+
begin
|
57
|
+
res = @connection.send(method, uri, params)
|
58
|
+
rescue SocketError
|
59
|
+
raise DatabaseException
|
60
|
+
end
|
61
|
+
raise DatabaseException if res.code.to_i == 404
|
62
|
+
raise DatabaseException.new("Server returned: #{res.body}") if res.code.to_i == 500
|
63
|
+
raise ForbiddenAccessException if res.code.to_i == 403
|
64
|
+
raise InvalidQueryException.new("#{res.body}") if res.code.to_i == 400
|
65
|
+
begin
|
66
|
+
JSON.parse(res.body)
|
67
|
+
rescue Exception => e
|
68
|
+
raise DatabaseException.new("Database reponse cannot be parsed: #{e}")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
###
|
5
|
+
# Receives a hash with options, and provides a to_json method that returns the query ready to be sent to the logworm server
|
6
|
+
# Switches (all optional)
|
7
|
+
# :fields => String with a comma-separated list of fields (quoted or not), or Array of Strings
|
8
|
+
# :force_ts => Boolean, specifies whether _ts should be added to the list of fields
|
9
|
+
# :aggregate_function => String
|
10
|
+
# :aggregate_argument => String
|
11
|
+
# :aggregate_group => String with a comma-separated list of fields (quoted or not), or Array of Strings
|
12
|
+
# :conditions => String with comma-separated conditions (in MongoDB syntax), or Array of Strings
|
13
|
+
# :start => String or Integer (for year)
|
14
|
+
# :end => String or Integer (for year)
|
15
|
+
# :limit => String or Integer
|
16
|
+
###
|
17
|
+
module Logworm
|
18
|
+
class QueryBuilder
|
19
|
+
|
20
|
+
attr_accessor :fields, :groups, :aggregate, :conditions, :tf, :limit
|
21
|
+
|
22
|
+
def initialize(options = {})
|
23
|
+
@options = options
|
24
|
+
@query = build()
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_json
|
28
|
+
@query
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def build()
|
33
|
+
query_opts = []
|
34
|
+
|
35
|
+
###
|
36
|
+
# Fields : Array, or Comma-separated string
|
37
|
+
###
|
38
|
+
@fields = to_array(@options[:fields])
|
39
|
+
query_opts << '"fields":' + (@options[:force_ts] ? @fields + ["_ts"] : @fields).to_json if @fields.size > 0
|
40
|
+
|
41
|
+
###
|
42
|
+
# Aggregate
|
43
|
+
# aggregate_function: String
|
44
|
+
# aggregate_argument: String (or empty)
|
45
|
+
# aggregate_group: String or Array
|
46
|
+
###
|
47
|
+
@groups = to_array(@options[:aggregate_group])
|
48
|
+
@aggregate = {}
|
49
|
+
@aggregate[:function] = @options[:aggregate_function] if is_set?(@options[:aggregate_function])
|
50
|
+
@aggregate[:argument] = @options[:aggregate_argument] if is_set?(@options[:aggregate_argument])
|
51
|
+
@aggregate[:group_by] = groups[0] if groups.size == 1
|
52
|
+
@aggregate[:group_by] = groups if groups.size > 1
|
53
|
+
query_opts << '"aggregate":' + @aggregate.to_json if @aggregate.keys.size > 0
|
54
|
+
|
55
|
+
if @fields.size > 0 and @aggregate.keys.size > 0
|
56
|
+
raise Logworm::InvalidQueryException.new("Queries cannot contain both fields and aggregates")
|
57
|
+
end
|
58
|
+
|
59
|
+
###
|
60
|
+
# Conditions : Array, or Comma-separated string
|
61
|
+
# ['"a":10' , '"b":20']
|
62
|
+
# "a:10", "b":20
|
63
|
+
###
|
64
|
+
@conditions = to_string(@options[:conditions])
|
65
|
+
query_opts << '"conditions":{' + conditions + "}" if conditions.size > 0
|
66
|
+
|
67
|
+
###
|
68
|
+
# Timeframe: String
|
69
|
+
###
|
70
|
+
@tf = {}
|
71
|
+
@tf[:start] = unquote(@options[:start]).to_s if is_set?(@options[:start]) or is_set?(@options[:start], Integer, 0)
|
72
|
+
@tf[:end] = unquote(@options[:end]).to_s if is_set?(@options[:end]) or is_set?(@options[:end], Integer, 0)
|
73
|
+
query_opts << '"timeframe":' + @tf.to_json if @tf.keys.size > 0
|
74
|
+
|
75
|
+
###
|
76
|
+
# Limit
|
77
|
+
# String or Integer
|
78
|
+
###
|
79
|
+
if (is_set?(@options[:limit], Integer, 200) or is_set?(@options[:limit], String, ""))
|
80
|
+
@limit = @options[:limit].to_s
|
81
|
+
query_opts << '"limit":' + @limit
|
82
|
+
end
|
83
|
+
|
84
|
+
# And the string
|
85
|
+
"{#{query_opts.join(", ")}}"
|
86
|
+
end
|
87
|
+
|
88
|
+
def to_array(arg)
|
89
|
+
return [] if arg.nil?
|
90
|
+
return arg if arg.is_a? Array
|
91
|
+
return arg.split(",").map {|e| unquote(e.strip)} if arg.is_a? String and arg.split != ""
|
92
|
+
[]
|
93
|
+
end
|
94
|
+
|
95
|
+
def to_string(arg)
|
96
|
+
return "" if arg.nil?
|
97
|
+
return arg.split(",").map {|e| e.strip}.join(",") if arg.is_a? String
|
98
|
+
return arg.join(",") if arg.is_a? Array and arg.size > 0
|
99
|
+
""
|
100
|
+
end
|
101
|
+
|
102
|
+
def unquote(str)
|
103
|
+
return str unless str.is_a? String
|
104
|
+
str.gsub(/^"/, '').gsub(/"$/,'')
|
105
|
+
end
|
106
|
+
|
107
|
+
def is_set?(elt, klass = String, empty_val = "")
|
108
|
+
elt and elt.is_a?(klass) and elt != empty_val
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|
data/lib/logworm.rb
ADDED
data/logworm.gemspec
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{logworm}
|
5
|
+
s.version = "0.6.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Pomelo, LLC"]
|
9
|
+
s.date = %q{2010-03-01}
|
10
|
+
s.description = %q{logworm logging tool}
|
11
|
+
s.email = %q{schapira@pomelollc.com}
|
12
|
+
s.extra_rdoc_files = ["CHANGELOG", "README", "lib/base/config.rb", "lib/base/db.rb", "lib/base/query_builder.rb", "lib/logworm.rb"]
|
13
|
+
s.files = ["CHANGELOG", "Manifest", "README", "Rakefile", "lib/base/config.rb", "lib/base/db.rb", "lib/base/query_builder.rb", "lib/logworm.rb", "tests/builder_test.rb", "logworm.gemspec"]
|
14
|
+
s.homepage = %q{http://www.logworm.com}
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Logworm", "--main", "README"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubyforge_project = %q{logworm}
|
18
|
+
s.rubygems_version = %q{1.3.6}
|
19
|
+
s.summary = %q{logworm logging tool}
|
20
|
+
|
21
|
+
if s.respond_to? :specification_version then
|
22
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
23
|
+
s.specification_version = 3
|
24
|
+
|
25
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
26
|
+
s.add_runtime_dependency(%q<memcache-client>, [">= 0"])
|
27
|
+
s.add_runtime_dependency(%q<hpricot>, [">= 0"])
|
28
|
+
s.add_runtime_dependency(%q<oauth>, [">= 0"])
|
29
|
+
s.add_development_dependency(%q<memcache-client>, [">= 0"])
|
30
|
+
s.add_development_dependency(%q<hpricot>, [">= 0"])
|
31
|
+
s.add_development_dependency(%q<oauth>, [">= 0"])
|
32
|
+
else
|
33
|
+
s.add_dependency(%q<memcache-client>, [">= 0"])
|
34
|
+
s.add_dependency(%q<hpricot>, [">= 0"])
|
35
|
+
s.add_dependency(%q<oauth>, [">= 0"])
|
36
|
+
s.add_dependency(%q<memcache-client>, [">= 0"])
|
37
|
+
s.add_dependency(%q<hpricot>, [">= 0"])
|
38
|
+
s.add_dependency(%q<oauth>, [">= 0"])
|
39
|
+
end
|
40
|
+
else
|
41
|
+
s.add_dependency(%q<memcache-client>, [">= 0"])
|
42
|
+
s.add_dependency(%q<hpricot>, [">= 0"])
|
43
|
+
s.add_dependency(%q<oauth>, [">= 0"])
|
44
|
+
s.add_dependency(%q<memcache-client>, [">= 0"])
|
45
|
+
s.add_dependency(%q<hpricot>, [">= 0"])
|
46
|
+
s.add_dependency(%q<oauth>, [">= 0"])
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require '../lib/base/query_builder'
|
4
|
+
|
5
|
+
class BuilderTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
end
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_empty
|
14
|
+
assert_equal "{}", Logworm::QueryBuilder.new({}).to_json
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_fields
|
18
|
+
assert_equal '{"fields":["a","b"]}', Logworm::QueryBuilder.new(:fields => 'a, b').to_json
|
19
|
+
assert_equal '{"fields":["a","b"]}', Logworm::QueryBuilder.new(:fields => '"a", "b"').to_json
|
20
|
+
assert_equal '{"fields":["a","b"]}', Logworm::QueryBuilder.new(:fields => ["a", "b"]).to_json
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_aggregate
|
24
|
+
q = {:aggregate_function => "count"}
|
25
|
+
assert_equal '{"aggregate":{"function":"count"}}', Logworm::QueryBuilder.new(q).to_json
|
26
|
+
q = {:aggregate_function => "a", :aggregate_argument => "b"}
|
27
|
+
assert_equal '{"aggregate":{"argument":"b","function":"a"}}', Logworm::QueryBuilder.new(q).to_json
|
28
|
+
q = {:aggregate_function => "a", :aggregate_argument => "b", :aggregate_group => "a,b,c"}
|
29
|
+
assert_equal '{"aggregate":{"argument":"b","group_by":["a","b","c"],"function":"a"}}', Logworm::QueryBuilder.new(q).to_json
|
30
|
+
q = {:aggregate_function => "a", :aggregate_argument => "b", :aggregate_group => ["a","b","c"]}
|
31
|
+
assert_equal '{"aggregate":{"argument":"b","group_by":["a","b","c"],"function":"a"}}', Logworm::QueryBuilder.new(q).to_json
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_conditions
|
35
|
+
assert_equal '{"conditions":{"a":10,"b":"c"}}', Logworm::QueryBuilder.new(:conditions => '"a":10, "b":"c"').to_json
|
36
|
+
assert_equal '{"conditions":{"a":10,"b":"c"}}', Logworm::QueryBuilder.new(:conditions => ['"a":10', '"b":"c"']).to_json
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_times
|
40
|
+
assert_equal '{}', Logworm::QueryBuilder.new(:blah => "2009").to_json
|
41
|
+
assert_equal '{"timeframe":{"start":"2009"}}', Logworm::QueryBuilder.new(:start => "2009").to_json
|
42
|
+
assert_equal '{"timeframe":{"end":"2009"}}', Logworm::QueryBuilder.new(:end => "2009").to_json
|
43
|
+
assert_equal '{"timeframe":{"start":"2009","end":"2010"}}', Logworm::QueryBuilder.new(:start => "2009", :end => "2010").to_json
|
44
|
+
assert_equal '{"timeframe":{"start":"2009","end":"2010"}}', Logworm::QueryBuilder.new(:start => 2009, :end => 2010).to_json
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_limit
|
48
|
+
assert_equal '{"limit":10}', Logworm::QueryBuilder.new(:limit => 10).to_json
|
49
|
+
assert_equal '{}', Logworm::QueryBuilder.new(:limit => 200).to_json
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
metadata
ADDED
@@ -0,0 +1,153 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: logworm
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 6
|
8
|
+
- 1
|
9
|
+
version: 0.6.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Pomelo, LLC
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-03-01 00:00:00 -05:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: memcache-client
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
type: :runtime
|
31
|
+
version_requirements: *id001
|
32
|
+
- !ruby/object:Gem::Dependency
|
33
|
+
name: hpricot
|
34
|
+
prerelease: false
|
35
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
segments:
|
40
|
+
- 0
|
41
|
+
version: "0"
|
42
|
+
type: :runtime
|
43
|
+
version_requirements: *id002
|
44
|
+
- !ruby/object:Gem::Dependency
|
45
|
+
name: oauth
|
46
|
+
prerelease: false
|
47
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
segments:
|
52
|
+
- 0
|
53
|
+
version: "0"
|
54
|
+
type: :runtime
|
55
|
+
version_requirements: *id003
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: memcache-client
|
58
|
+
prerelease: false
|
59
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
segments:
|
64
|
+
- 0
|
65
|
+
version: "0"
|
66
|
+
type: :development
|
67
|
+
version_requirements: *id004
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: hpricot
|
70
|
+
prerelease: false
|
71
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
version: "0"
|
78
|
+
type: :development
|
79
|
+
version_requirements: *id005
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: oauth
|
82
|
+
prerelease: false
|
83
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
version: "0"
|
90
|
+
type: :development
|
91
|
+
version_requirements: *id006
|
92
|
+
description: logworm logging tool
|
93
|
+
email: schapira@pomelollc.com
|
94
|
+
executables: []
|
95
|
+
|
96
|
+
extensions: []
|
97
|
+
|
98
|
+
extra_rdoc_files:
|
99
|
+
- CHANGELOG
|
100
|
+
- README
|
101
|
+
- lib/base/config.rb
|
102
|
+
- lib/base/db.rb
|
103
|
+
- lib/base/query_builder.rb
|
104
|
+
- lib/logworm.rb
|
105
|
+
files:
|
106
|
+
- CHANGELOG
|
107
|
+
- Manifest
|
108
|
+
- README
|
109
|
+
- Rakefile
|
110
|
+
- lib/base/config.rb
|
111
|
+
- lib/base/db.rb
|
112
|
+
- lib/base/query_builder.rb
|
113
|
+
- lib/logworm.rb
|
114
|
+
- tests/builder_test.rb
|
115
|
+
- logworm.gemspec
|
116
|
+
has_rdoc: true
|
117
|
+
homepage: http://www.logworm.com
|
118
|
+
licenses: []
|
119
|
+
|
120
|
+
post_install_message:
|
121
|
+
rdoc_options:
|
122
|
+
- --line-numbers
|
123
|
+
- --inline-source
|
124
|
+
- --title
|
125
|
+
- Logworm
|
126
|
+
- --main
|
127
|
+
- README
|
128
|
+
require_paths:
|
129
|
+
- lib
|
130
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
segments:
|
135
|
+
- 0
|
136
|
+
version: "0"
|
137
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - ">="
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
segments:
|
142
|
+
- 1
|
143
|
+
- 2
|
144
|
+
version: "1.2"
|
145
|
+
requirements: []
|
146
|
+
|
147
|
+
rubyforge_project: logworm
|
148
|
+
rubygems_version: 1.3.6
|
149
|
+
signing_key:
|
150
|
+
specification_version: 3
|
151
|
+
summary: logworm logging tool
|
152
|
+
test_files: []
|
153
|
+
|