knjappserver 0.0.26 → 0.0.28
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/Gemfile +2 -0
- data/Gemfile.lock +5 -0
- data/VERSION +1 -1
- data/knjappserver.gemspec +8 -2
- data/lib/files/database_schema.rb +1 -1
- data/lib/include/class_customio.rb +6 -1
- data/lib/include/class_httpsession.rb +2 -2
- data/lib/include/class_httpsession_http_request.rb +1 -1
- data/lib/include/class_knjappserver.rb +1 -1
- data/lib/include/class_knjappserver_errors.rb +2 -2
- data/lib/include/class_knjappserver_logging.rb +39 -1
- data/lib/include/class_knjappserver_sessions.rb +2 -2
- data/lib/include/class_knjappserver_web.rb +1 -1
- data/lib/include/class_log.rb +7 -2
- data/lib/include/class_log_link.rb +8 -3
- data/lib/pages/logs_show.rhtml +1 -1
- data/lib/scripts/benchmark.rb +2 -2
- data/lib/scripts/knjappserver_cgi.rb +3 -3
- data/lib/scripts/knjappserver_fcgi.rb +4 -4
- metadata +35 -13
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
+
datet (0.0.0)
|
4
5
|
diff-lcs (1.1.3)
|
5
6
|
erubis (2.7.0)
|
6
7
|
git (1.2.5)
|
8
|
+
http2 (0.0.0)
|
9
|
+
knjrbfw
|
7
10
|
i18n (0.6.0)
|
8
11
|
jeweler (1.6.4)
|
9
12
|
bundler (~> 1.0)
|
@@ -40,7 +43,9 @@ PLATFORMS
|
|
40
43
|
|
41
44
|
DEPENDENCIES
|
42
45
|
bundler (>= 1.0.0)
|
46
|
+
datet
|
43
47
|
erubis
|
48
|
+
http2
|
44
49
|
jeweler (~> 1.6.3)
|
45
50
|
json
|
46
51
|
knjrbfw
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.28
|
data/knjappserver.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{knjappserver}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.28"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kasper Johansen"]
|
12
|
-
s.date = %q{2012-07-
|
12
|
+
s.date = %q{2012-07-14}
|
13
13
|
s.description = %q{Which supports a lot of undocumented stuff.}
|
14
14
|
s.email = %q{k@spernj.org}
|
15
15
|
s.executables = ["check_running.rb", "knjappserver_start.rb"]
|
@@ -104,6 +104,8 @@ Gem::Specification.new do |s|
|
|
104
104
|
s.add_runtime_dependency(%q<erubis>, [">= 0"])
|
105
105
|
s.add_runtime_dependency(%q<mail>, [">= 0"])
|
106
106
|
s.add_runtime_dependency(%q<tsafe>, [">= 0"])
|
107
|
+
s.add_runtime_dependency(%q<datet>, [">= 0"])
|
108
|
+
s.add_runtime_dependency(%q<http2>, [">= 0"])
|
107
109
|
s.add_development_dependency(%q<json>, [">= 0"])
|
108
110
|
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
109
111
|
s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
|
@@ -114,6 +116,8 @@ Gem::Specification.new do |s|
|
|
114
116
|
s.add_dependency(%q<erubis>, [">= 0"])
|
115
117
|
s.add_dependency(%q<mail>, [">= 0"])
|
116
118
|
s.add_dependency(%q<tsafe>, [">= 0"])
|
119
|
+
s.add_dependency(%q<datet>, [">= 0"])
|
120
|
+
s.add_dependency(%q<http2>, [">= 0"])
|
117
121
|
s.add_dependency(%q<json>, [">= 0"])
|
118
122
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
119
123
|
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
@@ -125,6 +129,8 @@ Gem::Specification.new do |s|
|
|
125
129
|
s.add_dependency(%q<erubis>, [">= 0"])
|
126
130
|
s.add_dependency(%q<mail>, [">= 0"])
|
127
131
|
s.add_dependency(%q<tsafe>, [">= 0"])
|
132
|
+
s.add_dependency(%q<datet>, [">= 0"])
|
133
|
+
s.add_dependency(%q<http2>, [">= 0"])
|
128
134
|
s.add_dependency(%q<json>, [">= 0"])
|
129
135
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
130
136
|
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
@@ -93,7 +93,7 @@ class Knjappserver
|
|
93
93
|
{"name" => "idhash", "type" => "varchar"},
|
94
94
|
{"name" => "sess_data", "type" => "text"},
|
95
95
|
{"name" => "date_added", "type" => "datetime"},
|
96
|
-
{"name" => "date_lastused", "type" => "datetime", "on_created" => proc{|d| d["db"].query("UPDATE Session SET date_lastused = '#{
|
96
|
+
{"name" => "date_lastused", "type" => "datetime", "on_created" => proc{|d| d["db"].query("UPDATE Session SET date_lastused = '#{Datet.new.dbstr}'")}},
|
97
97
|
{"name" => "ip", "type" => "varchar", "maxlength" => 15},
|
98
98
|
{"name" => "user_agent", "type" => "text"},
|
99
99
|
{"name" => "remember", "type" => "enum", "maxlength" => "'0','1'", "default" => 0, "comment" => "If the session should be remembered or not."}
|
@@ -261,7 +261,7 @@ class Knjappserver::Httpsession
|
|
261
261
|
|
262
262
|
begin
|
263
263
|
@session, @session_hash = @kas.session_fromid(@ip, @session_id, @meta)
|
264
|
-
rescue
|
264
|
+
rescue ArgumentError => e
|
265
265
|
#User should not have the session he asked for because of invalid user-agent or invalid IP.
|
266
266
|
@session_id = @kas.session_generate_id(@meta)
|
267
267
|
@session, @session_hash = @kas.session_fromid(@ip, @session_id, @meta)
|
@@ -334,7 +334,7 @@ class Knjappserver::Httpsession
|
|
334
334
|
@resp.header("Expires", (Time.now + 86400).httpdate) #next day.
|
335
335
|
|
336
336
|
if !cache_dont and @headers["if-modified-since"] and @headers["if-modified-since"][0]
|
337
|
-
request_mod =
|
337
|
+
request_mod = Datet.in(@headers["if-modified-since"].first).time
|
338
338
|
|
339
339
|
if request_mod == lastmod
|
340
340
|
@resp.status = 304
|
@@ -204,7 +204,7 @@ class Knjappserver::Httpsession::Http_request
|
|
204
204
|
mod_match = @meta["HTTP_IF_MODIFIED_SINCE"].match(/^([A-z]+),\s+(\d+)\s+([A-z]+)\s+(\d+)\s+(\d+):(\d+):(\d+)\s+(.+)$/)
|
205
205
|
raise "Could not parse 'HTTP_IF_MODIFIED_SINCE'." if !mod_match
|
206
206
|
|
207
|
-
month_no =
|
207
|
+
month_no = Datet.month_str_to_no(mod_match[3])
|
208
208
|
@modified_since = Time.utc(mod_match[4].to_i, month_no, mod_match[2].to_i, mod_match[5].to_i, mod_match[6].to_i, mod_match[7].to_i)
|
209
209
|
|
210
210
|
return @modified_since
|
@@ -34,8 +34,8 @@ class Knjappserver
|
|
34
34
|
if error_email[:messages].length == 1
|
35
35
|
html = error_email[:messages].first
|
36
36
|
else
|
37
|
-
html = "<b>First time:</b> #{
|
38
|
-
html << "<b>Last time:</b> #{
|
37
|
+
html = "<b>First time:</b> #{Datet.in(error_email[:first_time]).out}<br />"
|
38
|
+
html << "<b>Last time:</b> #{Datet.in(error_email[:last_time]).out}<br />"
|
39
39
|
html << "<b>Number of errors:</b> #{error_email[:messages].length}<br />"
|
40
40
|
count = 0
|
41
41
|
|
@@ -179,7 +179,7 @@ class Knjappserver
|
|
179
179
|
begin
|
180
180
|
keys_data_obj = @ob.get(:Log_data, keys_id)
|
181
181
|
values_data_obj = @ob.get(:Log_data, values_id)
|
182
|
-
rescue
|
182
|
+
rescue Errno::ENOENT
|
183
183
|
return {}
|
184
184
|
end
|
185
185
|
|
@@ -357,4 +357,42 @@ class Knjappserver
|
|
357
357
|
|
358
358
|
return html
|
359
359
|
end
|
360
|
+
|
361
|
+
#Removes all logs for objects that have been deleted.
|
362
|
+
#===Examples
|
363
|
+
#Remember to pass Knj::Objects-object handler to the method.
|
364
|
+
# appsrv.logs_delete_dead(:ob => ob, :debug => false)
|
365
|
+
def logs_delete_dead(args)
|
366
|
+
raise "No :ob-argument given." if !args[:ob]
|
367
|
+
|
368
|
+
@db.q_buffer do |db_buffer|
|
369
|
+
STDOUT.puts "Starting to look for dead log-links." if @debug or args[:debug]
|
370
|
+
@ob.list(:Log_link, :cloned_ubuf => true) do |log_link|
|
371
|
+
classname = log_link.object_class.to_s.split("::").last
|
372
|
+
obj_exists = args[:ob].exists?(classname, log_link[:object_id])
|
373
|
+
next if obj_exists
|
374
|
+
|
375
|
+
log = log_link.log
|
376
|
+
|
377
|
+
STDOUT.puts "Deleting log-link #{log_link.id} for #{classname}(#{log_link[:object_id]})." if @debug or args[:debug]
|
378
|
+
@ob.delete(log_link, :db_buffer => db_buffer)
|
379
|
+
|
380
|
+
links_count = log.links("count" => true)
|
381
|
+
|
382
|
+
if links_count <= 0
|
383
|
+
STDOUT.puts "Deleting log #{log.id} because it has no more links." if @debug or args[:debug]
|
384
|
+
@ob.delete(log, :db_buffer => db_buffer)
|
385
|
+
end
|
386
|
+
end
|
387
|
+
|
388
|
+
STDOUT.puts "Starting to look for logs with no links." if @debug or args[:debug]
|
389
|
+
@ob.list(:Log, {
|
390
|
+
[:Log_link, "id"] => {:type => :sqlval, :val => :null},
|
391
|
+
:cloned_ubuf => true
|
392
|
+
}) do |log|
|
393
|
+
STDOUT.puts "Deleting log #{log.id} because it has no links: '#{log.text}'." if @debug or args[:debug]
|
394
|
+
@ob.delete(log, :db_buffer => db_buffer)
|
395
|
+
end
|
396
|
+
end
|
397
|
+
end
|
360
398
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class Knjappserver
|
2
2
|
def initialize_sessions
|
3
|
-
require "tsafe"
|
3
|
+
require "tsafe" if !Kernel.const_defined?(:Tsafe)
|
4
4
|
@sessions = Tsafe::MonHash.new
|
5
5
|
end
|
6
6
|
|
@@ -29,7 +29,7 @@ class Knjappserver
|
|
29
29
|
end
|
30
30
|
|
31
31
|
if ip != "bot" and !session.remember? and ip.to_s != session[:ip].to_s
|
32
|
-
raise
|
32
|
+
raise ArgumentError, "Invalid IP."
|
33
33
|
end
|
34
34
|
|
35
35
|
@sessions[idhash][:time_lastused] = Time.now
|
@@ -2,7 +2,7 @@ class Knjappserver
|
|
2
2
|
#Imports a .rhtml-file and executes it.
|
3
3
|
def import(filepath)
|
4
4
|
if filepath.to_s.index("../proc/self") != nil
|
5
|
-
raise
|
5
|
+
raise Errno::EACCES, "Possible attempt to hack the appserver."
|
6
6
|
end
|
7
7
|
|
8
8
|
_httpsession.eruby.import(filepath)
|
data/lib/include/class_log.rb
CHANGED
@@ -18,10 +18,13 @@ class Knjappserver::Log < Knj::Datarow
|
|
18
18
|
"
|
19
19
|
end
|
20
20
|
|
21
|
+
q_args = nil
|
21
22
|
return_sql = false
|
23
|
+
ret = self.list_helper(d)
|
24
|
+
|
25
|
+
sql << ret[:sql_joins]
|
22
26
|
sql << " WHERE 1=1"
|
23
27
|
|
24
|
-
ret = list_helper(d)
|
25
28
|
d.args.each do |key, val|
|
26
29
|
case key
|
27
30
|
when "object_lookup"
|
@@ -35,6 +38,8 @@ class Knjappserver::Log < Knj::Datarow
|
|
35
38
|
else
|
36
39
|
sql << " AND Log.tag_data_id = '#{d.db.esc(data_val.id)}'"
|
37
40
|
end
|
41
|
+
when :cloned_ubuf
|
42
|
+
q_args = {:cloned_ubuf => true}
|
38
43
|
else
|
39
44
|
raise "Invalid key: #{key}."
|
40
45
|
end
|
@@ -46,7 +51,7 @@ class Knjappserver::Log < Knj::Datarow
|
|
46
51
|
|
47
52
|
return sql if return_sql
|
48
53
|
|
49
|
-
return d.ob.list_bysql(:Log, sql, &block)
|
54
|
+
return d.ob.list_bysql(:Log, sql, q_args, &block)
|
50
55
|
end
|
51
56
|
|
52
57
|
def self.add(d)
|
@@ -11,14 +11,19 @@ class Knjappserver::Log_link < Knj::Datarow
|
|
11
11
|
else
|
12
12
|
sql = "SELECT * FROM #{table} WHERE 1=1"
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
|
+
q_args = nil
|
15
16
|
ret = self.list_helper(d)
|
17
|
+
sql << ret[:sql_joins]
|
18
|
+
|
16
19
|
d.args.each do |key, val|
|
17
20
|
case key
|
18
21
|
when "object_class"
|
19
22
|
data_val = d.db.single(:Log_data_value, {"value" => val})
|
20
23
|
return [] if !data_val #if this data-value cannot be found, nothing has been logged for the object. So just return empty array here and skip the rest.
|
21
24
|
sql << " AND object_class_value_id = '#{d.db.esc(data_val[:id])}'"
|
25
|
+
when :cloned_ubuf
|
26
|
+
q_args = {:cloned_ubuf => true}
|
22
27
|
else
|
23
28
|
raise "Invalid key: #{key}."
|
24
29
|
end
|
@@ -31,7 +36,7 @@ class Knjappserver::Log_link < Knj::Datarow
|
|
31
36
|
sql << ret[:sql_order]
|
32
37
|
sql << ret[:sql_limit]
|
33
38
|
|
34
|
-
return d.ob.list_bysql(:Log_link, sql, &block)
|
39
|
+
return d.ob.list_bysql(:Log_link, sql, q_args, &block)
|
35
40
|
end
|
36
41
|
|
37
42
|
def self.add(d)
|
@@ -49,7 +54,7 @@ class Knjappserver::Log_link < Knj::Datarow
|
|
49
54
|
begin
|
50
55
|
class_name = ob.get(:Log_data_value, self[:object_class_value_id])[:value].split("::").last
|
51
56
|
return ob_use.get(class_name, self[:object_id])
|
52
|
-
rescue
|
57
|
+
rescue Errno::ENOENT
|
53
58
|
return false
|
54
59
|
end
|
55
60
|
end
|
data/lib/pages/logs_show.rhtml
CHANGED
data/lib/scripts/benchmark.rb
CHANGED
@@ -57,7 +57,7 @@ count_requests = 0
|
|
57
57
|
Knj::Thread.new(count_thread) do |count_thread|
|
58
58
|
print "Thread #{count_thread} started.\n"
|
59
59
|
|
60
|
-
http =
|
60
|
+
http = Http2.new(
|
61
61
|
:host => "localhost",
|
62
62
|
:port => 15081,
|
63
63
|
:user_agent => "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1; debugid:#{count_thread}) Gecko/20060111 Firefox/3.6.0.1",
|
@@ -65,7 +65,7 @@ count_requests = 0
|
|
65
65
|
)
|
66
66
|
|
67
67
|
loop do
|
68
|
-
resp = http.get(args[:filename])
|
68
|
+
resp = http.get(:url => args[:filename])
|
69
69
|
count_requests += 1
|
70
70
|
raise "Invalid code: #{resp.code}\n" if resp.code.to_i != 200
|
71
71
|
end
|
@@ -71,7 +71,7 @@ begin
|
|
71
71
|
port = knjappserver.port
|
72
72
|
|
73
73
|
#Make request.
|
74
|
-
http =
|
74
|
+
http = Http2.new(:host => "localhost", :port => port)
|
75
75
|
|
76
76
|
#Spawn CGI-variable to emulate FCGI part.
|
77
77
|
cgi = Cgi_is_retarded.new
|
@@ -102,7 +102,7 @@ begin
|
|
102
102
|
|
103
103
|
if cgi.request_method == "POST" and cgi.content_type.to_s.downcase.index("multipart/form-data") != nil
|
104
104
|
count = 0
|
105
|
-
http.post_multipart(url, Knjappserver.convert_fcgi_post(cgi.params),
|
105
|
+
http.post_multipart(:url => url, :post => Knjappserver.convert_fcgi_post(cgi.params),
|
106
106
|
:default_headers => headers,
|
107
107
|
:cookies => false,
|
108
108
|
:on_content => proc{|line|
|
@@ -112,7 +112,7 @@ begin
|
|
112
112
|
})
|
113
113
|
elsif cgi.request_method == "POST"
|
114
114
|
count = 0
|
115
|
-
http.post(url, Knjappserver.convert_fcgi_post(cgi.params),
|
115
|
+
http.post(:url => url, :post => Knjappserver.convert_fcgi_post(cgi.params),
|
116
116
|
:default_headers => headers,
|
117
117
|
:cookies => false,
|
118
118
|
:on_content => proc{|line|
|
@@ -34,7 +34,7 @@ class Knjappserver
|
|
34
34
|
knjappserver.start
|
35
35
|
|
36
36
|
port = knjappserver.port
|
37
|
-
http =
|
37
|
+
http = Http2.new(:host => "localhost", :port => port)
|
38
38
|
|
39
39
|
return [knjappserver, http]
|
40
40
|
end
|
@@ -94,7 +94,7 @@ FCGI.each_cgi do |cgi|
|
|
94
94
|
|
95
95
|
if cgi.request_method == "POST" and cgi.content_type.to_s.downcase.index("multipart/form-data") != nil
|
96
96
|
count = 0
|
97
|
-
http.post_multipart(url, Knjappserver.convert_fcgi_post(cgi.params),
|
97
|
+
http.post_multipart(:url => url, :post => Knjappserver.convert_fcgi_post(cgi.params),
|
98
98
|
:default_headers => headers,
|
99
99
|
:cookies => false,
|
100
100
|
:on_content => proc{|line|
|
@@ -104,7 +104,7 @@ FCGI.each_cgi do |cgi|
|
|
104
104
|
})
|
105
105
|
elsif cgi.request_method == "POST"
|
106
106
|
count = 0
|
107
|
-
http.post(url, Knjappserver.convert_fcgi_post(cgi.params),
|
107
|
+
http.post(:url => url, :post => Knjappserver.convert_fcgi_post(cgi.params),
|
108
108
|
:default_headers => headers,
|
109
109
|
:cookies => false,
|
110
110
|
:on_content => proc{|line|
|
@@ -114,7 +114,7 @@ FCGI.each_cgi do |cgi|
|
|
114
114
|
})
|
115
115
|
else
|
116
116
|
count = 0
|
117
|
-
http.get(url,
|
117
|
+
http.get(:url => url,
|
118
118
|
:default_headers => headers,
|
119
119
|
:cookies => false,
|
120
120
|
:on_content => proc{|line|
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: knjappserver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.28
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Kasper Johansen
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-07-
|
13
|
+
date: 2012-07-14 00:00:00 +02:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -58,19 +58,41 @@ dependencies:
|
|
58
58
|
prerelease: false
|
59
59
|
version_requirements: *id004
|
60
60
|
- !ruby/object:Gem::Dependency
|
61
|
-
name:
|
61
|
+
name: datet
|
62
62
|
requirement: &id005 !ruby/object:Gem::Requirement
|
63
63
|
none: false
|
64
64
|
requirements:
|
65
65
|
- - ">="
|
66
66
|
- !ruby/object:Gem::Version
|
67
67
|
version: "0"
|
68
|
-
type: :
|
68
|
+
type: :runtime
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: *id005
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
|
-
name:
|
72
|
+
name: http2
|
73
73
|
requirement: &id006 !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: "0"
|
79
|
+
type: :runtime
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: *id006
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: json
|
84
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: "0"
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: *id007
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: rspec
|
95
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
74
96
|
none: false
|
75
97
|
requirements:
|
76
98
|
- - ~>
|
@@ -78,10 +100,10 @@ dependencies:
|
|
78
100
|
version: 2.3.0
|
79
101
|
type: :development
|
80
102
|
prerelease: false
|
81
|
-
version_requirements: *
|
103
|
+
version_requirements: *id008
|
82
104
|
- !ruby/object:Gem::Dependency
|
83
105
|
name: bundler
|
84
|
-
requirement: &
|
106
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
85
107
|
none: false
|
86
108
|
requirements:
|
87
109
|
- - ">="
|
@@ -89,10 +111,10 @@ dependencies:
|
|
89
111
|
version: 1.0.0
|
90
112
|
type: :development
|
91
113
|
prerelease: false
|
92
|
-
version_requirements: *
|
114
|
+
version_requirements: *id009
|
93
115
|
- !ruby/object:Gem::Dependency
|
94
116
|
name: jeweler
|
95
|
-
requirement: &
|
117
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
96
118
|
none: false
|
97
119
|
requirements:
|
98
120
|
- - ~>
|
@@ -100,10 +122,10 @@ dependencies:
|
|
100
122
|
version: 1.6.3
|
101
123
|
type: :development
|
102
124
|
prerelease: false
|
103
|
-
version_requirements: *
|
125
|
+
version_requirements: *id010
|
104
126
|
- !ruby/object:Gem::Dependency
|
105
127
|
name: sqlite3
|
106
|
-
requirement: &
|
128
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
107
129
|
none: false
|
108
130
|
requirements:
|
109
131
|
- - ">="
|
@@ -111,7 +133,7 @@ dependencies:
|
|
111
133
|
version: "0"
|
112
134
|
type: :development
|
113
135
|
prerelease: false
|
114
|
-
version_requirements: *
|
136
|
+
version_requirements: *id011
|
115
137
|
description: Which supports a lot of undocumented stuff.
|
116
138
|
email: k@spernj.org
|
117
139
|
executables:
|
@@ -208,7 +230,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
208
230
|
requirements:
|
209
231
|
- - ">="
|
210
232
|
- !ruby/object:Gem::Version
|
211
|
-
hash: -
|
233
|
+
hash: -3350207244681983238
|
212
234
|
segments:
|
213
235
|
- 0
|
214
236
|
version: "0"
|