saxon-xslt 0.2.0.1-java → 0.5.0-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cfa11992486ed13c2359031da17082e29520754e
4
+ data.tar.gz: ca8e42087c7b82f890e8caff64dadb42d7e46f0d
5
+ SHA512:
6
+ metadata.gz: 0246341e380043c327f6de92383073213efdbf018abee0b0a39af92845d0f7462df6fedc1fd7f43fe2cae50234377aeb422315ea0861b6310631745c2a199b78
7
+ data.tar.gz: f7fd284b2d4a162173dd854000e35b00e245d42c1eecc1ebfef4a2d1c713a307960c9ce7fbb792e9d7f04efe40ad7195efe82ca0909d049e7bd54f160d390851
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -1 +1 @@
1
- jruby-1.7.4
1
+ jruby-1.7.13
data/README.md CHANGED
@@ -26,7 +26,7 @@ Or install it yourself as:
26
26
 
27
27
  $ gem install saxon-xslt
28
28
 
29
- ## Usage
29
+ ## Simple usage
30
30
 
31
31
  ```ruby
32
32
  require 'saxon-xslt'
@@ -35,6 +35,40 @@ input = Saxon.XML(File.open('/path/to/your.xml'))
35
35
  output = transformer.transform(input)
36
36
  ```
37
37
 
38
+ ## Saxon version
39
+ `saxon-xslt` 0.5 includes Saxon HE 9.5.1.7
40
+
41
+ ## Differences between Saxon and Nokogiri
42
+
43
+ Saxon uses a `Processor` class as its central object: it holds configuration information and acts as a Factory for creating documents or XSLT stylesheet compilers. Unless you need to tweak the config you don't need to worry about this – `saxon-xslt` creates a shared instance behind the scenes when you call `Saxon.XSLT` or `Saxon.XML`. If you need to change the configuration you can create your own instance of `Saxon::Processor` and pass it an open `File` pointing at a Saxon configuration file. (See http://www.saxonica.com/documentation/index.html#!configuration/configuration-file for details of the configuration file.) Once you have a `Saxon::Processor` instance you can call the `XML` and `XSLT` methods on it directly:
44
+
45
+ ```ruby
46
+ require 'saxon-xslt'
47
+ processor = Saxon::Processor.new(File.open('/path/to/config.xml'))
48
+ transformer = processor.XSLT(File.open('/path/to/your.xsl'))
49
+ input = processor.XML(File.open('/path/to/your.xml'))
50
+ output = transformer.transform(input)
51
+ ```
52
+
53
+ ### System IDs
54
+ XML has this idea of 'Public' and 'System' identifiers for documents. The public ID is a kind of abstract name and the system ID is a URI, for example:
55
+
56
+ ```xml
57
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
58
+ "http://www.w3.org/TR/html4/loose.dtd">
59
+ ```
60
+
61
+ There the Public ID is `-//W3C//DTD HTML 4.01 Transitional//EN` and the System ID is `http://www.w3.org/TR/html4/loose.dtd`. An XML or XSLT processor uses the System ID as a base URI for resolving linked objects, e.g. `<xsl:import>` or `<xsl:include>` calls with relative URIs.
62
+
63
+ With Nokogiri the System ID for a document is inferred from its file path, if you hand in a `File` object to `Nokogiri::XML`. With `saxon-xslt` you can also explicitly set the System ID:
64
+
65
+ ```ruby
66
+ xslt = Saxon.XSLT("<xsl:stylesheet>...</xsl:stylesheet>",
67
+ system_id: "/path/to/resources/file.xsl")
68
+ ```
69
+
70
+ So, if you have other XSLT stylesheets in `/path/to/resources/` then your dynamically generated XSLT can refer to them with import statements like `<xsl:import href="other_stylesheet.xsl"/>`.
71
+
38
72
  ## Contributing
39
73
 
40
74
  1. Fork it
@@ -1,23 +1,65 @@
1
1
  require 'saxon/s9api'
2
+ require 'saxon/source_helper'
2
3
  require 'saxon/xslt'
3
4
  require 'saxon/xml'
4
5
 
5
6
  module Saxon
7
+ # Saxon::Processor wraps the S9API::Processor object. This is the object
8
+ # responsible for creating an XSLT compiler or an XML Document object.
9
+ #
10
+ # The Processor is threadsafe, and can be shared between threads. But, most
11
+ # importantly XSLT or XML objects created by a Processor can only be used
12
+ # with other XSLT or XML objects created by the same Processor instance.
6
13
  class Processor
14
+ # Provides a processor with default configuration. Essentially a singleton
15
+ # instance
16
+ # @return [Saxon::Processor]
7
17
  def self.default
8
18
  @processor ||= new
9
19
  end
10
20
 
11
- def initialize
12
- @processor = S9API::Processor.new(false)
21
+ # @param config [File, String, IO] an open File, or string,
22
+ # containing a Saxon configuration file
23
+ # @return [Saxon::Processor]
24
+ def self.create(config = nil)
25
+ licensed_or_config_source = false
26
+ if config
27
+ licensed_or_config_source = Saxon::SourceHelper.to_stream_source(config)
28
+ end
29
+ s9_processor = S9API::Processor.new(licensed_or_config_source)
30
+ new(s9_processor)
13
31
  end
14
32
 
15
- def XSLT(*args)
16
- Saxon::XSLT::Stylesheet.new(@processor, *args)
33
+ # @param [net.sf.saxon.s9api.Processor] s9_processor The Saxon Processor
34
+ # instance to wrap
35
+ def initialize(s9_processor)
36
+ @s9_processor = s9_processor
17
37
  end
18
38
 
19
- def XML(*args)
20
- Saxon::XML::Document.new(@processor, *args)
39
+ # @param input [File, IO, String] the input XSLT file
40
+ # @param opts [Hash] options for the XSLT
41
+ # @return [Saxon::XSLT::Stylesheet] the new XSLT Stylesheet
42
+ def XSLT(input, opts = {})
43
+ Saxon::XSLT::Stylesheet.parse(self, input, opts)
44
+ end
45
+
46
+ # @param input [File, IO, String] the input XML file
47
+ # @param opts [Hash] options for the XML file
48
+ # @return [Saxon::XML::Document] the new XML Document
49
+ def XML(input, opts = {})
50
+ Saxon::XML::Document.parse(self, input, opts)
51
+ end
52
+
53
+ # @return [net.sf.saxon.s9api.Processor] The underlying Saxon processor
54
+ def to_java
55
+ @s9_processor
56
+ end
57
+
58
+ # compare equal if the underlying java processor is the same instance for
59
+ # self and other
60
+ # @param other object to compare against
61
+ def ==(other)
62
+ other.to_java === to_java
21
63
  end
