execjs 2.0.2 → 2.1.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.
- checksums.yaml +4 -4
- data/LICENSE +2 -2
- data/README.md +29 -11
- data/lib/execjs/encoding.rb +13 -20
- data/lib/execjs/external_runtime.rb +14 -67
- data/lib/execjs/johnson_runtime.rb +1 -3
- data/lib/execjs/ruby_racer_runtime.rb +1 -3
- data/lib/execjs/runtimes.rb +15 -15
- data/lib/execjs/version.rb +1 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 021a19b46b741b3d85475f23e28ab2fcaa92f7fb
         | 
| 4 | 
            +
              data.tar.gz: 7f284ac676523a23cff15992506f53e4538d0760
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: c77ce889ab7f9e871bc56d22ab505b0d175500b8dfd987fec7ba099b1211bae1d933a3001937f9d9d2285f3bc9bcfae37c8c02670e0af2d89392273b454720c2
         | 
| 7 | 
            +
              data.tar.gz: 59748635e20cbe379fe90e7ab229fa9ac3a563f472ea31ce676e03791b721734a1c30ce092a986ae60d522d38c1242dd7dc397025f70eda85494ca0d76f97d40
         | 
    
        data/LICENSE
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
            -
            Copyright (c)  | 
| 2 | 
            -
            Copyright (c)  | 
| 1 | 
            +
            Copyright (c) 2014 Sam Stephenson
         | 
| 2 | 
            +
            Copyright (c) 2014 Josh Peek
         | 
| 3 3 |  | 
| 4 4 | 
             
            Permission is hereby granted, free of charge, to any person obtaining
         | 
