fog-xml 0.0.1.alpha → 0.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/.gitignore +1 -0
- data/.rubocop.yml +20 -0
- data/.travis.yml +21 -0
- data/CONTRIBUTING.md +6 -6
- data/CONTRIBUTORS.md +4 -1
- data/Gemfile +1 -1
- data/Rakefile +9 -0
- data/fog-xml.gemspec +19 -15
- data/gemfiles/Gemfile.1.8.7 +8 -0
- data/gemfiles/Gemfile.1.9.2+ +7 -0
- data/lib/fog/to_hash_document.rb +64 -0
- data/lib/fog/xml.rb +7 -5
- data/lib/fog/xml/connection.rb +5 -4
- data/lib/fog/xml/sax_parser_connection.rb +10 -10
- data/lib/fog/xml/version.rb +1 -1
- data/spec/fog/xml/connection_spec.rb +32 -0
- data/spec/minitest_helper.rb +33 -0
- metadata +78 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce8f9b8d09cf440bc8510dbf67d2cc23d4fcec4b
|
4
|
+
data.tar.gz: 529565cb7aa30250af6877f4fdaec10d6e9f043e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4343f03be19f667da0a02a475976974f4ce0670908c45beb95dfd69a15a5df0dc12999e17e05e0ac1ab0552dd68c53a4776efb27921b877e4aabb696b6685660
|
7
|
+
data.tar.gz: 963c88b5c7326f967f9df6b8280ef8ad9d5e89e46b0ffd269a23a2518aa563c79e2b512a99b8e8cc3532721915ec33a65733e4d3bd590aeef8b0d2a9fb175909
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Metrics/LineLength:
|
2
|
+
Enabled: false
|
3
|
+
|
4
|
+
Style/EachWithObject:
|
5
|
+
Enabled: false
|
6
|
+
|
7
|
+
Style/Encoding:
|
8
|
+
EnforcedStyle: when_needed
|
9
|
+
|
10
|
+
Style/FormatString:
|
11
|
+
Enabled: false
|
12
|
+
|
13
|
+
Style/HashSyntax:
|
14
|
+
EnforcedStyle: hash_rockets
|
15
|
+
|
16
|
+
Style/SignalException:
|
17
|
+
EnforcedStyle: only_raise
|
18
|
+
|
19
|
+
Style/StringLiterals:
|
20
|
+
EnforcedStyle: double_quotes
|
data/.travis.yml
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
matrix:
|
2
|
+
include:
|
3
|
+
- rvm: 1.8.7
|
4
|
+
gemfile: gemfiles/Gemfile.1.8.7
|
5
|
+
- rvm: 1.9.2
|
6
|
+
gemfile: gemfiles/Gemfile.1.9.2+
|
7
|
+
env: COVERAGE=true
|
8
|
+
- rvm: 1.9.3
|
9
|
+
gemfile: gemfiles/Gemfile.1.9.2+
|
10
|
+
env: COVERAGE=true
|
11
|
+
- rvm: 2.0.0
|
12
|
+
gemfile: gemfiles/Gemfile.1.9.2+
|
13
|
+
env: COVERAGE=true
|
14
|
+
- rvm: 2.1.1
|
15
|
+
gemfile: gemfiles/Gemfile.1.9.2+
|
16
|
+
env: COVERAGE=true
|
17
|
+
- rvm: ree
|
18
|
+
gemfile: gemfiles/Gemfile.1.8.7
|
19
|
+
- rvm: jruby
|
20
|
+
gemfile: gemfiles/Gemfile.1.9.2+
|
21
|
+
env: COVERAGE=true
|
data/CONTRIBUTING.md
CHANGED
@@ -5,14 +5,14 @@ New contributors are always welcome, when it doubt please ask questions. We stri
|
|
5
5
|
### Coding
|
6
6
|
|
7
7
|
* Pick a task:
|
8
|
-
* Offer feedback on open [pull requests](https://github.com/
|
9
|
-
* Review open [issues](https://github.com/
|
10
|
-
* [Create an issue](https://github.com/
|
8
|
+
* Offer feedback on open [pull requests](https://github.com/fog/fog-xml/pulls).
|
9
|
+
* Review open [issues](https://github.com/fog/fog-xml/issues) for things to help on.
|
10
|
+
* [Create an issue](https://github.com/fog/fog-xml/issues/new) to start a discussion on additions or features.
|
11
11
|
* Fork the project, add your changes and tests to cover them in a topic branch.
|
12
|
-
* Commit your changes and rebase against `
|
13
|
-
* [Submit a pull request](https://github.com/
|
12
|
+
* Commit your changes and rebase against `fog/fog-xml` to ensure everything is up to date.
|
13
|
+
* [Submit a pull request](https://github.com/fog/fog-xml/compare/)
|
14
14
|
|
15
15
|
### Non-Coding
|
16
16
|
|
17
|
-
* Offer feedback on open [issues](https://github.com/
|
17
|
+
* Offer feedback on open [issues](https://github.com/fog/fog-xml/issues).
|
18
18
|
* Organize or volunteer at events.
|
data/CONTRIBUTORS.md
CHANGED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
data/fog-xml.gemspec
CHANGED
@@ -1,26 +1,30 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path(
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
4
|
+
require "fog/xml/version"
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "fog-xml"
|
8
8
|
spec.version = Fog::Xml::VERSION
|
9
|
-
spec.authors =
|
10
|
-
spec.email =
|
11
|
-
spec.summary =
|
12
|
-
spec.description =
|
13
|
-
number of providers in the 'fog' gem
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
9
|
+
spec.authors = ["Wesley Beary (geemus)", "Paul Thornthwaite (tokengeek)", "The fog team"]
|
10
|
+
spec.email = ["geemus@gmail.com", "tokengeek@gmail.com"]
|
11
|
+
spec.summary = "XML parsing for fog providers"
|
12
|
+
spec.description = "Extraction of the XML parsing tools shared between a
|
13
|
+
number of providers in the 'fog' gem"
|
14
|
+
spec.homepage = "https://github.com/fog/fog-xml"
|
15
|
+
spec.license = "MIT"
|
16
16
|
|
17
17
|
spec.files = `git ls-files -z`.split("\x0")
|
18
|
-
spec.executables = spec.files.grep(
|
19
|
-
spec.test_files = spec.files.grep(
|
18
|
+
spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(/^(test|spec|features)\//)
|
20
20
|
spec.require_paths = %w(lib)
|
21
21
|
|
22
|
-
spec.add_dependency
|
23
|
-
spec.add_dependency
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency
|
22
|
+
spec.add_dependency "fog-core"
|
23
|
+
spec.add_dependency "nokogiri", "~> 1.5", ">= 1.5.11"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
spec.add_development_dependency "minitest"
|
26
|
+
spec.add_development_dependency "turn"
|
27
|
+
spec.add_development_dependency "pry"
|
28
|
+
spec.add_development_dependency "rubocop"
|
29
|
+
spec.add_development_dependency "coveralls" if RUBY_VERSION.to_f >= 1.9
|
26
30
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Fog
|
2
|
+
class ToHashDocument < Nokogiri::XML::SAX::Document
|
3
|
+
def initialize
|
4
|
+
@stack = []
|
5
|
+
end
|
6
|
+
|
7
|
+
def characters(string)
|
8
|
+
@value ||= ""
|
9
|
+
@value << string.strip
|
10
|
+
end
|
11
|
+
|
12
|
+
def end_element(name)
|
13
|
+
last = @stack.pop
|
14
|
+
if last.empty? && @value.empty?
|
15
|
+
@stack.last[name.to_sym] = ""
|
16
|
+
elsif last == { :i_nil => "true" }
|
17
|
+
@stack.last[name.to_sym] = nil
|
18
|
+
elsif !@value.empty?
|
19
|
+
@stack.last[name.to_sym] = @value
|
20
|
+
end
|
21
|
+
@value = ""
|
22
|
+
end
|
23
|
+
|
24
|
+
def body
|
25
|
+
@stack.first
|
26
|
+
end
|
27
|
+
|
28
|
+
def response
|
29
|
+
body
|
30
|
+
end
|
31
|
+
|
32
|
+
def start_element(name, attributes = [])
|
33
|
+
@value = ""
|
34
|
+
parsed_attributes = {}
|
35
|
+
until attributes.empty?
|
36
|
+
if attributes.first.is_a?(Array)
|
37
|
+
key, value = attributes.shift
|
38
|
+
else
|
39
|
+
key, value = attributes.shift, attributes.shift
|
40
|
+
end
|
41
|
+
parsed_attributes[key.gsub(":", "_").to_sym] = value
|
42
|
+
end
|
43
|
+
if @stack.last.is_a?(Array)
|
44
|
+
@stack.last << { name.to_sym => parsed_attributes }
|
45
|
+
else
|
46
|
+
data = if @stack.empty?
|
47
|
+
@stack.push(parsed_attributes)
|
48
|
+
parsed_attributes
|
49
|
+
elsif @stack.last[name.to_sym]
|
50
|
+
unless @stack.last[name.to_sym].is_a?(Array)
|
51
|
+
@stack.last[name.to_sym] = [@stack.last[name.to_sym]]
|
52
|
+
end
|
53
|
+
@stack.last[name.to_sym] << parsed_attributes
|
54
|
+
@stack.last[name.to_sym].last
|
55
|
+
else
|
56
|
+
@stack.last[name.to_sym] = {}
|
57
|
+
@stack.last[name.to_sym].merge!(parsed_attributes)
|
58
|
+
@stack.last[name.to_sym]
|
59
|
+
end
|
60
|
+
@stack.push(data)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/fog/xml.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "fog/xml/version"
|
2
|
+
require "nokogiri"
|
3
3
|
|
4
4
|
module Fog
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
autoload :ToHashDocument, "fog/to_hash_document"
|
6
|
+
|
7
|
+
module XML
|
8
|
+
autoload :SAXParserConnection, "fog/xml/sax_parser_connection"
|
9
|
+
autoload :Connection, "fog/xml/connection"
|
8
10
|
end
|
9
11
|
end
|
data/lib/fog/xml/connection.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
module Fog
|
2
|
-
module
|
2
|
+
module XML
|
3
3
|
class Connection < SAXParserConnection
|
4
|
-
def request(params, &
|
5
|
-
|
4
|
+
def request(params, &_block)
|
5
|
+
parser = params.delete(:parser)
|
6
|
+
if parser
|
6
7
|
super(parser, params)
|
7
8
|
else
|
8
9
|
original_request(params)
|
@@ -10,4 +11,4 @@ module Fog
|
|
10
11
|
end
|
11
12
|
end
|
12
13
|
end
|
13
|
-
end
|
14
|
+
end
|
@@ -1,18 +1,18 @@
|
|
1
|
-
require
|
1
|
+
require "fog/core/connection"
|
2
2
|
|
3
3
|
module Fog
|
4
|
-
module
|
4
|
+
module XML
|
5
5
|
class SAXParserConnection < ::Fog::Core::Connection
|
6
6
|
# Makes a request using the connection using Excon
|
7
7
|
#
|
8
8
|
# @param [Hash] params
|
9
9
|
# @option params [String] :body text to be sent over a socket
|
10
10
|
# @option params [Hash<Symbol, String>] :headers The default headers to supply in a request
|
11
|
-
# @option params [String] :host The destination host
|
12
|
-
# @option params [String] :path appears after
|
11
|
+
# @option params [String] :host The destination host"s reachable DNS name or IP, in the form of a String
|
12
|
+
# @option params [String] :path appears after "scheme://host:port/"
|
13
13
|
# @option params [Fixnum] :port The port on which to connect, to the destination host
|
14
|
-
# @option params [Hash] :query appended to the
|
15
|
-
# @option params [String] :scheme The protocol;
|
14
|
+
# @option params [Hash] :query appended to the "scheme://host:port/path/" in the form of "?key=value"
|
15
|
+
# @option params [String] :scheme The protocol; "https" causes OpenSSL to be used
|
16
16
|
# @option params [Proc] :response_block
|
17
17
|
# @option params [Nokogiri::XML::SAX::Document] :parser
|
18
18
|
#
|
@@ -28,14 +28,14 @@ module Fog
|
|
28
28
|
# Prepare the SAX parser
|
29
29
|
data_stream = Nokogiri::XML::SAX::PushParser.new(parser)
|
30
30
|
response_string = ""
|
31
|
-
params[:response_block] = lambda do |chunk,
|
32
|
-
response_string << chunk if ENV[
|
31
|
+
params[:response_block] = lambda do |chunk, _remaining, _total|
|
32
|
+
response_string << chunk if ENV["DEBUG_RESPONSE"]
|
33
33
|
data_stream << chunk
|
34
34
|
end
|
35
35
|
|
36
36
|
# Make request which read chunks into parser
|
37
37
|
response = @excon.request(params)
|
38
|
-
Fog::Logger.debug "\n#{response_string}" if ENV[
|
38
|
+
Fog::Logger.debug "\n#{response_string}" if ENV["DEBUG_RESPONSE"]
|
39
39
|
|
40
40
|
# Cease parsing and override response.body with parsed data
|
41
41
|
data_stream.finish
|
@@ -44,4 +44,4 @@ module Fog
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
47
|
-
end
|
47
|
+
end
|
data/lib/fog/xml/version.rb
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
require "minitest_helper"
|
2
|
+
|
3
|
+
describe Fog::XML::Connection do
|
4
|
+
before do
|
5
|
+
@connection = Fog::XML::Connection.new("http://localhost")
|
6
|
+
end
|
7
|
+
|
8
|
+
after do
|
9
|
+
Excon.stubs.clear
|
10
|
+
end
|
11
|
+
|
12
|
+
it "responds to #request" do
|
13
|
+
assert_respond_to @connection, :request
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "when request is passed a parser" do
|
17
|
+
it "returns the body after parsing" do
|
18
|
+
@parser = Fog::ToHashDocument.new
|
19
|
+
Excon.stub({}, { :status => 200, :body => "<xml></xml>" })
|
20
|
+
response = @connection.request(:parser => @parser, :mock => true)
|
21
|
+
assert_equal({ :xml => "" }, response.body)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "when request excludes a parser" do
|
26
|
+
it "returns the response body without change" do
|
27
|
+
Excon.stub({}, { :status => 200, :body => "<xml></xml>" })
|
28
|
+
response = @connection.request(:mock => true)
|
29
|
+
assert_equal("<xml></xml>", response.body)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "minitest/spec"
|
2
|
+
require "minitest/autorun"
|
3
|
+
require "turn"
|
4
|
+
require "excon"
|
5
|
+
require "fog/core"
|
6
|
+
|
7
|
+
Turn.config do |c|
|
8
|
+
# use one of output formats:
|
9
|
+
# :outline - turn's original case/test outline mode [default]
|
10
|
+
# :progress - indicates progress with progress bar
|
11
|
+
# :dotted - test/unit's traditional dot-progress mode
|
12
|
+
# :pretty - new pretty reporter
|
13
|
+
# :marshal - dump output as YAML (normal run mode only)
|
14
|
+
# :cue - interactive testing
|
15
|
+
# c.format = :outline
|
16
|
+
# turn on invoke/execute tracing, enable full backtrace
|
17
|
+
c.trace = 20
|
18
|
+
# use humanized test names (works only with :outline format)
|
19
|
+
c.natural = true
|
20
|
+
end
|
21
|
+
|
22
|
+
if ENV["COVERAGE"]
|
23
|
+
require "coveralls"
|
24
|
+
require "simplecov"
|
25
|
+
|
26
|
+
SimpleCov.start do
|
27
|
+
add_filter "/spec/"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
require File.join(File.dirname(__FILE__), "../lib/fog/xml")
|
32
|
+
|
33
|
+
Coveralls.wear! if ENV["COVERAGE"]
|
metadata
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fog-xml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Wesley Beary (geemus)
|
8
|
+
- Paul Thornthwaite (tokengeek)
|
9
|
+
- The fog team
|
8
10
|
autorequire:
|
9
11
|
bindir: bin
|
10
12
|
cert_chain: []
|
11
|
-
date: 2014-
|
13
|
+
date: 2014-09-26 00:00:00.000000000 Z
|
12
14
|
dependencies:
|
13
15
|
- !ruby/object:Gem::Dependency
|
14
16
|
name: fog-core
|
@@ -59,7 +61,63 @@ dependencies:
|
|
59
61
|
- !ruby/object:Gem::Version
|
60
62
|
version: '0'
|
61
63
|
- !ruby/object:Gem::Dependency
|
62
|
-
name:
|
64
|
+
name: minitest
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
- !ruby/object:Gem::Dependency
|
78
|
+
name: turn
|
79
|
+
requirement: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
type: :development
|
85
|
+
prerelease: false
|
86
|
+
version_requirements: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: pry
|
93
|
+
requirement: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
type: :development
|
99
|
+
prerelease: false
|
100
|
+
version_requirements: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
- !ruby/object:Gem::Dependency
|
106
|
+
name: rubocop
|
107
|
+
requirement: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
type: :development
|
113
|
+
prerelease: false
|
114
|
+
version_requirements: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
- !ruby/object:Gem::Dependency
|
120
|
+
name: coveralls
|
63
121
|
requirement: !ruby/object:Gem::Requirement
|
64
122
|
requirements:
|
65
123
|
- - ">="
|
@@ -75,14 +133,18 @@ dependencies:
|
|
75
133
|
description: |-
|
76
134
|
Extraction of the XML parsing tools shared between a
|
77
135
|
number of providers in the 'fog' gem
|
78
|
-
email:
|
136
|
+
email:
|
137
|
+
- geemus@gmail.com
|
138
|
+
- tokengeek@gmail.com
|
79
139
|
executables: []
|
80
140
|
extensions: []
|
81
141
|
extra_rdoc_files: []
|
82
142
|
files:
|
83
143
|
- ".gitignore"
|
144
|
+
- ".rubocop.yml"
|
84
145
|
- ".ruby-gemset"
|
85
146
|
- ".ruby-version"
|
147
|
+
- ".travis.yml"
|
86
148
|
- CONTRIBUTING.md
|
87
149
|
- CONTRIBUTORS.md
|
88
150
|
- Gemfile
|
@@ -90,11 +152,16 @@ files:
|
|
90
152
|
- README.md
|
91
153
|
- Rakefile
|
92
154
|
- fog-xml.gemspec
|
155
|
+
- gemfiles/Gemfile.1.8.7
|
156
|
+
- gemfiles/Gemfile.1.9.2+
|
157
|
+
- lib/fog/to_hash_document.rb
|
93
158
|
- lib/fog/xml.rb
|
94
159
|
- lib/fog/xml/connection.rb
|
95
160
|
- lib/fog/xml/sax_parser_connection.rb
|
96
161
|
- lib/fog/xml/version.rb
|
97
|
-
|
162
|
+
- spec/fog/xml/connection_spec.rb
|
163
|
+
- spec/minitest_helper.rb
|
164
|
+
homepage: https://github.com/fog/fog-xml
|
98
165
|
licenses:
|
99
166
|
- MIT
|
100
167
|
metadata: {}
|
@@ -109,13 +176,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
109
176
|
version: '0'
|
110
177
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
178
|
requirements:
|
112
|
-
- - "
|
179
|
+
- - ">="
|
113
180
|
- !ruby/object:Gem::Version
|
114
|
-
version:
|
181
|
+
version: '0'
|
115
182
|
requirements: []
|
116
183
|
rubyforge_project:
|
117
184
|
rubygems_version: 2.2.2
|
118
185
|
signing_key:
|
119
186
|
specification_version: 4
|
120
187
|
summary: XML parsing for fog providers
|
121
|
-
test_files:
|
188
|
+
test_files:
|
189
|
+
- spec/fog/xml/connection_spec.rb
|
190
|
+
- spec/minitest_helper.rb
|