22
64
  end
23
65
  end
@@ -2,9 +2,8 @@ require 'java'
2
2
  $CLASSPATH << File.expand_path('../../../vendor/saxonica/saxon9he.jar', __FILE__)
3
3
  $CLASSPATH << File.expand_path('../../../vendor/saxonica/saxon9-unpack.jar', __FILE__)
4
4
 
5
- java_import javax.xml.transform.stream.StreamSource
6
-
7
5
  module Saxon
6
+ # Puts the Saxon Java classes into a sensible namespace
8
7
  module S9API
9
8
  java_import 'net.sf.saxon.s9api.Processor'
10
9
  java_import 'net.sf.saxon.s9api.XdmDestination'
@@ -0,0 +1,44 @@
1
+ java_import javax.xml.transform.stream.StreamSource
2
+
3
+ module Saxon
4
+ # Helper methods for converting Ruby File, IO, Path, or String objects into a
5
+ # Javax StreamSource object for Saxon's Document parser or XSLT compiler to
6
+ # consume
7
+ class SourceHelper
8
+ # Creates a StreamSource from its input
9
+ # @param [File, IO, String] path_io_or_string A File, or IO
10
+ # object representing the input XML file or data, or a String containing
11
+ # the XML
12
+ # @param [Hash] opts
13
+ # @option opts [String] :system_id The System ID of the source - an
14
+ # absolute URI or relative path pointing to the location of the source
15
+ # @return [java.xml.transform.stream.StreamSource] a StreamSource for
16
+ # consuming the input
17
+ def self.to_stream_source(path_io_or_string, opts = {})
18
+ system_id = opts.fetch(:system_id) { to_system_id(path_io_or_string) }
19
+ StreamSource.new(to_inputstream(path_io_or_string), system_id)
20
+ end
21
+
22
+ # Given a File, or IO object which will return either #path or
23
+ # #base_uri, return the #base_uri, if present, or the #path, if present, or
24
+ # nil
25
+ # @param [File, IO, String] path_io_or_string A Path, File, or IO
26
+ # object representing the input XML file or data, or a String containing
27
+ # the XML
28
+ def self.to_system_id(path_io_or_string)
29
+ if path_io_or_string.respond_to?(:base_uri)
30
+ return path_io_or_string.base_uri.to_s
31
+ end
32
+ return path_io_or_string.path if path_io_or_string.respond_to?(:path)
33
+ end
34
+
35
+ # Given a File, IO, or String return a Java InputStream or StringReader
36
+ # @param [File, IO, String] path_io_or_string input to be converted to an
37
+ # input stream
38
+ # @return [java.io.InputStream, java.io.StringReader] the wrapped input
39
+ def self.to_inputstream(path_io_or_string)
40
+ return path_io_or_string.to_inputstream if path_io_or_string.respond_to?(:read)
41
+ return java.io.StringReader.new(path_io_or_string)
42
+ end
43
+ end
44
+ end
@@ -1,21 +1,51 @@
1
1
  require 'saxon/s9api'
2
- require 'saxon/source_helpers'
2
+ require 'saxon/source_helper'
3
3
  require 'saxon/processor'
4
4
 
5
5
  module Saxon
6
- def self.XML(string_or_io)
7
- Saxon::Processor.default.XML(string_or_io)
6
+ # Create an XML Document object using the default processor
7
+ # @param input [File, IO, String] the input XML file
8
+ # @param opts [Hash] options for the XML
9
+ # @return [Saxon::XML::Document]
10
+ def self.XML(input, opts = {})
11
+ Saxon::Processor.default.XML(input, opts)
8
12
  end
9
13
 
10
14
  module XML
15
+ # Parse an XML File or String into a Document object
11
16
  class Document
12
- class << self
13
- include Saxon::SourceHelpers
17
+ # @param [Saxon::Processor] processor The processor object which should
18
+ # be used to build the document
19
+ # @param [String, File, IO] string_or_io The input XML
20
+ # @param [Hash] opts (see Saxon::SourceHelper#to_stream_source)
21
+ # @return [Saxon::XML::Document]
22
+ def self.parse(processor, string_or_io, opts = {})
23
+ builder = processor.to_java.newDocumentBuilder()
24
+ source = SourceHelper.to_stream_source(string_or_io, opts)
25
+ xdm_document = builder.build(source)
26
+ new(xdm_document)
27
+ end
28
+
29
+ # @api private
30
+ def initialize(xdm_document)
31
+ @xdm_document = xdm_document
32
+ end
33
+
34
+ # @return [net.sf.saxon.s9api.XdmNode] return the underlying Saxon
35
+ # document object
36
+ def to_java
37
+ @xdm_document
38
+ end
39
+
40
+ # @return [String] return a simple serialisation of the document
41
+ def to_s
42
+ @xdm_document.to_s
43
+ end
14
44
 
15
- def new(processor, string_or_io)
16
- builder = processor.newDocumentBuilder()
17
- builder.build(to_stream_source(string_or_io))
18
- end
45
+ # @return [Saxon::Processor] return the processor used to create this
46
+ # document
47
+ def processor
48
+ Saxon::Processor.new(@xdm_document.processor)
19
49
  end
20
50
  end
21
51
  end
@@ -1,29 +1,47 @@
1
1
  require 'saxon/s9api'
2
- require 'saxon/source_helpers'
2
+ require 'saxon/source_helper'
3
3
  require 'saxon/processor'
4
4
  require 'saxon/xml'
5
5
 
6
6
  module Saxon
7
- def self.XSLT(string_or_io)
8
- Saxon::Processor.default.XSLT(string_or_io)
7
+ # Create an XSLT Stylesheet object using the default processor
8
+ # @param input [File, IO, String] the input XSLT file
9
+ # @param opts [Hash] options for the XSLT
10
+ # @return [Saxon::XSLT::Stylesheet]
11
+ def self.XSLT(input, opts = {})
12
+ Saxon::Processor.default.XSLT(input, opts)
9
13
  end
10
14
 