| 5 5 | 
             
            a copy of this software and associated documentation files (the
         | 
    
        data/README.md
    CHANGED
    
    | @@ -17,26 +17,44 @@ ExecJS supports these runtimes: | |
| 17 17 |  | 
| 18 18 | 
             
            A short example:
         | 
| 19 19 |  | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 20 | 
            +
            ``` ruby
         | 
| 21 | 
            +
            require "execjs"
         | 
| 22 | 
            +
            ExecJS.eval "'red yellow blue'.split(' ')"
         | 
| 23 | 
            +
            # => ["red", "yellow", "blue"]
         | 
| 24 | 
            +
            ```
         | 
| 23 25 |  | 
| 24 26 | 
             
            A longer example, demonstrating how to invoke the CoffeeScript compiler:
         | 
| 25 27 |  | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 28 | 
            +
            ``` ruby
         | 
| 29 | 
            +
            require "execjs"
         | 
| 30 | 
            +
            require "open-uri"
         | 
| 31 | 
            +
            source = open("http://coffeescript.org/extras/coffee-script.js").read
         | 
| 29 32 |  | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            +
            context = ExecJS.compile(source)
         | 
| 34 | 
            +
            context.call("CoffeeScript.compile", "square = (x) -> x * x", bare: true)
         | 
| 35 | 
            +
            # => "var square;\nsquare = function(x) {\n  return x * x;\n};"
         | 
| 36 | 
            +
            ```
         | 
| 33 37 |  | 
| 34 38 | 
             
            # Installation
         | 
| 35 39 |  | 
| 36 | 
            -
             | 
| 40 | 
            +
            ```
         | 
| 41 | 
            +
            $ gem install execjs
         | 
| 42 | 
            +
            ```
         | 
| 43 | 
            +
             | 
| 44 | 
            +
             | 
| 45 | 
            +
            # FAQ
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            **Why can't I use CommonJS `require()` inside ExecJS?**
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            ExecJS provides a lowest common denominator interface to any JavaScript runtime.
         | 
| 50 | 
            +
            Use ExecJS when it doesn't matter which JavaScript interpreter your code runs
         | 
| 51 | 
            +
            in. If you want to access the Node API, you should check another library like
         | 
| 52 | 
            +
            [commonjs.rb](https://github.com/cowboyd/commonjs.rb) designed to provide a
         | 
| 53 | 
            +
            consistent interface.
         | 
| 54 | 
            +
             | 
| 37 55 |  | 
| 38 56 | 
             
            # License
         | 
| 39 57 |  | 
| 40 | 
            -
            Copyright (c)  | 
| 58 | 
            +
            Copyright (c) 2014 Sam Stephenson and Josh Peek.
         | 
| 41 59 |  | 
| 42 60 | 
             
            Released under the MIT license. See `LICENSE` for details.
         | 
    
        data/lib/execjs/encoding.rb
    CHANGED
    
    | @@ -1,32 +1,25 @@ | |
| 1 1 | 
             
            module ExecJS
         | 
| 2 2 | 
             
              # Encodes strings as UTF-8
         | 
| 3 3 | 
             
              module Encoding
         | 
| 4 | 
            -
                if  | 
| 5 | 
            -
                   | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
                     | 
| 9 | 
            -
                       | 
| 10 | 
            -
             | 
| 11 | 
            -
                        data.force_encoding('UTF-8')
         | 
| 4 | 
            +
                if RUBY_ENGINE == 'jruby' || RUBY_ENGINE == 'rbx'
         | 
| 5 | 
            +
                  # workaround for jruby bug http://jira.codehaus.org/browse/JRUBY-6588
         | 
| 6 | 
            +
                  # workaround for rbx bug https://github.com/rubinius/rubinius/issues/1729
         | 
| 7 | 
            +
                  def encode(string)
         | 
| 8 | 
            +
                    if string.encoding.name == 'ASCII-8BIT'
         | 
| 9 | 
            +
                      data = string.dup
         | 
| 10 | 
            +
                      data.force_encoding('UTF-8')
         | 
| 12 11 |  | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
                        end
         | 
| 16 | 
            -
                      else
         | 
| 17 | 
            -
                        data = string.encode('UTF-8')
         | 
| 12 | 
            +
                      unless data.valid_encoding?
         | 
| 13 | 
            +
                        raise ::Encoding::UndefinedConversionError, "Could not encode ASCII-8BIT data #{string.dump} as UTF-8"
         | 
| 18 14 | 
             
                      end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
                  else
         | 
| 22 | 
            -
                    def encode(string)
         | 
| 23 | 
            -
                      string.encode('UTF-8')
         | 
| 15 | 
            +
                    else
         | 
| 16 | 
            +
                      data = string.encode('UTF-8')
         | 
| 24 17 | 
             
                    end
         | 
| 18 | 
            +
                    data
         | 
| 25 19 | 
             
                  end
         | 
| 26 20 | 
             
                else
         | 
| 27 | 
            -
                  # Define no-op on 1.8
         | 
| 28 21 | 
             
                  def encode(string)
         | 
| 29 | 
            -
                    string
         | 
| 22 | 
            +
                    string.encode('UTF-8')
         | 
| 30 23 | 
             
                  end
         | 
| 31 24 | 
             
                end
         | 
| 32 25 | 
             
              end
         | 
| @@ -1,4 +1,3 @@ | |
| 1 | 
            -
            require "shellwords"
         | 
| 2 1 | 
             
            require "tempfile"
         | 
| 3 2 | 
             
            require "execjs/runtime"
         | 
| 4 3 |  | 
| @@ -16,7 +15,7 @@ module ExecJS | |
| 16 15 | 
             
                    source = encode(source)
         | 
| 17 16 |  | 
| 18 17 | 
             
                    if /\S/ =~ source
         | 
| 19 | 
            -
                      exec("return eval(#{::JSON.generate("(#{source})", : | 
| 18 | 
            +
                      exec("return eval(#{::JSON.generate("(#{source})", quirks_mode: true)})")
         | 
| 20 19 | 
             
                    end
         | 
| 21 20 | 
             
                  end
         | 
| 22 21 |  | 
| @@ -50,7 +49,7 @@ module ExecJS | |
| 50 49 | 
             
                        end
         | 
| 51 50 | 
             
                        output.sub!('#{encoded_source}') do
         | 
| 52 51 | 
             
                          encoded_source = encode_unicode_codepoints(source)
         | 
| 53 | 
            -
                          ::JSON.generate("(function(){ #{encoded_source} })()", : | 
| 52 | 
            +
                          ::JSON.generate("(function(){ #{encoded_source} })()", quirks_mode: true)
         | 
| 54 53 | 
             
                        end
         | 
| 55 54 | 
             
                        output.sub!('#{json2_source}') do
         | 
| 56 55 | 
             
                          IO.read(ExecJS.root + "/support/json2.js")
         | 
| @@ -59,7 +58,7 @@ module ExecJS | |
| 59 58 | 
             
                    end
         | 
| 60 59 |  | 
| 61 60 | 
             
                    def extract_result(output)
         | 
| 62 | 
            -
                      status, value = output.empty? ? [] : ::JSON.parse(output, : | 
| 61 | 
            +
                      status, value = output.empty? ? [] : ::JSON.parse(output, create_additions: false)
         | 
| 63 62 | 
             
                      if status == "ok"
         | 
| 64 63 | 
             
                        value
         | 
| 65 64 | 
             
                      elsif value =~ /SyntaxError:/
         | 
| @@ -69,19 +68,9 @@ module ExecJS | |
| 69 68 | 
             
                      end
         | 
| 70 69 | 
             
                    end
         | 
| 71 70 |  | 
| 72 | 
            -
                     | 
| 73 | 
            -
                       | 
| 74 | 
            -
                         | 
| 75 | 
            -
                          "\\u%04x" % ch.codepoints.to_a
         | 
| 76 | 
            -
                        end
         | 
| 77 | 
            -
                      end
         | 
| 78 | 
            -
                    else
         | 
| 79 | 
            -
                      def encode_unicode_codepoints(str)
         | 
| 80 | 
            -
                        str.gsub(/([\xC0-\xDF][\x80-\xBF]|
         | 
| 81 | 
            -
                                   [\xE0-\xEF][\x80-\xBF]{2}|
         | 
| 82 | 
            -
                                   [\xF0-\xF7][\x80-\xBF]{3})+/nx) do |ch|
         | 
| 83 | 
            -
                          "\\u%04x" % ch.unpack("U*")
         | 
| 84 | 
            -
                        end
         | 
| 71 | 
            +
                    def encode_unicode_codepoints(str)
         | 
| 72 | 
            +
                      str.gsub(/[\u0080-\uffff]/) do |ch|
         | 
| 73 | 
            +
                        "\\u%04x" % ch.codepoints.to_a
         | 
| 85 74 | 
             
                      end
         | 
| 86 75 | 
             
                    end
         | 
| 87 76 | 
             
                end
         | 
| @@ -92,8 +81,6 @@ module ExecJS | |
| 92 81 | 
             
                  @name        = options[:name]
         | 
| 93 82 | 
             
                  @command     = options[:command]
         | 
| 94 83 | 
             
                  @runner_path = options[:runner_path]
         | 
| 95 | 
            -
                  @test_args   = options[:test_args]
         | 
| 96 | 
            -
                  @test_match  = options[:test_match]
         | 
| 97 84 | 
             
                  @encoding    = options[:encoding]
         | 
| 98 85 | 
             
                  @deprecated  = !!options[:deprecated]
         | 
| 99 86 | 
             
                  @binary      = nil
         | 
| @@ -110,7 +97,7 @@ module ExecJS | |
| 110 97 |  | 
| 111 98 | 
             
                private
         | 
| 112 99 | 
             
                  def binary
         | 
| 113 | 
            -
                    @binary ||=  | 
| 100 | 
            +
                    @binary ||= which(@command)
         | 
| 114 101 | 
             
                  end
         | 
| 115 102 |  | 
| 116 103 | 
             
                  def locate_executable(cmd)
         | 
| @@ -135,7 +122,7 @@ module ExecJS | |
| 135 122 | 
             
                  end
         | 
| 136 123 |  | 
| 137 124 | 
             
                  def exec_runtime(filename)
         | 
| 138 | 
            -
                    output = sh( | 
| 125 | 
            +
                    output = sh(binary.split(' ') + [filename, {err: [:child, :out]}])
         | 
| 139 126 | 
             
                    if $?.success?
         | 
| 140 127 | 
             
                      output
         | 
| 141 128 | 
             
                    else
         | 
| @@ -143,17 +130,6 @@ module ExecJS | |
| 143 130 | 
             
                    end
         | 
| 144 131 | 
             
                  end
         | 
| 145 132 |  | 
| 146 | 
            -
                  def locate_binary
         | 
| 147 | 
            -
                    if binary = which(@command)
         | 
| 148 | 
            -
                      if @test_args
         | 
| 149 | 
            -
                        output = `#{shell_escape(binary, @test_args)} 2>&1`
         | 
| 150 | 
            -
                        binary if output.match(@test_match)
         | 
| 151 | 
            -
                      else
         | 
| 152 | 
            -
                        binary
         | 
| 153 | 
            -
                      end
         | 
| 154 | 
            -
                    end
         | 
| 155 | 
            -
                  end
         | 
| 156 | 
            -
             | 
| 157 133 | 
             
                  def which(command)
         | 
| 158 134 | 
             
                    Array(command).find do |name|
         | 
| 159 135 | 
             
                      name, args = name.split(/\s+/, 2)
         | 
| @@ -165,41 +141,12 @@ module ExecJS | |
| 165 141 | 
             
                    end
         | 
| 166 142 | 
             
                  end
         | 
| 167 143 |  | 
| 168 | 
            -
                   | 
| 169 | 
            -
                     | 
| 170 | 
            -
             | 
| 171 | 
            -
             | 
| 172 | 
            -
             | 
| 173 | 
            -
             | 
| 174 | 
            -
                      output
         | 
| 175 | 
            -
                    end
         | 
| 176 | 
            -
                  else
         | 
| 177 | 
            -
                    require "iconv"
         | 
| 178 | 
            -
             | 
| 179 | 
            -
                    def sh(command)
         | 
| 180 | 
            -
                      output = nil
         | 
| 181 | 
            -
                      IO.popen(command) { |f| output = f.read }
         | 
| 182 | 
            -
             | 
| 183 | 
            -
                      if @encoding
         | 
| 184 | 
            -
                        Iconv.new('UTF-8', @encoding).iconv(output)
         | 
| 185 | 
            -
                      else
         | 
| 186 | 
            -
                        output
         | 
| 187 | 
            -
                      end
         | 
| 188 | 
            -
                    end
         | 
| 189 | 
            -
                  end
         | 
| 190 | 
            -
             | 
| 191 | 
            -
                  if ExecJS.windows?
         | 
| 192 | 
            -
                    def shell_escape(*args)
         | 
| 193 | 
            -
                      # see http://technet.microsoft.com/en-us/library/cc723564.aspx#XSLTsection123121120120
         | 
| 194 | 
            -
                      args.map { |arg|
         | 
| 195 | 
            -
                        arg = %Q("#{arg.gsub('"','""')}") if arg.match(/[&|()<>^ "]/)
         | 
| 196 | 
            -
                        arg
         | 
| 197 | 
            -
                      }.join(" ")
         | 
| 198 | 
            -
                    end
         | 
| 199 | 
            -
                  else
         | 
| 200 | 
            -
                    def shell_escape(*args)
         | 
| 201 | 
            -
                      Shellwords.join(args)
         | 
| 202 | 
            -
                    end
         | 
| 144 | 
            +
                  def sh(command)
         | 
| 145 | 
            +
                    output, options = nil, {}
         | 
| 146 | 
            +
                    options[:external_encoding] = @encoding if @encoding
         | 
| 147 | 
            +
                    options[:internal_encoding] = ::Encoding.default_internal || 'UTF-8'
         | 
| 148 | 
            +
                    IO.popen(command, options) { |f| output = f.read }
         | 
| 149 | 
            +
                    output
         | 
| 203 150 | 
             
                  end
         | 
| 204 151 | 
             
              end
         | 
| 205 152 | 
             
            end
         | 
| @@ -47,9 +47,7 @@ module ExecJS | |
| 47 47 | 
             
                    when function?(value)
         | 
| 48 48 | 
             
                      nil
         | 
| 49 49 | 
             
                    when string?(value)
         | 
| 50 | 
            -
                      value. | 
| 51 | 
            -
                        value.force_encoding('UTF-8') :
         | 
| 52 | 
            -
                        value
         | 
| 50 | 
            +
                      value.force_encoding('UTF-8')
         | 
| 53 51 | 
             
                    when array?(value)
         | 
| 54 52 | 
             
                      value.map { |v| unbox(v) }
         | 
| 55 53 | 
             
                    when object?(value)
         | 
    
        data/lib/execjs/runtimes.rb
    CHANGED
    
    | @@ -19,30 +19,30 @@ module ExecJS | |
| 19 19 | 
             
                Mustang = MustangRuntime.new
         | 
| 20 20 |  | 
| 21 21 | 
             
                Node = ExternalRuntime.new(
         | 
| 22 | 
            -
                  : | 
| 23 | 
            -
                  : | 
| 24 | 
            -
                  : | 
| 25 | 
            -
                  : | 
| 22 | 
            +
                  name:        "Node.js (V8)",
         | 
| 23 | 
            +
                  command:     ["nodejs", "node"],
         | 
| 24 | 
            +
                  runner_path: ExecJS.root + "/support/node_runner.js",
         | 
| 25 | 
            +
                  encoding:    'UTF-8'
         | 
| 26 26 | 
             
                )
         | 
| 27 27 |  | 
| 28 28 | 
             
                JavaScriptCore = ExternalRuntime.new(
         | 
| 29 | 
            -
                  : | 
| 30 | 
            -
                  : | 
| 31 | 
            -
                  : | 
| 29 | 
            +
                  name:        "JavaScriptCore",
         | 
| 30 | 
            +
                  command:     "/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc",
         | 
| 31 | 
            +
                  runner_path: ExecJS.root + "/support/jsc_runner.js"
         | 
| 32 32 | 
             
                )
         | 
| 33 33 |  | 
| 34 34 | 
             
                SpiderMonkey = Spidermonkey = ExternalRuntime.new(
         | 
| 35 | 
            -
                  : | 
| 36 | 
            -
                  : | 
| 37 | 
            -
                  : | 
| 38 | 
            -
                  : | 
| 35 | 
            +
                  name:        "SpiderMonkey",
         | 
| 36 | 
            +
                  command:     "js",
         | 
| 37 | 
            +
                  runner_path: ExecJS.root + "/support/spidermonkey_runner.js",
         | 
| 38 | 
            +
                  deprecated:  true
         | 
| 39 39 | 
             
                )
         | 
| 40 40 |  | 
| 41 41 | 
             
                JScript = ExternalRuntime.new(
         | 
| 42 | 
            -
                  : | 
| 43 | 
            -
                  : | 
| 44 | 
            -
                  : | 
| 45 | 
            -
                  : | 
| 42 | 
            +
                  name:        "JScript",
         | 
| 43 | 
            +
                  command:     "cscript //E:jscript //Nologo //U",
         | 
| 44 | 
            +
                  runner_path: ExecJS.root + "/support/jscript_runner.js",
         | 
| 45 | 
            +
                  encoding:    'UTF-16LE' # CScript with //U returns UTF-16LE
         | 
| 46 46 | 
             
                )
         | 
| 47 47 |  | 
| 48 48 |  | 
    
        data/lib/execjs/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: execjs
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2.0 | 
| 4 | 
            +
              version: 2.1.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Sam Stephenson
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 12 | 
            +
            date: 2014-05-27 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: rake
         |