dynport_tools 0.2.2 → 0.2.3

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/Gemfile CHANGED
@@ -7,6 +7,7 @@ source "http://rubygems.org"
7
7
  # Include everything needed to run rake, tests, features, etc.
8
8
  gem 'nokogiri'
9
9
  gem 'redis'
10
+ gem 'typhoeus'
10
11
 
11
12
  group :development do
12
13
  gem "rspec", "~> 2.3.0"
data/Gemfile.lock CHANGED
@@ -14,6 +14,7 @@ GEM
14
14
  rake
15
15
  linecache (0.46)
16
16
  rbx-require-relative (> 0.0.4)
17
+ mime-types (1.16)
17
18
  nokogiri (1.5.0)
18
19
  rake (0.9.2)
19
20
  rbx-require-relative (0.0.5)
@@ -32,6 +33,9 @@ GEM
32
33
  ruby-debug-base (~> 0.10.4.0)
33
34
  ruby-debug-base (0.10.4)
34
35
  linecache (>= 0.3)
36
+ typhoeus (0.2.4)
37
+ mime-types
38
+ mime-types
35
39
 
36
40
  PLATFORMS
37
41
  ruby
@@ -47,3 +51,4 @@ DEPENDENCIES
47
51
  redis
48
52
  rspec (~> 2.3.0)
49
53
  ruby-debug
54
+ typhoeus
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.2.3
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{dynport_tools}
8
- s.version = "0.2.2"
8
+ s.version = "0.2.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Tobias Schwab"]
@@ -32,15 +32,20 @@ Gem::Specification.new do |s|
32
32
  "bin/xmldiff",
33
33
  "dynport_tools.gemspec",
34
34
  "lib/dynport_tools.rb",
35
+ "lib/dynport_tools/deep_merger.rb",
35
36
  "lib/dynport_tools/differ.rb",
37
+ "lib/dynport_tools/jenkins.rb",
36
38
  "lib/dynport_tools/redis_dumper.rb",
37
39
  "lib/dynport_tools/xml_file.rb",
38
40
  "lib/have_attributes.rb",
41
+ "spec/dynport_tools/deep_merger_spec.rb",
39
42
  "spec/dynport_tools/differ_spec.rb",
43
+ "spec/dynport_tools/jenkins_spec.rb",
40
44
  "spec/dynport_tools/redis_dumper_spec.rb",
41
45
  "spec/dynport_tools/xml_file_spec.rb",
42
46
  "spec/dynport_tools_spec.rb",
43
47
  "spec/fixtures/file_a.xml",
48
+ "spec/fixtures/jenkins_job.xml",
44
49
  "spec/spec_helper.rb",
45
50
  "spec/xml_diff_spec.rb"
46
51
  ]
@@ -56,6 +61,7 @@ Gem::Specification.new do |s|
56
61
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
57
62
  s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
58
63
  s.add_runtime_dependency(%q<redis>, [">= 0"])
64
+ s.add_runtime_dependency(%q<typhoeus>, [">= 0"])
59
65
  s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
60
66
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
61
67
  s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
@@ -67,6 +73,7 @@ Gem::Specification.new do |s|
67
73
  else
68
74
  s.add_dependency(%q<nokogiri>, [">= 0"])
69
75
  s.add_dependency(%q<redis>, [">= 0"])
76
+ s.add_dependency(%q<typhoeus>, [">= 0"])
70
77
  s.add_dependency(%q<rspec>, ["~> 2.3.0"])
71
78
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
72
79
  s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
@@ -79,6 +86,7 @@ Gem::Specification.new do |s|
79
86
  else
80
87
  s.add_dependency(%q<nokogiri>, [">= 0"])
81
88
  s.add_dependency(%q<redis>, [">= 0"])
89
+ s.add_dependency(%q<typhoeus>, [">= 0"])
82
90
  s.add_dependency(%q<rspec>, ["~> 2.3.0"])
83
91
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
84
92
  s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