11
15
  module XSLT
16
+ # a Stylesheet transforms input (XML) into output
12
17
  class Stylesheet
13
- include Saxon::SourceHelpers
18
+ # @param processor [Saxon::Processor] the Saxon processor object
19
+ # @param string_or_io [File, IO, String] the input XSLT
20
+ # @param opts [Hash] Stylesheet and input options
21
+ # @return [Saxon::XSLT::Stylesheet] the compiled XSLT stylesheet
22
+ def self.parse(processor, string_or_io, opts = {})
23
+ source = processor.XML(string_or_io, opts)
24
+ new(source)
25
+ end
14
26
 
15
- def initialize(processor, string_or_io)
16
- compiler = processor.newXsltCompiler()
17
- @xslt = compiler.compile(to_stream_source(string_or_io))
27
+ # @param [Saxon::XML::Document] source the input XSLT as an XML document
28
+ def initialize(source)
29
+ processor = source.processor
30
+ compiler = processor.to_java.new_xslt_compiler()
31
+ @xslt = compiler.compile(source.to_java.as_source)
18
32
  end
19
33
 
20
- def transform(xdm_node)
34
+ # Transform an input document
35
+ # @param [Saxon::XML::Document] document the XML Document object to
36
+ # transform
37
+ # @return a Saxon::XML::Document object
38
+ def transform(document)
21
39
  output = S9API::XdmDestination.new
22
40
  transformer = @xslt.load
23
- transformer.setInitialContextNode(xdm_node)
41
+ transformer.setInitialContextNode(document.to_java)
24
42
  transformer.setDestination(output)
25
43
  transformer.transform
26
- output.getXdmNode
44
+ Saxon::XML::Document.new(output.getXdmNode)
27
45
  end
28
46
  end
29
47
  end
@@ -1,5 +1,5 @@
1
1
  module Saxon
2
2
  module XSLT
3
- VERSION = "0.2.0.1"
3
+ VERSION = "0.5.0"
4
4
  end
5
5
  end
@@ -8,8 +8,8 @@ Gem::Specification.new do |gem|
8
8
  gem.version = Saxon::XSLT::VERSION
9
9
  gem.authors = ["Matt Patterson"]
10
10
  gem.email = ["matt@reprocessed.org"]
