monkeysupport 0.1.2 → 0.2.0
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/Rakefile +4 -5
- data/VERSION +1 -1
- data/ext/output_safety_ext/extconf.rb +5 -0
- data/ext/output_safety_ext/output_safety_ext.c +89 -0
- data/lib/monkeysupport.rb +6 -0
- data/lib/monkeysupport/lru_cache.rb +54 -0
- data/monkeysupport.gemspec +16 -19
- metadata +11 -4
data/Rakefile
CHANGED
@@ -5,15 +5,14 @@ begin
|
|
5
5
|
require 'jeweler'
|
6
6
|
Jeweler::Tasks.new do |gem|
|
7
7
|
gem.name = "monkeysupport"
|
8
|
-
gem.summary =
|
9
|
-
gem.description =
|
8
|
+
gem.summary = "Monkeypatching Rails with C since 2009"
|
9
|
+
gem.description = "MonkeySupport provides C implementations for some of the more intensive string manipulation methods in activesupport."
|
10
10
|
gem.email = "burke@burkelibbey.org"
|
11
11
|
gem.homepage = "http://github.com/burke/monkeysupport"
|
12
12
|
gem.authors = ["Burke Libbey"]
|
13
13
|
gem.files.include '{test,lib,ext}/**/*'
|
14
|
-
gem.extensions = ["ext/monkeysupport_c/extconf.rb"]
|
15
|
-
gem.add_development_dependency "
|
16
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
14
|
+
gem.extensions = ["ext/monkeysupport_c/extconf.rb", "ext/output_safety_ext/extconf.rb"]
|
15
|
+
gem.add_development_dependency "shoulda"
|
17
16
|
end
|
18
17
|
rescue LoadError
|
19
18
|
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
@@ -0,0 +1,89 @@
|
|
1
|
+
#include "stdbool.h"
|
2
|
+
|
3
|
+
#include "ruby.h"
|
4
|
+
#include "ruby/version.h"
|
5
|
+
|
6
|
+
// Use a FL_USER flag for storing html safety information.
|
7
|
+
// fingers crossed here, this is black black magic.
|
8
|
+
#ifdef FL_USER4
|
9
|
+
|
10
|
+
#define HFLAG FL_USER4
|
11
|
+
|
12
|
+
// by default, objects are not safe for html.
|
13
|
+
VALUE obj_html_safe_qmark(VALUE self) { return Qfalse; }
|
14
|
+
|
15
|
+
//fixnums are always safe for html.
|
16
|
+
VALUE fix_html_safe_qmark(VALUE self) { return Qtrue; }
|
17
|
+
|
18
|
+
VALUE // mark a string as safe for html.
|
19
|
+
str_html_safe_bang(VALUE self)
|
20
|
+
{
|
21
|
+
FL_SET(self, HFLAG);
|
22
|
+
return self;
|
23
|
+
}
|
24
|
+
|
25
|
+
VALUE // is this string safe for html?
|
26
|
+
str_html_safe_qmark(VALUE self)
|
27
|
+
{
|
28
|
+
return FL_TEST(self, HFLAG) ? Qtrue : Qfalse;
|
29
|
+
}
|
30
|
+
|
31
|
+
void
|
32
|
+
set_html_safe(VALUE obj, bool val)
|
33
|
+
{
|
34
|
+
if (val) {
|
35
|
+
FL_SET(obj, HFLAG);
|
36
|
+
} else {
|
37
|
+
FL_UNSET(obj, HFLAG);
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
|
42
|
+
VALUE // return a copy of this string, marked as safe for html.
|
43
|
+
str_html_safe(VALUE self)
|
44
|
+
{
|
45
|
+
VALUE other = rb_obj_dup(self);
|
46
|
+
return str_html_safe_bang(other);
|
47
|
+
}
|
48
|
+
|
49
|
+
VALUE
|
50
|
+
str_plus(VALUE self, VALUE other)
|
51
|
+
{
|
52
|
+
VALUE ret;
|
53
|
+
bool safe = ((str_html_safe_qmark(self) == Qtrue) &&
|
54
|
+
(str_html_safe_qmark(other) == Qtrue));
|
55
|
+
|
56
|
+
ret = rb_str_plus(self, other);
|
57
|
+
|
58
|
+
set_html_safe(ret, safe);
|
59
|
+
return ret;
|
60
|
+
}
|
61
|
+
|
62
|
+
VALUE
|
63
|
+
str_concat(VALUE self, VALUE other)
|
64
|
+
{
|
65
|
+
bool safe = ((str_html_safe_qmark(self) == Qtrue) &&
|
66
|
+
(str_html_safe_qmark(other) == Qtrue));
|
67
|
+
|
68
|
+
rb_str_concat(self, other);
|
69
|
+
|
70
|
+
set_html_safe(self, safe);
|
71
|
+
return self;
|
72
|
+
}
|
73
|
+
|
74
|
+
void
|
75
|
+
Init_output_safety_ext()
|
76
|
+
{
|
77
|
+
rb_define_method(rb_cObject, "html_safe?", obj_html_safe_qmark, 0);
|
78
|
+
rb_define_method(rb_cFixnum, "html_safe?", fix_html_safe_qmark, 0);
|
79
|
+
|
80
|
+
rb_define_method(rb_cString, "html_safe", str_html_safe, 0);
|
81
|
+
rb_define_method(rb_cString, "html_safe!", str_html_safe_bang, 0);
|
82
|
+
rb_define_method(rb_cString, "html_safe?", str_html_safe_qmark, 0);
|
83
|
+
rb_define_method(rb_cString, "_rails_html_safe", str_html_safe_qmark, 0);
|
84
|
+
|
85
|
+
rb_define_method(rb_cString, "+", str_plus, 1);
|
86
|
+
rb_define_method(rb_cString, "<<", str_concat, 1);
|
87
|
+
}
|
88
|
+
|
89
|
+
#endif
|
data/lib/monkeysupport.rb
CHANGED
@@ -4,3 +4,9 @@ require 'monkeysupport/c_proxy'
|
|
4
4
|
require 'monkeysupport/memoizable'
|
5
5
|
|
6
6
|
require 'monkeysupport/activesupport/inflector'
|
7
|
+
|
8
|
+
if ["1.8.7", "1.9.1"].include? RUBY_VERSION
|
9
|
+
require 'output_safety_ext'
|
10
|
+
else
|
11
|
+
puts "** MonkeySupport: output_safety module was not designed to work with #{RUBY_VERSION}. Extension not loaded."
|
12
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'pp'
|
2
|
+
|
3
|
+
class LRUCache
|
4
|
+
|
5
|
+
def initialize(size=200, cleanup_threshold=size*2)
|
6
|
+
@size = size
|
7
|
+
@cleanup_threshold = cleanup_threshold
|
8
|
+
|
9
|
+
@cache = {}
|
10
|
+
|
11
|
+
@access = [0]*size
|
12
|
+
|
13
|
+
@counter = 0
|
14
|
+
end
|
15
|
+
|
16
|
+
def []=(key, value)
|
17
|
+
@cache[key] = [Time.now, value]
|
18
|
+
cleanup if @cache.size > @cleanup_threshold
|
19
|
+
end
|
20
|
+
|
21
|
+
def [](key)
|
22
|
+
# @cache[key][0] = @count
|
23
|
+
@cache[key]
|
24
|
+
end
|
25
|
+
|
26
|
+
def cleanup
|
27
|
+
num_delete = @cache.size - @size
|
28
|
+
@cache.sort_by{|k,v|v[0]}[0...num_delete].each do |arr|
|
29
|
+
@cache.delete(arr[0])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def size
|
34
|
+
@cache.size
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
if __FILE__ == $0
|
40
|
+
c = LRUCache.new(2)
|
41
|
+
c[1] = :a
|
42
|
+
puts c.size
|
43
|
+
c[2] = :b
|
44
|
+
puts c.size
|
45
|
+
c[3] = :c
|
46
|
+
puts c.size
|
47
|
+
c[4] = :d
|
48
|
+
puts c.size
|
49
|
+
c[5] = :e
|
50
|
+
puts c.size
|
51
|
+
c[6] = :f
|
52
|
+
puts c.size
|
53
|
+
|
54
|
+
end
|
data/monkeysupport.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
@@ -9,10 +9,10 @@ Gem::Specification.new do |s|
|
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Burke Libbey"]
|
12
|
-
s.date = %q{2009-
|
13
|
-
s.description = %q{MonkeySupport provides C implementations for some of the more intensive string manipulation methods in activesupport.
|
12
|
+
s.date = %q{2009-12-28}
|
13
|
+
s.description = %q{MonkeySupport provides C implementations for some of the more intensive string manipulation methods in activesupport.}
|
14
14
|
s.email = %q{burke@burkelibbey.org}
|
15
|
-
s.extensions = ["ext/monkeysupport_c/extconf.rb"]
|
15
|
+
s.extensions = ["ext/monkeysupport_c/extconf.rb", "ext/output_safety_ext/extconf.rb"]
|
16
16
|
s.extra_rdoc_files = [
|
17
17
|
"LICENSE",
|
18
18
|
"README.rdoc"
|
@@ -25,31 +25,27 @@ Gem::Specification.new do |s|
|
|
25
25
|
"Rakefile",
|
26
26
|
"VERSION",
|
27
27
|
"ext/monkeysupport_c/extconf.rb",
|
28
|
-
"ext/monkeysupport_c/extconf.rb",
|
29
|
-
"ext/monkeysupport_c/src/activesupport_inflector.c",
|
30
28
|
"ext/monkeysupport_c/src/activesupport_inflector.c",
|
31
29
|
"ext/monkeysupport_c/src/activesupport_inflector.h",
|
32
|
-
"ext/monkeysupport_c/src/activesupport_inflector.h",
|
33
30
|
"ext/monkeysupport_c/src/monkeysupport_c.c",
|
34
|
-
"ext/
|
35
|
-
"
|
31
|
+
"ext/output_safety_ext/Makefile",
|
32
|
+
"ext/output_safety_ext/extconf.rb",
|
33
|
+
"ext/output_safety_ext/output_safety_ext.bundle",
|
34
|
+
"ext/output_safety_ext/output_safety_ext.c",
|
35
|
+
"ext/output_safety_ext/output_safety_ext.o",
|
36
36
|
"lib/monkeysupport.rb",
|
37
37
|
"lib/monkeysupport/activesupport/inflector.rb",
|
38
|
-
"lib/monkeysupport/activesupport/inflector.rb",
|
39
|
-
"lib/monkeysupport/c_proxy.rb",
|
40
38
|
"lib/monkeysupport/c_proxy.rb",
|
41
|
-
"lib/monkeysupport/
|
39
|
+
"lib/monkeysupport/lru_cache.rb",
|
42
40
|
"lib/monkeysupport/memoizable.rb",
|
43
41
|
"monkeysupport.gemspec",
|
44
42
|
"test/monkeysupport_test.rb",
|
45
|
-
"test/monkeysupport_test.rb",
|
46
|
-
"test/test_helper.rb",
|
47
43
|
"test/test_helper.rb"
|
48
44
|
]
|
49
45
|
s.homepage = %q{http://github.com/burke/monkeysupport}
|
50
46
|
s.rdoc_options = ["--charset=UTF-8"]
|
51
47
|
s.require_paths = ["lib"]
|
52
|
-
s.rubygems_version = %q{1.3.
|
48
|
+
s.rubygems_version = %q{1.3.5}
|
53
49
|
s.summary = %q{Monkeypatching Rails with C since 2009}
|
54
50
|
s.test_files = [
|
55
51
|
"test/monkeysupport_test.rb",
|
@@ -61,11 +57,12 @@ Gem::Specification.new do |s|
|
|
61
57
|
s.specification_version = 3
|
62
58
|
|
63
59
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
64
|
-
s.add_development_dependency(%q<
|
60
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
65
61
|
else
|
66
|
-
s.add_dependency(%q<
|
62
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
67
63
|
end
|
68
64
|
else
|
69
|
-
s.add_dependency(%q<
|
65
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
70
66
|
end
|
71
67
|
end
|
68
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: monkeysupport
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Burke Libbey
|
@@ -9,11 +9,11 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-12-28 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: shoulda
|
17
17
|
type: :development
|
18
18
|
version_requirement:
|
19
19
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -22,12 +22,13 @@ dependencies:
|
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: "0"
|
24
24
|
version:
|
25
|
-
description: MonkeySupport provides C implementations for some of the more intensive string manipulation methods in activesupport.
|
25
|
+
description: MonkeySupport provides C implementations for some of the more intensive string manipulation methods in activesupport.
|
26
26
|
email: burke@burkelibbey.org
|
27
27
|
executables: []
|
28
28
|
|
29
29
|
extensions:
|
30
30
|
- ext/monkeysupport_c/extconf.rb
|
31
|
+
- ext/output_safety_ext/extconf.rb
|
31
32
|
extra_rdoc_files:
|
32
33
|
- LICENSE
|
33
34
|
- README.rdoc
|
@@ -42,9 +43,15 @@ files:
|
|
42
43
|
- ext/monkeysupport_c/src/activesupport_inflector.c
|
43
44
|
- ext/monkeysupport_c/src/activesupport_inflector.h
|
44
45
|
- ext/monkeysupport_c/src/monkeysupport_c.c
|
46
|
+
- ext/output_safety_ext/Makefile
|
47
|
+
- ext/output_safety_ext/extconf.rb
|
48
|
+
- ext/output_safety_ext/output_safety_ext.bundle
|
49
|
+
- ext/output_safety_ext/output_safety_ext.c
|
50
|
+
- ext/output_safety_ext/output_safety_ext.o
|
45
51
|
- lib/monkeysupport.rb
|
46
52
|
- lib/monkeysupport/activesupport/inflector.rb
|
47
53
|
- lib/monkeysupport/c_proxy.rb
|
54
|
+
- lib/monkeysupport/lru_cache.rb
|
48
55
|
- lib/monkeysupport/memoizable.rb
|
49
56
|
- monkeysupport.gemspec
|
50
57
|
- test/monkeysupport_test.rb
|