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
         |