11
- gem.description = %q{Wraps the Saxon 9.4 HE XSLT 2.0 processor so that you can transform XSLT 2 stylesheets in JRuby. Sticks closely to the Nokogiri API}
12
- gem.summary = %q{Saxon 9.4 HE XSLT 2.0 for JRuby with Nokogiri's API}
11
+ gem.description = %q{Wraps the Saxon 9.5 HE XSLT 2.0 processor so that you can transform XSLT 2 stylesheets in JRuby. Sticks closely to the Nokogiri API}
12
+ gem.summary = %q{Saxon 9.5 HE XSLT 2.0 for JRuby with Nokogiri's API}
13
13
  gem.homepage = "https://github.com/fidothe/saxon-xslt"
14
14
  gem.licenses = ["MIT", "MPL-1.0"]
15
15
  gem.platform = 'java'
@@ -19,6 +19,9 @@ Gem::Specification.new do |gem|
19
19
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
20
20
  gem.require_paths = ["lib"]
21
21
 
22
- gem.add_development_dependency('rake', '~> 10.1.0')
23
- gem.add_development_dependency('rspec', '~> 2.14.0')
22
+ gem.add_development_dependency('rake', '~> 10.1')
23
+ gem.add_development_dependency('rspec', '~> 3.0')
24
+ gem.add_development_dependency('vcr', '~> 2.9.2')
25
+ gem.add_development_dependency('webmock', '~> 1.18.0')
26
+ gem.add_development_dependency('yard', '~> 0.8.7')
24
27
  end
@@ -0,0 +1,63 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://example.org/
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - '*/*'
12
+ User-Agent:
13
+ - Ruby
14
+ response:
15
+ status:
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ Accept-Ranges:
20
+ - bytes
21
+ Cache-Control:
22
+ - max-age=604800
23
+ Content-Type:
24
+ - text/html
25
+ Date:
26
+ - Sun, 10 Aug 2014 09:37:13 GMT
27
+ Etag:
28
+ - '"359670651"'
29
+ Expires:
30
+ - Sun, 17 Aug 2014 09:37:13 GMT
31
+ Last-Modified:
32
+ - Fri, 09 Aug 2013 23:54:35 GMT
33
+ Server:
34
+ - ECS (iad/182A)
35
+ X-Cache:
36
+ - HIT
37
+ X-Ec-Custom-Error:
38
+ - '1'
39
+ Content-Length:
40
+ - '1270'
41
+ body:
42
+ encoding: US-ASCII
43
+ string: "<!doctype html>\n<html>\n<head>\n <title>Example Domain</title>\n\
44
+ \n <meta charset=\"utf-8\" />\n <meta http-equiv=\"Content-type\" content=\"\
45
+ text/html; charset=utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,\
46
+ \ initial-scale=1\" />\n <style type=\"text/css\">\n body {\n \
47
+ \ background-color: #f0f0f2;\n margin: 0;\n padding: 0;\n \
48
+ \ font-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial,\
49
+ \ sans-serif;\n \n }\n div {\n width: 600px;\n \
50
+ \ margin: 5em auto;\n padding: 50px;\n background-color: #fff;\n\
51
+ \ border-radius: 1em;\n }\n a:link, a:visited {\n color:\
52
+ \ #38488f;\n text-decoration: none;\n }\n @media (max-width:\
53
+ \ 700px) {\n body {\n background-color: #fff;\n }\n\
54
+ \ div {\n width: auto;\n margin: 0 auto;\n \
55
+ \ border-radius: 0;\n padding: 1em;\n }\n }\n\
56
+ \ </style> \n</head>\n\n<body>\n<div>\n <h1>Example Domain</h1>\n\
57
+ \ <p>This domain is established to be used for illustrative examples in\
58
+ \ documents. You may use this\n domain in examples without prior coordination\
59
+ \ or asking for permission.</p>\n <p><a href=\"http://www.iana.org/domains/example\"\
60
+ >More information...</a></p>\n</div>\n</body>\n</html>\n"
61
+ http_version:
62
+ recorded_at: Sun, 10 Aug 2014 09:37:13 GMT
63
+ recorded_with: VCR 2.9.2
@@ -0,0 +1,63 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://example.org/
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - '*/*'
12
+ User-Agent:
13
+ - Ruby
14
+ response:
15
+ status:
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ Accept-Ranges:
20
+ - bytes
21
+ Cache-Control:
22
+ - max-age=604800
23
+ Content-Type:
24
+ - text/html
25
+ Date:
26
+ - Sun, 10 Aug 2014 09:52:49 GMT
27
+ Etag:
28
+ - '"359670651"'
29
+ Expires:
30
+ - Sun, 17 Aug 2014 09:52:49 GMT
31
+ Last-Modified:
32
+ - Fri, 09 Aug 2013 23:54:35 GMT
33
+ Server:
34
+ - ECS (iad/182A)
35
+ X-Cache:
36
+ - HIT
37
+ X-Ec-Custom-Error:
38
+ - '1'
39
+ Content-Length:
40
+ - '1270'
41
+ body:
42
+ encoding: US-ASCII
43
+ string: "<!doctype html>\n<html>\n<head>\n <title>Example Domain</title>\n\
44
+ \n <meta charset=\"utf-8\" />\n <meta http-equiv=\"Content-type\" content=\"\
45
+ text/html; charset=utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,\
46
+ \ initial-scale=1\" />\n <style type=\"text/css\">\n body {\n \
47
+ \ background-color: #f0f0f2;\n margin: 0;\n padding: 0;\n \
48
+ \ font-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial,\
49
+ \ sans-serif;\n \n }\n div {\n width: 600px;\n \
50
+ \ margin: 5em auto;\n padding: 50px;\n background-color: #fff;\n\
51
+ \ border-radius: 1em;\n }\n a:link, a:visited {\n color:\
52
+ \ #38488f;\n text-decoration: none;\n }\n @media (max-width:\
53
+ \ 700px) {\n body {\n background-color: #fff;\n }\n\
54
+ \ div {\n width: auto;\n margin: 0 auto;\n \
55
+ \ border-radius: 0;\n padding: 1em;\n }\n }\n\
56
+ \ </style> \n</head>\n\n<body>\n<div>\n <h1>Example Domain</h1>\n\
57
+ \ <p>This domain is established to be used for illustrative examples in\
58
+ \ documents. You may use this\n domain in examples without prior coordination\
59
+ \ or asking for permission.</p>\n <p><a href=\"http://www.iana.org/domains/example\"\
60
+ >More information...</a></p>\n</div>\n</body>\n</html>\n"
61
+ http_version:
62
+ recorded_at: Sun, 10 Aug 2014 09:52:49 GMT
63
+ recorded_with: VCR 2.9.2
@@ -0,0 +1,123 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://example.org/
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - '*/*'
12
+ User-Agent:
13
+ - Ruby
14
+ response:
15
+ status:
16
+ code: 200
17
+ message: OK
18
+ headers:
19
+ Accept-Ranges:
20
+ - bytes
21
+ Cache-Control:
22
+ - max-age=604800
23
+ Content-Type:
24
+ - text/html
25
+ Date:
26
+ - Sun, 10 Aug 2014 09:34:50 GMT
27
+ Etag:
28
+ - '"359670651"'
29
+ Expires:
30
+ - Sun, 17 Aug 2014 09:34:50 GMT
31
+ Last-Modified:
32
+ - Fri, 09 Aug 2013 23:54:35 GMT
33
+ Server:
34
+ - ECS (iad/182A)
35
+ X-Cache:
36
+ - HIT
37
+ X-Ec-Custom-Error:
38
+ - '1'
39
+ Content-Length:
40
+ - '1270'
41
+ body:
42
+ encoding: US-ASCII
43
+ string: "<!doctype html>\n<html>\n<head>\n <title>Example Domain</title>\n\
44
+ \n <meta charset=\"utf-8\" />\n <meta http-equiv=\"Content-type\" content=\"\
45
+ text/html; charset=utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,\
46
+ \ initial-scale=1\" />\n <style type=\"text/css\">\n body {\n \
47
+ \ background-color: #f0f0f2;\n margin: 0;\n padding: 0;\n \
48
+ \ font-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial,\
49
+ \ sans-serif;\n \n }\n div {\n width: 600px;\n \
50
+ \ margin: 5em auto;\n padding: 50px;\n background-color: #fff;\n\
51
+ \ border-radius: 1em;\n }\n a:link, a:visited {\n color:\
52
+ \ #38488f;\n text-decoration: none;\n }\n @media (max-width:\
53
+ \ 700px) {\n body {\n background-color: #fff;\n }\n\
54
+ \ div {\n width: auto;\n margin: 0 auto;\n \
55
+ \ border-radius: 0;\n padding: 1em;\n }\n }\n\
56
+ \ </style> \n</head>\n\n<body>\n<div>\n <h1>Example Domain</h1>\n\
57
+ \ <p>This domain is established to be used for illustrative examples in\
58
+ \ documents. You may use this\n domain in examples without prior coordination\
59
+ \ or asking for permission.</p>\n <p><a href=\"http://www.iana.org/domains/example\"\
60
+ >More information...</a></p>\n</div>\n</body>\n</html>\n"
61
+ http_version:
62
+ recorded_at: Sun, 10 Aug 2014 09:34:50 GMT
63
+ - request:
64
+ method: get
65
+ uri: http://example.org/
66
+ body:
67
+ encoding: US-ASCII
68
+ string: ''
69
+ headers:
70
+ Accept:
71
+ - '*/*'
72
+ User-Agent:
73
+ - Ruby
74
+ response:
75
+ status:
76
+ code: 200
77
+ message: OK
78
+ headers:
79
+ Accept-Ranges:
80
+ - bytes
81
+ Cache-Control:
82
+ - max-age=604800
83
+ Content-Type:
84
+ - text/html
85
+ Date:
86
+ - Sun, 10 Aug 2014 09:34:50 GMT
87
+ Etag:
88
+ - '"359670651"'
89
+ Expires:
90
+ - Sun, 17 Aug 2014 09:34:50 GMT
91
+ Last-Modified:
92
+ - Fri, 09 Aug 2013 23:54:35 GMT
93
+ Server:
94
+ - ECS (iad/182A)
95
+ X-Cache:
96
+ - HIT
97
+ X-Ec-Custom-Error:
98
+ - '1'
99
+ Content-Length:
100
+ - '1270'
101
+ body:
102
+ encoding: US-ASCII
103
+ string: "<!doctype html>\n<html>\n<head>\n <title>Example Domain</title>\n\
104
+ \n <meta charset=\"utf-8\" />\n <meta http-equiv=\"Content-type\" content=\"\
105
+ text/html; charset=utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,\
106
+ \ initial-scale=1\" />\n <style type=\"text/css\">\n body {\n \
107
+ \ background-color: #f0f0f2;\n margin: 0;\n padding: 0;\n \
108
+ \ font-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial,\
109
+ \ sans-serif;\n \n }\n div {\n width: 600px;\n \
110
+ \ margin: 5em auto;\n padding: 50px;\n background-color: #fff;\n\
111
+ \ border-radius: 1em;\n }\n a:link, a:visited {\n color:\
112
+ \ #38488f;\n text-decoration: none;\n }\n @media (max-width:\
113
+ \ 700px) {\n body {\n background-color: #fff;\n }\n\
114
+ \ div {\n width: auto;\n margin: 0 auto;\n \
115
+ \ border-radius: 0;\n padding: 1em;\n }\n }\n\
116
+ \ </style> \n</head>\n\n<body>\n<div>\n <h1>Example Domain</h1>\n\
117
+ \ <p>This domain is established to be used for illustrative examples in\
118
+ \ documents. You may use this\n domain in examples without prior coordination\
119
+ \ or asking for permission.</p>\n <p><a href=\"http://www.iana.org/domains/example\"\
120
+ >More information...</a></p>\n</div>\n</body>\n</html>\n"
121
+ http_version:
122
+ recorded_at: Sun, 10 Aug 2014 09:34:50 GMT
123
+ recorded_with: VCR 2.9.2
@@ -0,0 +1,70 @@
1
+ <?xml version="1.0"?><!-- This is an example configuration file. Many of the options included here are defaults,
2
+ and do not need to be specified in a real configuration file. They are provided for
3
+ convenience of editing, so it is easy to set up a configuration file with non-default options.
4
+
5
+ For documentation on the contents of a Saxon configuration file, see
6
+ http://www.saxonica.com/documentation/index/configuration-file.html
7
+ -->
8
+ <configuration edition="HE" xmlns="http://saxon.sf.net/ns/configuration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://saxon.sf.net/ns/configuration config.xsd">
9
+ <global dtdValidation="false"
10
+ dtdValidationRecoverable="true"
11
+ xInclude="false"
12
+ lineNumbering="true"
13
+ treeModel="tinyTree"
14
+ stripSpace="all"
15
+ expandAttributeDefaults="true"
16
+ versionOfXml="1.1"
17
+ preferJaxpParser="true"
18
+ sourceResolver=""
19
+ uriResolver="net.sf.saxon.lib.StandardURIResolver"
20
+ collectionUriResolver="net.sf.saxon.lib.StandardCollectionURIResolver"
21
+ defaultCollection="file:///tmp"
22
+ recognizeUriQueryParameters="true"
23
+ useTypedValueCache="false"
24
+ parser=""
25
+ timing="false"
26
+ traceInstructions="false"
27
+ allowExternalFunctions="true"
28
+ traceExternalFunctions="false"
29
+ optimizationLevel="10"
30
+ traceOptimizerDecisions="false"
31
+ collationUriResolver="net.sf.saxon.lib.StandardCollationURIResolver"
32
+ lazyConstructionMode="false"
33
+ preEvaluateDoc="false"
34
+ serializerFactory=""
35
+ errorListener="net.sf.saxon.lib.StandardErrorListener"
36
+ errorListenerFile=""
37
+ traceListener="net.sf.saxon.trace.XSLTTraceListener"
38
+ traceListenerFile=""
39
+ usePiDisableOutputEscaping="false"
40
+ validationWarnings="true"/>
41
+ <serialization method="xml"
42
+ indent="yes"/>
43
+ <collations>
44
+ <collation uri="http://codepoint/" class="net.sf.saxon.expr.sort.CodepointCollator"/>
45
+ <collation uri="http://www.microsoft.com/collation/caseblind" lang="en" ignore-case="yes"/>
46
+ </collations>
47
+ <localizations defaultLanguage="en" defaultCountry="US">
48
+ <localization lang="de" class="net.sf.saxon.option.local.Numberer_de"/>
49
+ <localization lang="en" class="net.sf.saxon.expr.number.Numberer_en"/>
50
+ </localizations>
51
+ <xslt recoveryPolicy="recoverWithWarnings"
52
+ version="2.0"
53
+ versionWarning="false"
54
+ schemaAware="false"
55
+ errorListener="net.sf.saxon.StandardErrorListener">
56
+ </xslt>
57
+ <xquery version="1.1"
58
+ allowUpdate="false"
59
+ errorListener="net.sf.saxon.StandardErrorListener"
60
+ errorListenerFile=""
61
+ moduleUriResolver="net.sf.saxon.lib.StandardModuleURIResolver"
62
+ inheritNamespaces="true"
63
+ preserveNamespaces="true"
64
+ constructionMode="preserve"
65
+ defaultFunctionNamespace="http://www.w3.org/2005/xpath-functions"
66
+ defaultElementNamespace=""
67
+ preserveBoundarySpace="false"
68
+ requiredContextItemType="document-node()"
69
+ emptyLeast="true"/>
70
+ </configuration>
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
4
+ exclude-result-prefixes="xs"
5
+ version="2.0">
6
+ <xsl:import href="eg.xsl"/>
7
+ </xsl:stylesheet>
@@ -2,14 +2,31 @@ require 'spec_helper'
2
2
  require 'saxon/processor'
3
3
 
4
4
  describe Saxon::Processor do
5
- let(:processor) { Saxon::Processor.new }
6
5
  let(:xsl_file) { File.open(fixture_path('eg.xsl')) }
7
6
 
8
- it "can make a new XSLT instance" do
9
- expect(processor.XSLT(xsl_file)).to respond_to(:transform)
7
+ context "without configuration" do
8
+ let(:processor) { Saxon::Processor.create }
9
+
10
+ it "can make a new XSLT instance" do
11
+ expect(processor.XSLT(xsl_file)).to respond_to(:transform)
12
+ end
13
+
14
+ it "can make a new XML instance" do
15
+ expect(processor.XML(xsl_file)).to be_a(Saxon::XML::Document)
16
+ end
17
+
18
+ it "can return the underlying Saxon Processor" do
19
+ expect(processor.to_java).to respond_to(:new_xslt_compiler)
20
+ end
10
21
  end
11
22
 
12
- it "can make a new XML instance" do
13
- expect(processor.XML(xsl_file)).to respond_to(:getNodeKind)
23
+ context "with a configuration file" do
24
+ it "works, given a valid config XML file" do
25
+ processor = Saxon::Processor.create(File.open(fixture_path('config.xml')))
26
+
27
+ saxon_processor = processor.to_java
28
+ configuration = saxon_processor.underlying_configuration
29
+ expect(configuration.xml_version).to eq(11)
30
+ end
14
31
  end
15
32
  end
@@ -0,0 +1,117 @@
1
+ require 'spec_helper'
2
+ require 'stringio'
3
+ require 'open-uri'
4
+ require 'saxon/source_helper'
5
+
6
+ java_import org.jruby.embed.io.ReaderInputStream
7
+
8
+ describe Saxon::SourceHelper do
9
+ describe "returning a StreamSource" do
10
+ context "for input backed by a StringReader" do
11
+ it "converts a String correctly" do
12
+ input = "Hello mum"
13
+ source = Saxon::SourceHelper.to_stream_source(input)
14
+ stream = ReaderInputStream.new(source.reader)
15
+
16
+ expect(source).to respond_to(:system_id)
17
+ expect(stream.to_io.read).to eq(input)
18
+ end
19
+ end
20
+
21
+ context "for input backed by an InputStream" do
22
+ it "converts a File correctly" do
23
+ path = fixture_path('eg.xml')
24
+ source = Saxon::SourceHelper.to_stream_source(File.open(path))
25
+
26
+ expect(source).to respond_to(:system_id)
27
+ expect(source.input_stream.to_io.read).to eq(File.read(path))
28
+ end
29
+
30
+ it "converts a StringIO correctly" do
31
+ input = "Hello mum"
32
+ source = Saxon::SourceHelper.to_stream_source(StringIO.new(input))
33
+
34
+ expect(source).to respond_to(:system_id)
35
+ expect(source.input_stream.to_io.read).to eq(input)
36
+ end
37
+
38
+ it "converts an open-uri'd File correctly" do
39
+ path = fixture_path('eg.xml')
40
+ uri = "file://#{path}"
41
+ source = Saxon::SourceHelper.to_stream_source(open(uri))
42
+
43
+ expect(source).to respond_to(:system_id)
44
+ expect(source.input_stream.to_io.read).to eq(File.read(path))
45
+ end
46
+
47
+ it "converts an open-uri'd Uri correctly", :vcr do
48
+ uri = "http://example.org/"
49
+ expected = open(uri).read
50
+ source = Saxon::SourceHelper.to_stream_source(open(uri))
51
+
52
+ expect(source).to respond_to(:system_id)
53
+ expect(source.input_stream.to_io.read).to eq(expected)
54
+ end
55
+ end
56
+
57
+ context "StreamSource systemId" do
58
+ context "for inputs where we can't infer the path or URI" do
59
+ it "is set to nil for Strings" do
60
+ input = "Hello mum"
61
+ source = Saxon::SourceHelper.to_stream_source(input)
62
+
63
+ expect(source.system_id).to be(nil)
64
+ end
65
+
66
+ it "is set to nil for StringIOs" do
67
+ input = "Hello mum"
68
+ source = Saxon::SourceHelper.to_stream_source(StringIO.new(input))
69
+
70
+ expect(source.system_id).to be(nil)
71
+ end
72
+
73
+ it "can be set explicitly" do
74
+ input = "Hello mum"
75
+ source = Saxon::SourceHelper.to_stream_source(input,
76
+ system_id: '/path/to/src'
77
+ )
78
+
79
+ expect(source.system_id).to eq('/path/to/src')
80
+ end
81
+ end
82
+
83
+ context "for inputs where we can infer the path or URI" do
84
+ it "is set to a File's path" do
85
+ path = fixture_path('eg.xml')
86
+ source = Saxon::SourceHelper.to_stream_source(File.open(path))
87
+
88
+ expect(source.system_id).to eq(path)
89
+ end
90
+
91
+ it "is set to an open-uri'd File's URI" do
92
+ path = fixture_path('eg.xml')
93
+ uri = "file://#{path}"
94
+ source = Saxon::SourceHelper.to_stream_source(open(uri))
95
+
96
+ expect(source.system_id).to eq(uri)
97
+ end
98
+
99
+ it "is set to an open-uri'd URI's URI", :vcr do
100
+ uri = "http://example.org/"
101
+ source = Saxon::SourceHelper.to_stream_source(open(uri))
102
+
103
+ expect(source.system_id).to eq(uri)
104
+ end
105
+
106
+ it "overrides the inferred system ID if set explicitly", :vcr do
107
+ uri = "http://example.org/"
108
+ source = Saxon::SourceHelper.to_stream_source(open(uri),
109
+ system_id: '/path/to/src'
110
+ )
111
+
112
+ expect(source.system_id).to eq('/path/to/src')
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -1,21 +1,56 @@
1
1
  require 'spec_helper'
2
2
  require 'saxon/xml'
3
3
 
4
+ java_import 'net.sf.saxon.s9api.XdmNodeKind'
5
+ java_import 'net.sf.saxon.s9api.XdmNode'
6
+
4
7
  describe Saxon::XML do
8
+ let(:processor) { Saxon::Processor.create }
9
+
5
10
  context "parsing a document" do
11
+ it "returns a Document (wrapper) object" do
12
+ doc = processor.XML('<input/>')
13
+ expect(doc.class).to be(Saxon::XML::Document)
14
+ end
15
+
16
+ it "makes the underlying Saxon XDM document available" do
17
+ doc = processor.XML('<input/>')
18
+ expect(doc.to_java.class).to be(XdmNode)
19
+ end
20
+
6
21
  it "can parse a document from a File object" do
7
- expect(Saxon.XML(File.open(fixture_path('eg.xml')))).to respond_to(:getNodeKind)
22
+ doc = processor.XML(File.open(fixture_path('eg.xml')))
23
+ expect(doc.to_java.node_kind).to eq(XdmNodeKind::DOCUMENT)
8
24
  end
9
25
 
10
26
  it "can parse a document from a string" do
11
27
  xml = File.read(fixture_path('eg.xml'))
12
- expect(Saxon.XML(xml)).to respond_to(:getNodeKind)
28
+ doc = processor.XML(xml)
29
+ expect(doc.to_java.node_kind).to eq(XdmNodeKind::DOCUMENT)
13
30
  end
14
31
 
15
32
  it "can parse a document from an IO object" do
16
33
  xml = File.read(fixture_path('eg.xml'))
17
34
  io = StringIO.new(xml)
18
- expect(Saxon.XML(io)).to respond_to(:getNodeKind)
35
+ doc = processor.XML(io)
36
+ expect(doc.to_java.node_kind).to eq(XdmNodeKind::DOCUMENT)
37
+ end
38
+
39
+ it "can set the system ID of a parsed document" do
40
+ xml = File.read(fixture_path('eg.xml'))
41
+ doc = processor.XML(xml, system_id: 'http://example.org/')
42
+
43
+ expect(doc.to_java.document_uri.to_s).to eq('http://example.org/')
19
44
  end
20
45
  end
46
+
47
+ it "can produce a simple serialisation of its content" do
48
+ doc = processor.XML('<input/>')
49
+ expect(doc.to_s.strip).to eq('<input/>')
50
+ end
51
+
52
+ it "can return the Saxon::Processor it was created with" do
53
+ doc = processor.XML('<input/>')
54
+ expect(doc.processor).to eq(processor)
55
+ end
21
56
  end
@@ -3,30 +3,47 @@ require 'saxon-xslt'
3
3
  require 'stringio'
4
4
 
5
5
  describe Saxon::XSLT do
6
+ let(:processor) { Saxon::Processor.create }
7
+
6
8
  context "compiling the stylesheet" do
7
9
  it "can compile a stylesheet from a File object" do
8
- expect(Saxon.XSLT(File.open(fixture_path('eg.xsl')))).to respond_to(:transform)
10
+ expect(processor.XSLT(File.open(fixture_path('eg.xsl')))).to respond_to(:transform)
9
11
  end
10
12
 
11
13
  it "can compile a stylesheet from a string" do
12
14
  xsl = File.read(fixture_path('eg.xsl'))
13
- expect(Saxon.XSLT(xsl)).to respond_to(:transform)
15
+ expect(processor.XSLT(xsl)).to respond_to(:transform)
14
16
  end
15
17
 
16
18
  it "can compile a stylesheet from an IO object" do
17
19
  xsl = File.read(fixture_path('eg.xsl'))
18
20
  io = StringIO.new(xsl)
19
- expect(Saxon.XSLT(io)).to respond_to(:transform)
21
+ expect(processor.XSLT(io)).to respond_to(:transform)
22
+ end
23
+
24
+ it "can set the system ID of the Stylesheet correctly" do
25
+ xml = File.read(fixture_path('simple-xsl-import.xsl'))
26
+ xslt = processor.XSLT(xml, system_id: fixture_path('samedir.xsl'))
27
+
28
+ # We test this by using an XSL which calls xsl:import with a relative path
29
+ # The relative path breaks unless the system ID is correctly set
30
+ expect(xslt).to respond_to(:transform)
31
+ end
32
+
33
+ it "can compile a stylesheet from a Saxon::XML::Document" do
34
+ input = processor.XML(File.open(fixture_path('eg.xsl')))
35
+ xslt = Saxon::XSLT::Stylesheet.new(input)
36
+ expect(xslt).to respond_to(:transform)
20
37
  end
21
38
  end
22
39
 
23
40
  context "transforming a document" do
24
41
  context "emitting a Document object as the result" do
25
- let(:xsl) { Saxon.XSLT(File.open(fixture_path('eg.xsl'))) }
26
- let(:xml) { Saxon.XML(File.open(fixture_path('eg.xml'))) }
42
+ let(:xsl) { processor.XSLT(File.open(fixture_path('eg.xsl'))) }
43
+ let(:xml) { processor.XML(File.open(fixture_path('eg.xml'))) }
27
44
 
28
45
  it "takes a Document object as input for a transformation" do
29
- expect(xsl.transform(xml)).to respond_to(:getNodeKind)
46
+ expect { xsl.transform(xml) }.not_to raise_error
30
47
  end
31
48
 
32
49
  context "the transform result" do
@@ -43,3 +60,4 @@ describe Saxon::XSLT do
43
60
  end
44
61
  end
45
62
  end
63
+
@@ -1,9 +1,17 @@
1
+ require 'vcr'
2
+
1
3
  module FixtureHelpers
2
4
  def fixture_path(path)
3
5
  File.expand_path(File.join('../fixtures', path), __FILE__)
4
6
  end
5
7
  end
6
8
 
9
+ VCR.configure do |c|
10
+ c.cassette_library_dir = 'spec/fixtures/cassettes'
11
+ c.hook_into :webmock
12
+ c.configure_rspec_metadata!
13
+ end
14
+
7
15
  RSpec.configure do |c|
8
16
  c.include FixtureHelpers
9
17
  end
Binary file
metadata CHANGED
@@ -1,49 +1,86 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: saxon-xslt
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.2.0.1
4
+ version: 0.5.0
6
5
  platform: java
7
6
  authors:
8
7
  - Matt Patterson
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-09-19 00:00:00.000000000 Z
11
+ date: 2014-08-14 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ~>
17
+ - !ruby/object:Gem::Version
18
+ version: '10.1'
15
19
  name: rake
20
+ prerelease: false
21
+ type: :development
16
22
  version_requirements: !ruby/object:Gem::Requirement
17
23
  requirements:
18
24
  - - ~>
19
25
  - !ruby/object:Gem::Version
20
- version: 10.1.0
21
- none: false
26
+ version: '10.1'
27
+ - !ruby/object:Gem::Dependency
22
28
  requirement: !ruby/object:Gem::Requirement
23
29
  requirements:
24
30
  - - ~>
25
31
  - !ruby/object:Gem::Version
26
- version: 10.1.0
27
- none: false
32
+ version: '3.0'
33
+ name: rspec
28
34
  prerelease: false
29
35
  type: :development
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
30
41
  - !ruby/object:Gem::Dependency
31
- name: rspec
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: 2.9.2
47
+ name: vcr
48
+ prerelease: false
49
+ type: :development
32
50
  version_requirements: !ruby/object:Gem::Requirement
33
51
  requirements:
34
52
  - - ~>
35
53
  - !ruby/object:Gem::Version
36
- version: 2.14.0
37
- none: false
54
+ version: 2.9.2
55
+ - !ruby/object:Gem::Dependency
38
56
  requirement: !ruby/object:Gem::Requirement
39
57
  requirements:
40
58
  - - ~>
41
59
  - !ruby/object:Gem::Version
42
- version: 2.14.0
43
- none: false
60
+ version: 1.18.0
61
+ name: webmock
44
62
  prerelease: false
45
63
  type: :development
46
- description: Wraps the Saxon 9.4 HE XSLT 2.0 processor so that you can transform XSLT 2 stylesheets in JRuby. Sticks closely to the Nokogiri API
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 1.18.0
69
+ - !ruby/object:Gem::Dependency
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ~>
73
+ - !ruby/object:Gem::Version
74
+ version: 0.8.7
75
+ name: yard
76
+ prerelease: false
77
+ type: :development
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 0.8.7
83
+ description: Wraps the Saxon 9.5 HE XSLT 2.0 processor so that you can transform XSLT 2 stylesheets in JRuby. Sticks closely to the Nokogiri API
47
84
  email:
48
85
  - matt@reprocessed.org
49
86
  executables: []
@@ -51,6 +88,7 @@ extensions: []
51
88
  extra_rdoc_files: []
52
89
  files:
53
90
  - .gitignore
91
+ - .rspec
54
92
  - .ruby-version
55
93
  - .travis.yml
56
94
  - Gemfile
@@ -60,23 +98,31 @@ files:
60
98
  - lib/saxon-xslt.rb
61
99
  - lib/saxon/processor.rb
62
100
  - lib/saxon/s9api.rb
63
- - lib/saxon/source_helpers.rb
101
+ - lib/saxon/source_helper.rb
64
102
  - lib/saxon/xml.rb
65
103
  - lib/saxon/xslt.rb
66
104
  - lib/saxon/xslt/version.rb
67
105
  - saxon-xslt.gemspec
106
+ - spec/fixtures/cassettes/Saxon_SourceHelper/returning_a_StreamSource/StreamSource_systemId/for_inputs_where_we_can_infer_the_path_or_URI/is_set_to_an_open-uri_d_URI_s_URI.yml
107
+ - spec/fixtures/cassettes/Saxon_SourceHelper/returning_a_StreamSource/StreamSource_systemId/for_inputs_where_we_can_infer_the_path_or_URI/overrides_the_inferred_system_ID_if_set_explicitly.yml
108
+ - spec/fixtures/cassettes/Saxon_SourceHelper/returning_a_StreamSource/for_input_backed_by_an_InputStream/converts_an_open-uri_d_Uri_correctly.yml
109
+ - spec/fixtures/config.xml
68
110
  - spec/fixtures/eg.xml
69
111
  - spec/fixtures/eg.xsl
112
+ - spec/fixtures/simple-xsl-import.xsl
70
113
  - spec/saxon/processor_spec.rb
114
+ - spec/saxon/source_helper_spec.rb
71
115
  - spec/saxon/xml_spec.rb
72
116
  - spec/saxon/xslt_spec.rb
73
117
  - spec/spec_helper.rb
74
118
  - vendor/saxonica/saxon9-unpack.jar
119
+ - vendor/saxonica/saxon9-xqj.jar
75
120
  - vendor/saxonica/saxon9he.jar
76
121
  homepage: https://github.com/fidothe/saxon-xslt
77
122
  licenses:
78
123
  - MIT
79
124
  - MPL-1.0
125
+ metadata: {}
80
126
  post_install_message:
81
127
  rdoc_options: []
82
128
  require_paths:
@@ -86,23 +132,28 @@ required_ruby_version: !ruby/object:Gem::Requirement
86
132
  - - '>='
87
133
  - !ruby/object:Gem::Version
88
134
  version: '0'
89
- none: false
90
135
  required_rubygems_version: !ruby/object:Gem::Requirement
91
136
  requirements:
92
137
  - - '>='
93
138
  - !ruby/object:Gem::Version
94
139
  version: '0'
95
- none: false
96
140
  requirements: []
97
141
  rubyforge_project:
98
- rubygems_version: 1.8.24
142
+ rubygems_version: 2.1.9
99
143
  signing_key:
100
- specification_version: 3
101
- summary: Saxon 9.4 HE XSLT 2.0 for JRuby with Nokogiri's API
144
+ specification_version: 4
145
+ summary: Saxon 9.5 HE XSLT 2.0 for JRuby with Nokogiri's API
102
146
  test_files:
147
+ - spec/fixtures/cassettes/Saxon_SourceHelper/returning_a_StreamSource/StreamSource_systemId/for_inputs_where_we_can_infer_the_path_or_URI/is_set_to_an_open-uri_d_URI_s_URI.yml
148
+ - spec/fixtures/cassettes/Saxon_SourceHelper/returning_a_StreamSource/StreamSource_systemId/for_inputs_where_we_can_infer_the_path_or_URI/overrides_the_inferred_system_ID_if_set_explicitly.yml
149
+ - spec/fixtures/cassettes/Saxon_SourceHelper/returning_a_StreamSource/for_input_backed_by_an_InputStream/converts_an_open-uri_d_Uri_correctly.yml
150
+ - spec/fixtures/config.xml
103
151
  - spec/fixtures/eg.xml
104
152
  - spec/fixtures/eg.xsl
153
+ - spec/fixtures/simple-xsl-import.xsl
105
154
  - spec/saxon/processor_spec.rb
155
+ - spec/saxon/source_helper_spec.rb
106
156
  - spec/saxon/xml_spec.rb
107
157
  - spec/saxon/xslt_spec.rb
108
158
  - spec/spec_helper.rb
159
+ has_rdoc:
@@ -1,14 +0,0 @@
1
- module Saxon
2
- module SourceHelpers
3
- private
4
-
5
- def to_stream_source(path_io_or_string)
6
- StreamSource.new(to_inputstream(path_io_or_string))
7
- end
8
-
9
- def to_inputstream(path_io_or_string)
10
- return path_io_or_string.to_inputstream if path_io_or_string.respond_to?(:read)
11
- return java.io.StringReader.new(path_io_or_string)
12
- end
13
- end
14
- end