@@ -0,0 +1,39 @@
1
+ class DynportTools::DeepMerger
2
+ class << self
3
+ def merge(a, b)
4
+ if a.class == b.class
5
+ if a.is_a?(Hash)
6
+ return merge_hashes(a, b)
7
+ elsif a.is_a?(Array)
8
+ return merge_arrays(a, b)
9
+ end
10
+ end
11
+ b
12
+ end
13
+
14
+ def merge_arrays(a, b)
15
+ [a.length, b.length].max.times.map do |i|
16
+ if b.length < i + 1
17
+ a[i]
18
+ elsif a.length < i + 1
19
+ b[i]
20
+ else
21
+ merge(a[i], b[i])
22
+ end
23
+ end
24
+ end
25
+
26
+ def merge_hashes(a, b)
27
+ (a.keys + b.keys).uniq.inject({}) do |hash, key|
28
+ if !a.has_key?(key)
29
+ hash[key] = b[key]
30
+ elsif !b.has_key?(key)
31
+ hash[key] = a[key]
32
+ else
33
+ hash[key] = merge(a[key], b[key])
34
+ end
35
+ hash
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,37 @@
1
+ require "typhoeus"
2
+ require "nokogiri"
3
+
4
+ class DynportTools::Jenkins
5
+ attr_accessor :url
6
+
7
+ def initialize(url = nil)
8
+ self.url = url
9
+ end
10
+
11
+ def hydra
12
+ @hydra ||= Typhoeus::Hydra.new
13
+ end
14
+
15
+ def jobs_hash
16
+ Nokogiri::XML(Typhoeus::Request.get("#{url}/api/xml").body).search("job").inject({}) do |hash, node|
17
+ url = node.at("url").inner_text.strip if node.at("url")
18
+ name = node.at("name").inner_text.strip if node.at("name")
19
+ hash[url] = { :url => url, :name => name }
20
+ hash
21
+ end
22
+ end
23
+
24
+ def job_details
25
+ jobs = {}
26
+ jobs_hash.each do |url, job|
27
+ request = Typhoeus::Request.new("#{url}config.xml")
28
+ request.on_complete do |response|
29
+ xml = Nokogiri::XML(response.body).to_s
30
+ jobs[url] = job.merge(:body => xml, :md5 => Digest::MD5.hexdigest(xml))
31
+ end
32
+ hydra.queue(request)
33
+ end
34
+ hydra.run
35
+ jobs
36
+ end
37
+ end
data/lib/dynport_tools.rb CHANGED
@@ -1,7 +1,4 @@
1
1
  module DynportTools
2
- class << self
3
- def xmldiff(file1, file2)
4
- throw :print_usage
5
- end
6
- end
7
- end
2
+ end
3
+
4
+ %w(deep_merger differ jenkins redis_dumper xml_file).map { |m| require "dynport_tools/#{m}" }
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe DynportTools::DeepMerger do
4
+ it "merges two hashes" do
5
+ DynportTools::DeepMerger.merge({ :a => 1 }, { :b => 2 }).should == { :a => 1, :b => 2 }
6
+ end
7
+
8
+ it "merges two arrays with same number of attributes" do
9
+ DynportTools::DeepMerger.merge([{ :a => 1, :b => 1 }], [{ :a => 2, :c => 3 }]).should == [{ :a => 2, :b => 1, :c => 3 }]
10
+ end
11
+
12
+ it "correctly merges two arrays with the first one being longer" do
13
+ DynportTools::DeepMerger.merge([{ :a => 1, :b => 1 }], []).should == [{ :a => 1, :b => 1 }]
14
+ end
15
+
16
+ it "correctly merges two arrays with the first one being longer" do
17
+ DynportTools::DeepMerger.merge([], [{ :a => 1, :b => 1 }]).should == [{ :a => 1, :b => 1 }]
18
+ end
19
+
20
+ it "merges simple arrays" do
21
+ DynportTools::DeepMerger.merge([1, 2, 3], [3, 4]).should == [3, 4, 3]
22
+ end
23
+
24
+ it "correctly merges two arrays with different numbers and content" do
25
+ DynportTools::DeepMerger.merge([{ :a => 1 }, { :b => 2, :c => 3 }], [{ :b => 2 }, { :c => 2 }, { :d => 1 }]).should == [
26
+ { :a => 1, :b => 2 },
27
+ { :b => 2, :c => 2 },
28
+ { :d => 1 }
29
+ ]
30
+ end
31
+
32
+ it "returns the second argument when types are different" do
33
+ DynportTools::DeepMerger.merge([], "a").should == "a"
34
+ end
35
+
36
+ it "calls merge on each value of two hashes" do
37
+ a = { :a => 1, :b => 2 }
38
+ b = { :b => 1, :c => 2 }
39
+ DynportTools::DeepMerger.merge(a, b).should == { :a => 1, :b => 1, :c => 2 }
40
+ end
41
+
42
+ it "returns b when both have the same type but not array or hash" do
43
+ DynportTools::DeepMerger.merge(1, 2).should == 2
44
+ end
45
+
46
+ describe "#merge_hashes" do
47
+ it "joins both hashes" do
48
+ DynportTools::DeepMerger.merge_hashes({:a => 1}, {:b => 2}).should == { :a => 1, :b => 2 }
49
+ end
50
+
51
+ it "overwrites values from a with values from b" do
52
+ DynportTools::DeepMerger.merge_hashes({:a => 1}, {:a => 2}).should == { :a => 2 }
53
+ end
54
+
55
+ it "merges nested hashes" do
56
+ DynportTools::DeepMerger.merge_hashes({ :nested => { :a1 => 1, :b1 => 1 } }, { :nested => { :a1 => 2, :b2 => 3 }}).should == {
57
+ :nested => { :a1 => 2, :b1 => 1, :b2 => 3 }
58
+ }
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,119 @@
1
+ require 'spec_helper'
2
+
3
+ require "dynport_tools/jenkins"
4
+
5
+ describe "DynportTools::Jenkins" do
6
+ let(:root) { "http://some.url.com:8098" }
7
+ let(:jenkins) { DynportTools::Jenkins.new(root) }
8
+
9
+ describe "#initialize" do
10
+ it "sets the root url" do
11
+ DynportTools::Jenkins.new("some/host").url.should == "some/host"
12
+ end
13
+ end
14
+
15
+ describe "#jobs_hash" do
16
+ let(:body) do
17
+ html =<<-HTML
18
+ <hudson>
19
+ <assignedLabel/>
20
+ <mode>NORMAL</mode>
21
+ <nodeDescription>the master Hudson node</nodeDescription>
22
+ <nodeName/>
23
+ <numExecutors>5</numExecutors>
24
+ <job>
25
+ <name>Job 2</name>
26
+ <url>
27
+ http://hudson.host:8080/job/Job2/
28
+ </url>
29
+ <color>blue</color>
30
+ </job>
31
+ <job>
32
+ <name>Job 1</name>
33
+ <url>
34
+ http://hudson.host:8080/job/Job1/
35
+ </url>
36
+ <color>blue</color>
37
+ </job>
38
+ </hudson>
39
+ HTML
40
+ end
41
+
42
+ let(:response) { double("response", :body => body).as_null_object }
43
+
44
+ before(:each) do
45
+ Typhoeus::Request.stub(:get).and_return response
46
+ end
47
+
48
+ it "fetches the correct url" do
49
+ Typhoeus::Request.should_receive(:get).with("http://some.url.com:8098/api/xml")
50
+ jenkins.jobs_hash
51
+ end
52
+
53
+ it "returns the correct jobs_hash" do
54
+ jobs = jenkins.jobs_hash
55
+ jobs["http://hudson.host:8080/job/Job1/"].should == { :url => "http://hudson.host:8080/job/Job1/", :name => "Job 1"}
56
+ jobs["http://hudson.host:8080/job/Job2/"].should == { :url => "http://hudson.host:8080/job/Job2/", :name => "Job 2"}
57
+ end
58
+ end
59
+
60
+ describe "#job_details" do
61
+ before(:each) do
62
+ jenkins.stub!(:jobs_hash).and_return(
63
+ "http://hudson.host:8080/job/Job1/" => { :url => "http://hudson.host:8080/job/Job1/", :name => "Job 1"},
64
+ "http://hudson.host:8080/job/Job2/" => { :url => "http://hudson.host:8080/job/Job2/", :name => "Job 2"}
65
+ )
66
+ end
67
+
68
+ it "returns a hash with the correct job details and normalizes with nokogiri" do
69
+ response1 = Typhoeus::Response.new(:code => 200, :headers => "", :body => "<root><a>test1</a><b></b></root>")
70
+ response2 = Typhoeus::Response.new(:code => 200, :headers => "", :body => "<root><a>test2</a><b></b></root>")
71
+ jenkins.hydra.stub(:get, "http://hudson.host:8080/job/Job1/config.xml").and_return(response1)
72
+ jenkins.hydra.stub(:get, "http://hudson.host:8080/job/Job2/config.xml").and_return(response2)
73
+ details = jenkins.job_details
74
+ details.should be_an_instance_of(Hash)
75
+ details["http://hudson.host:8080/job/Job2/"].should == {
76
+ :body=>"<?xml version=\"1.0\"?>\n<root>\n <a>test2</a>\n <b/>\n</root>\n",
77
+ :md5=>"b52105fcdd28fe6428df019e121f106a", :name=>"Job 2", :url=>"http://hudson.host:8080/job/Job2/"
78
+ }
79
+ details["http://hudson.host:8080/job/Job1/"].should == {
80
+ :body=>"<?xml version=\"1.0\"?>\n<root>\n <a>test1</a>\n <b/>\n</root>\n",
81
+ :md5=>"14fa3890bea86820f7e45ce7f5a3ada4", :name=>"Job 1", :url=>"http://hudson.host:8080/job/Job1/"
82
+ }
83
+ end
84
+
85
+ it "has a builder" do
86
+ builder = Nokogiri::XML::Builder.new(:encoding => "UTF-8") do |xml|
87
+ xml.project {
88
+ xml.actions
89
+ xml.description
90
+ xml.keepDependencies false
91
+ xml.properties
92
+ xml.scm(:class => "hudson.scm.NullSCM")
93
+ xml.canRoam true
94
+ xml.disabled false
95
+ xml.blockBuildWhenDownstreamBuilding false
96
+ xml.blockBuildWhenUpstreamBuilding false
97
+ xml.triggers(:class => "vector")
98
+ xml.concurrentBuild false
99
+ xml.builders do
100
+ xml.send("hudson.tasks.Shell") do
101
+ xml.command %(#!/bin/sh\nssh some.host "cd /some/path && ./script/runner -e production 'Some.command'")
102
+ end
103
+ end
104
+ xml.publishers
105
+ xml.buildWrappers do
106
+ xml.send("hudson.plugins.locksandlatches.LockWrapper") do
107
+ xml.locks do
108
+ xml.send("hudson.plugins.locksandlatches.LockWrapper_-LockWaitConfig") do
109
+ xml.name "Popularities"
110
+ end
111
+ end
112
+ end
113
+ end
114
+ }
115
+ end
116
+ builder.to_xml.should == Nokogiri::XML(File.read(ROOT.join("spec/fixtures/jenkins_job.xml"))).to_s
117
+ end
118
+ end
119
+ end
@@ -1,12 +1,4 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe "DynportTools" do
4
- describe "#xmldiff" do
5
- it "raises print usage when first file does not exist" do
6
- catch(:print_usage) do
7
- DynportTools.xmldiff(nil, nil)
8
- violated "print_usage should been thrown"
9
- end
10
- end
11
- end
12
4
  end
@@ -0,0 +1,30 @@
1
+ <?xml version='1.0' encoding='UTF-8'?>
2
+ <project>
3
+ <actions/>
4
+ <description></description>
5
+ <keepDependencies>false</keepDependencies>
6
+ <properties/>
7
+ <scm class="hudson.scm.NullSCM"/>
8
+ <canRoam>true</canRoam>
9
+ <disabled>false</disabled>
10
+ <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
11
+ <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
12
+ <triggers class="vector"/>
13
+ <concurrentBuild>false</concurrentBuild>
14
+ <builders>
15
+ <hudson.tasks.Shell>
16
+ <command>#!/bin/sh
17
+ ssh some.host &quot;cd /some/path &amp;&amp; ./script/runner -e production &apos;Some.command&apos;&quot;</command>
18
+ </hudson.tasks.Shell>
19
+ </builders>
20
+ <publishers/>
21
+ <buildWrappers>
22
+ <hudson.plugins.locksandlatches.LockWrapper>
23
+ <locks>
24
+ <hudson.plugins.locksandlatches.LockWrapper_-LockWaitConfig>
25
+ <name>Popularities</name>
26
+ </hudson.plugins.locksandlatches.LockWrapper_-LockWaitConfig>
27
+ </locks>
28
+ </hudson.plugins.locksandlatches.LockWrapper>
29
+ </buildWrappers>
30
+ </project>
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynport_tools
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 2
10
- version: 0.2.2
9
+ - 3
10
+ version: 0.2.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tobias Schwab
@@ -19,8 +19,9 @@ date: 2011-08-17 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- type: :runtime
23
- requirement: &id001 !ruby/object:Gem::Requirement
22
+ name: nokogiri
23
+ prerelease: false
24
+ version_requirements: &id001 !ruby/object:Gem::Requirement
24
25
  none: false
25
26
  requirements:
26
27
  - - ">="
@@ -29,12 +30,12 @@ dependencies:
29
30
  segments:
30
31
  - 0
31
32
  version: "0"
32
- name: nokogiri
33
- version_requirements: *id001
34
- prerelease: false
35
- - !ruby/object:Gem::Dependency
36
33
  type: :runtime
37
- requirement: &id002 !ruby/object:Gem::Requirement
34
+ requirement: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: redis
37
+ prerelease: false
38
+ version_requirements: &id002 !ruby/object:Gem::Requirement
38
39
  none: false
39
40
  requirements:
40
41
  - - ">="
@@ -43,12 +44,26 @@ dependencies:
43
44
  segments:
44
45
  - 0
45
46
  version: "0"
46
- name: redis
47
- version_requirements: *id002
47
+ type: :runtime
48
+ requirement: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: typhoeus
48
51
  prerelease: false
52
+ version_requirements: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :runtime
62
+ requirement: *id003
49
63
  - !ruby/object:Gem::Dependency
50
- type: :development
51
- requirement: &id003 !ruby/object:Gem::Requirement
64
+ name: rspec
65
+ prerelease: false
66
+ version_requirements: &id004 !ruby/object:Gem::Requirement
52
67
  none: false
53
68
  requirements:
54
69
  - - ~>
@@ -59,12 +74,12 @@ dependencies:
59
74
  - 3
60
75
  - 0
61
76
  version: 2.3.0
62
- name: rspec
63
- version_requirements: *id003
64
- prerelease: false
65
- - !ruby/object:Gem::Dependency
66
77
  type: :development
67
- requirement: &id004 !ruby/object:Gem::Requirement
78
+ requirement: *id004
79
+ - !ruby/object:Gem::Dependency
80
+ name: bundler
81
+ prerelease: false
82
+ version_requirements: &id005 !ruby/object:Gem::Requirement
68
83
  none: false
69
84
  requirements:
70
85
  - - ~>
@@ -75,12 +90,12 @@ dependencies:
75
90
  - 0
76
91
  - 0
77
92
  version: 1.0.0
78
- name: bundler
79
- version_requirements: *id004
80
- prerelease: false
81
- - !ruby/object:Gem::Dependency
82
93
  type: :development
83
- requirement: &id005 !ruby/object:Gem::Requirement
94
+ requirement: *id005
95
+ - !ruby/object:Gem::Dependency
96
+ name: jeweler
97
+ prerelease: false
98
+ version_requirements: &id006 !ruby/object:Gem::Requirement
84
99
  none: false
85
100
  requirements:
86
101
  - - ~>
@@ -91,12 +106,12 @@ dependencies:
91
106
  - 6
92
107
  - 4
93
108
  version: 1.6.4
94
- name: jeweler
95
- version_requirements: *id005
96
- prerelease: false
97
- - !ruby/object:Gem::Dependency
98
109
  type: :development
99
- requirement: &id006 !ruby/object:Gem::Requirement
110
+ requirement: *id006
111
+ - !ruby/object:Gem::Dependency
112
+ name: rcov
113
+ prerelease: false
114
+ version_requirements: &id007 !ruby/object:Gem::Requirement
100
115
  none: false
101
116
  requirements:
102
117
  - - ">="
@@ -105,12 +120,12 @@ dependencies:
105
120
  segments:
106
121
  - 0
107
122
  version: "0"
108
- name: rcov
109
- version_requirements: *id006
110
- prerelease: false
111
- - !ruby/object:Gem::Dependency
112
123
  type: :development
113
- requirement: &id007 !ruby/object:Gem::Requirement
124
+ requirement: *id007
125
+ - !ruby/object:Gem::Dependency
126
+ name: ZenTest
127
+ prerelease: false
128
+ version_requirements: &id008 !ruby/object:Gem::Requirement
114
129
  none: false
115
130
  requirements:
116
131
  - - "="
@@ -121,12 +136,12 @@ dependencies:
121
136
  - 5
122
137
  - 0
123
138
  version: 4.5.0
124
- name: ZenTest
125
- version_requirements: *id007
126
- prerelease: false
127
- - !ruby/object:Gem::Dependency
128
139
  type: :development
129
- requirement: &id008 !ruby/object:Gem::Requirement
140
+ requirement: *id008
141
+ - !ruby/object:Gem::Dependency
142
+ name: autotest
143
+ prerelease: false
144
+ version_requirements: &id009 !ruby/object:Gem::Requirement
130
145
  none: false
131
146
  requirements:
132
147
  - - ">="
@@ -135,12 +150,12 @@ dependencies:
135
150
  segments:
136
151
  - 0
137
152
  version: "0"
138
- name: autotest
139
- version_requirements: *id008
140
- prerelease: false
141
- - !ruby/object:Gem::Dependency
142
153
  type: :development
143
- requirement: &id009 !ruby/object:Gem::Requirement
154
+ requirement: *id009
155
+ - !ruby/object:Gem::Dependency
156
+ name: autotest-growl
157
+ prerelease: false
158
+ version_requirements: &id010 !ruby/object:Gem::Requirement
144
159
  none: false
145
160
  requirements:
146
161
  - - ">="
@@ -149,12 +164,12 @@ dependencies:
149
164
  segments:
150
165
  - 0
151
166
  version: "0"
152
- name: autotest-growl
153
- version_requirements: *id009
154
- prerelease: false
155
- - !ruby/object:Gem::Dependency
156
167
  type: :development
157
- requirement: &id010 !ruby/object:Gem::Requirement
168
+ requirement: *id010
169
+ - !ruby/object:Gem::Dependency
170
+ name: ruby-debug
171
+ prerelease: false
172
+ version_requirements: &id011 !ruby/object:Gem::Requirement
158
173
  none: false
159
174
  requirements:
160
175
  - - ">="
@@ -163,9 +178,8 @@ dependencies:
163
178
  segments:
164
179
  - 0
165
180
  version: "0"
166
- name: ruby-debug
167
- version_requirements: *id010
168
- prerelease: false
181
+ type: :development
182
+ requirement: *id011
169
183
  description: Collection of various tools
170
184
  email: tobias.schwab@dynport.de
171
185
  executables:
@@ -191,15 +205,20 @@ files:
191
205
  - bin/xmldiff
192
206
  - dynport_tools.gemspec
193
207
  - lib/dynport_tools.rb
208
+ - lib/dynport_tools/deep_merger.rb
194
209
  - lib/dynport_tools/differ.rb
210
+ - lib/dynport_tools/jenkins.rb
195
211
  - lib/dynport_tools/redis_dumper.rb
196
212
  - lib/dynport_tools/xml_file.rb
197
213
  - lib/have_attributes.rb
214
+ - spec/dynport_tools/deep_merger_spec.rb
198
215
  - spec/dynport_tools/differ_spec.rb
216
+ - spec/dynport_tools/jenkins_spec.rb
199
217
  - spec/dynport_tools/redis_dumper_spec.rb
200
218
  - spec/dynport_tools/xml_file_spec.rb
201
219
  - spec/dynport_tools_spec.rb
202
220
  - spec/fixtures/file_a.xml
221
+ - spec/fixtures/jenkins_job.xml
203
222
  - spec/spec_helper.rb
204
223
  - spec/xml_diff_spec.rb
205
224
  has_rdoc: true