rs_service_now 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZWJmYzg5NDk1NTdjMjdkMzBmZmIyYWU2Zjg0YjU5ZjkyMDU1ZTlmMg==
5
+ data.tar.gz: !binary |-
6
+ YjllMTMwMjc2ZmM2ZmI2ZTg2MjRmMjhkYWM1MTk3YjhlZTgyZjkzYQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ NjlkNjAzZTExMDNlNzZmOWQ4ZGI3ZDY5M2M4NWE4NmRlMWU5ZDQyNWZlYjg5
10
+ YjkzNjYzNDAzYTRkM2EzNGNiNGRmODcwMjc1ODE3MGI3NmI3OTY5YWQ4MmVi
11
+ OGY3MDA3NDk4NzJhMTBkMDc5NGI3MzIwZDMyY2QxZDdkMGMxNTc=
12
+ data.tar.gz: !binary |-
13
+ NmQzNzM1OWVjN2JiN2IwZjdkZTU0MDBlMTI3OGZiNzZlODg4OWMyODhjNjM5
14
+ YTMxMjljM2ZmMTRkZmZkNmVkNjQ2M2QzOGNhMjhhYTdiMWJkZGI2Njk0MmU0
15
+ ZjAyNzdhN2JiYWFjNTRiMmRkN2Q3ODM4ODkxYzcwOTA5NWRjNjI=
data/.gitignore CHANGED
@@ -1,14 +1,16 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
- *.bundle
11
- *.so
12
- *.o
13
- *.a
14
- mkmf.log
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ *.gem
15
+ mkmf.log
16
+ /.idea
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in rs_service_now.gemspec
4
- gemspec
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rs_service_now.gemspec
4
+ gemspec
data/README.md CHANGED
@@ -20,17 +20,25 @@ Or install it yourself as:
20
20
 
21
21
  ## Usage
22
22
 
23
+ ```ruby
23
24
  sn = RsServiceNow::Company.new user, password, instance
25
+ ```
24
26
 
25
27
  ### Retrieve
26
- # Get every field from matching records. This is a quick way to retrieve any number of records, 250 at a time.
28
+ Get every field from matching records. This is a quick way to retrieve any number of records, 250 at a time.
27
29
 
28
- # Using an encodedQuery. This can be easily retrieved by conducting a search in Service-Now, right clicking the very end of the search string and selecting "Copy query"
30
+ Using an encodedQuery. This can be easily retrieved by conducting a search in Service-Now, right clicking the very end of the search string and selecting "Copy query"
31
+
32
+ ```ruby
29
33
  sn.request :encoded_query => "active=true"
34
+ ```
30
35
 
31
36
  ### Export
32
- # Retrieve a data export from Service-Now. Should be more efficient than Retrieve as by default it can export 10000 records at a time, instead of 250.
37
+ Retrieve a data export from Service-Now. Should be more efficient than Retrieve as by default it can export 10000 records at a time, instead of 250. This is experimental at the moment that has not been thoroughly tested.
38
+
39
+ ```ruby
33
40
  sn.export :encoded_query => "active=true"
41
+ ```
34
42
 
35
43
  ## Contributing
36
44
 
data/Rakefile CHANGED
@@ -1,2 +1,11 @@
1
- require "bundler/gem_tasks"
2
-
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ desc "Run the tests"
5
+ RSpec::Core::RakeTask.new(:spec) do |t|
6
+ t.rspec_opts = ['--color', '-f d']
7
+ t.pattern = 'spec/*/*_spec.rb'
8
+ end
9
+
10
+
11
+ task :default => [:spec_prep, :spec, :spec_clean]
@@ -1,7 +1,7 @@
1
- require "rs_service_now/version"
2
- require "rs_service_now/record"
3
- require "rs_service_now/company"
4
-
5
- module RsServiceNow
6
-
7
- end
1
+ [ 'version', 'record', 'common', 'company', 'ci' ].each do |file|
2
+ require "rs_service_now/#{file}"
3
+ end
4
+
5
+ module RsServiceNow
6
+
7
+ end
@@ -1,11 +1,3 @@
1
- class RsServiceNow::Ci < RsServiceNow::Record
2
- TABLE = 'cmdb_ci'
3
-
4
- def request encoded_query
5
- self._request TABLE, encoded_query
6
- end
7
-
8
- def export encoded_query, max_export = 10000
9
- self._export TABLE, encoded_query, max_export
10
- end
1
+ class RsServiceNow::Ci < RsServiceNow::Common
2
+ create_methods 'cmdb_ci'
11
3
  end
@@ -0,0 +1,23 @@
1
+ class RsServiceNow::Common < RsServiceNow::Record
2
+ def self.create_methods table
3
+ define_method('get') do |sys_id|
4
+ self._get table, sys_id
5
+ end
6
+
7
+ define_method('export') do |encoded_query, max_export = 10000|
8
+ self._export table, encoded_query, max_export
9
+ end
10
+
11
+ define_method('request') do |encoded_query|
12
+ self._request table, encoded_query
13
+ end
14
+
15
+ define_method('insert') do |parameters|
16
+ self._insert table, parameters
17
+ end
18
+
19
+ define_method('update') do |parameters|
20
+ self._update table, parameters
21
+ end
22
+ end
23
+ end
@@ -1,11 +1,3 @@
1
- class RsServiceNow::Company < RsServiceNow::Record
2
- TABLE = 'core_company'
3
-
4
- def request encoded_query
5
- self._request TABLE, encoded_query
6
- end
7
-
8
- def export encoded_query, max_export = 10000
9
- self._export TABLE, encoded_query, max_export
10
- end
1
+ class RsServiceNow::Company < RsServiceNow::Common
2
+ create_methods 'core_company'
11
3
  end
@@ -4,10 +4,11 @@ require 'active_support/core_ext/hash/conversions'
4
4
 
5
5
  class RsServiceNow::Record
6
6
 
7
- def initialize user, password, instance
7
+ def initialize user, password, instance, proxy = nil
8
8
  @user = user
9
9
  @password = password
10
10
  @url = "https://#{instance}.service-now.com"
11
+ @proxy = proxy
11
12
  end
12
13
 
13
14
  def _request table, encoded_query
@@ -67,12 +68,36 @@ class RsServiceNow::Record
67
68
  response.hash[:envelope][:body][:get_keys_response]
68
69
  end
69
70
 
71
+ def _get table, sys_id
72
+ client = setup_client table
73
+ response = client.call(:get, :message => {:sys_id => sys_id})
74
+ response.hash[:envelope][:body][:get_response]
75
+ end
76
+
70
77
  def setup_client table
71
78
  Savon.client do |globals|
72
79
  globals.wsdl "#{@url}/#{table}.do?WSDL"
73
80
  globals.basic_auth [@user, @password]
74
81
  globals.convert_request_keys_to :none
75
82
  globals.namespace_identifier :u
83
+ if @proxy
84
+ globals.proxy @proxy
85
+ end
86
+ end
87
+ end
88
+
89
+ def _insert table, parameters
90
+ client = setup_client table
91
+ response = client.call(:insert, :message => parameters)
92
+ response.hash[:envelope][:body][:insert_response][:sys_id]
93
+ end
94
+
95
+ def _update table, parameters
96
+ if parameters[:sys_id].nil?
97
+ raise "You must supply the sys_id of the record to update"
76
98
  end
99
+
100
+ client = setup_client table
101
+ client.call(:update, :message => parameters)
77
102
  end
78
103
  end
@@ -1,3 +1,3 @@
1
1
  module RsServiceNow
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -0,0 +1,142 @@
1
+ require 'nokogiri'
2
+
3
+ module ServiceNowHelpers
4
+ def make_multiple_xml start, max_export
5
+ xml_doc = Nokogiri::XML(make_record_xml)
6
+ index_array = (start..(max_export - 1)).to_a
7
+ (index_array.length - 1).times do |num|
8
+ xml_doc.at('core_company').add_next_sibling(xml_doc.at('core_company').dup)
9
+ end
10
+
11
+ xml_doc.xpath('//xml/core_company/sys_id').each_with_index do |id, index|
12
+ id.children = "deadbeefdeadbeefdeadbeefdead#{index_array[index]}"
13
+ end
14
+
15
+ xml_doc.to_xml
16
+ end
17
+
18
+ def make_record_xml
19
+ <<EOF
20
+ <xml>
21
+ <core_company>
22
+ <apple_icon/>
23
+ <banner_image/>
24
+ <banner_text></banner_text>
25
+ <city/>
26
+ <color_scheme/>
27
+ <contact/>
28
+ <country/>
29
+ <customer>true</customer>
30
+ <discount/>
31
+ <fax_phone/>
32
+ <fiscal_year/>
33
+ <lat_long_error/>
34
+ <latitude/>
35
+ <longitude/>
36
+ <manufacturer>false</manufacturer>
37
+ <market_cap>0</market_cap>
38
+ <name>ACME</name>
39
+ <num_employees/>
40
+ <parent/>
41
+ <phone/>
42
+ <primary>false</primary>
43
+ <profits>0</profits>
44
+ <publicly_traded>false</publicly_traded>
45
+ <rank_tier/>
46
+ <revenue_per_year>0</revenue_per_year>
47
+ <state/>
48
+ <stock_price/>
49
+ <stock_symbol/>
50
+ <street/>
51
+ <sys_created_by>acme_administrator</sys_created_by>
52
+ <sys_created_on>2015-02-01 22:52:00</sys_created_on>
53
+ <sys_domain_number>3.14</sys_domain_number>
54
+ <sys_id>deadbeefdeadbeefdeadbeefdeadbeef</sys_id>
55
+ <sys_mod_count>28</sys_mod_count>
56
+ <sys_updated_by>acme_administrator</sys_updated_by>
57
+ <sys_updated_on>2015-02-01 22:52:00</sys_updated_on>
58
+ <theme/>
59
+ <vendor>false</vendor>
60
+ <vendor_manager/>
61
+ <vendor_type/>
62
+ <website/>
63
+ <zip/>
64
+ </core_company>
65
+ </xml>
66
+ EOF
67
+ end
68
+
69
+ def make_record_hash suffix = "beef"
70
+ {
71
+ "apple_icon"=>nil,
72
+ "banner_image"=>nil,
73
+ "banner_text"=>nil,
74
+ "city"=>nil,
75
+ "color_scheme"=>nil,
76
+ "contact"=>nil,
77
+ "country"=>nil,
78
+ "customer"=>"true",
79
+ "discount"=>nil,
80
+ "fax_phone"=>nil,
81
+ "fiscal_year"=>nil,
82
+ "lat_long_error"=>nil,
83
+ "latitude"=>nil,
84
+ "longitude"=>nil,
85
+ "manufacturer"=>"false",
86
+ "market_cap"=>"0",
87
+ "name"=>"ACME",
88
+ "num_employees"=>nil,
89
+ "parent"=>nil,
90
+ "phone"=>nil,
91
+ "primary"=>"false",
92
+ "profits"=>"0",
93
+ "publicly_traded"=>"false",
94
+ "rank_tier"=>nil,
95
+ "revenue_per_year"=>"0",
96
+ "state"=>nil,
97
+ "stock_price"=>nil,
98
+ "stock_symbol"=>nil,
99
+ "street"=>nil,
100
+ "sys_created_by"=>"acme_administrator",
101
+ "sys_created_on"=>"2015-02-01 22:52:00",
102
+ "sys_domain_number"=>"3.14",
103
+ "sys_id"=>"deadbeefdeadbeefdeadbeefdead#{suffix}",
104
+ "sys_mod_count"=>"28",
105
+ "sys_updated_by"=>"acme_administrator",
106
+ "sys_updated_on"=>"2015-02-01 22:52:00",
107
+ "theme"=>nil,
108
+ "vendor"=>"false",
109
+ "vendor_manager"=>nil,
110
+ "vendor_type"=>nil,
111
+ "website"=>nil,
112
+ "zip"=>nil
113
+ }
114
+ end
115
+
116
+ def make_insert_response_xml
117
+ <<EOF
118
+ <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:inc="http://www.service-now.com/incident">
119
+ <soapenv:Header/>
120
+ <soapenv:Body>
121
+ <inc:insertResponse>
122
+ <inc:sys_id>deadbeefdeadbeefdeadbeefdeadbeef</inc:sys_id>
123
+ <inc:number>1</inc:number>
124
+ </inc:insertResponse>
125
+ </soapenv:Body>
126
+ </soapenv:Envelope>
127
+ EOF
128
+ end
129
+
130
+ def make_insert_response_hash
131
+ {
132
+ :envelope => {
133
+ :body => {
134
+ :insert_response => {
135
+ :sys_id => "deadbeefdeadbeefdeadbeefdeadbeef",
136
+ :number => 1,
137
+ }
138
+ }
139
+ }
140
+ }
141
+ end
142
+ end
@@ -0,0 +1,10 @@
1
+ require 'rs_service_now'
2
+ require 'rspec/mocks'
3
+ require 'helpers'
4
+
5
+ RSpec.configure do |config|
6
+ config.include ServiceNowHelpers
7
+ config.mock_with :rspec do |c|
8
+ c.syntax = [:should, :expect]
9
+ end
10
+ end
@@ -0,0 +1,186 @@
1
+ require 'spec_helper'
2
+
3
+ module RsServiceNow
4
+ describe Record do
5
+ let(:subject) { RsServiceNow::Record.new "user", "supersekrit", "reporting" }
6
+ let(:max_export) { 100 }
7
+ let(:single_record_hash) { make_record_hash }
8
+ let(:single_record_xml) { make_record_xml }
9
+ let(:encoded_query) { 'active=true' }
10
+
11
+ describe '#_request' do
12
+ let(:dummy_client) { Object.new }
13
+ let(:dummy_response) { Object.new }
14
+ let(:multi_record_hash) { (0..251).collect { single_record_hash } }
15
+
16
+ before :each do
17
+ allow( subject ).to receive(:setup_client).and_return(dummy_client)
18
+ end
19
+
20
+ context 'single result' do
21
+ let(:dummy_response_hash) { {:envelope => {:body => {:get_records_response => {:get_records_result => single_record_hash } } } } }
22
+
23
+ before :each do
24
+ allow( subject ).to receive(:get_keys).and_return({:count => "1"})
25
+ allow( dummy_response ).to receive(:hash).and_return(dummy_response_hash)
26
+ allow( dummy_client ).to receive(:call).and_return(dummy_response)
27
+ end
28
+
29
+ it 'should return an array with one hash' do
30
+ expect( subject._request 'core_company', encoded_query ).to be == [single_record_hash]
31
+ end
32
+ end
33
+
34
+ context 'multiple results' do
35
+ let(:dummy_response_hash) { {:envelope => {:body => {:get_records_response => {:get_records_result => multi_record_hash } } } } }
36
+
37
+ before :each do
38
+ allow( subject ).to receive(:get_keys).and_return({:count => "251"})
39
+ allow( dummy_response ).to receive(:hash).and_return(dummy_response_hash)
40
+ allow( dummy_client ).to receive(:call).and_return(dummy_response)
41
+ end
42
+
43
+ it 'should get records 250 at a time' do
44
+ expect( dummy_client ).to receive(:call).with(:get_records, :message => {:__encoded_query => encoded_query, :__first_row => 0, :__last_row => 250}).ordered
45
+ expect( dummy_client ).to receive(:call).with(:get_records, :message => {:__encoded_query => encoded_query, :__first_row => 250, :__last_row => 500}).ordered
46
+
47
+ subject._request 'core_company', encoded_query
48
+ end
49
+
50
+ it 'should return an array of hashes containing each entry' do
51
+ expect( subject._request 'core_company', encoded_query ) == [multi_record_hash]
52
+ end
53
+ end
54
+
55
+ end
56
+
57
+ describe '#_export' do
58
+ let(:dummy_open) { Object.new }
59
+ let(:multi_record_hash) { (0..251).map { |n| make_record_hash n } }
60
+
61
+ context 'single result' do
62
+ let(:export_url) { "https://reporting.service-now.com/core_company.do?XML&sysparm_order_by=sys_id&sysparm_query=#{CGI.escape(encoded_query + '^')}sys_id#{CGI.escape('>=') + "deadbeefdeadbeefdeadbeefdeadbeef"}&sysparm_record_count=#{max_export}" }
63
+
64
+ before :each do
65
+ allow( subject ).to receive(:get_keys).and_return({:count => "1", :sys_id => "deadbeefdeadbeefdeadbeefdeadbeef"})
66
+ end
67
+
68
+ it 'should use the first sys_id in the first query' do
69
+ expect( subject ).to receive(:open).with(
70
+ export_url,
71
+ :http_basic_authentication => ["user", "supersekrit"]
72
+ ).and_return(dummy_open)
73
+ allow( dummy_open ).to receive(:read).and_return(single_record_xml)
74
+
75
+ subject._export 'core_company', encoded_query, max_export
76
+ end
77
+
78
+ it 'should return an array with one hash' do
79
+ allow( subject ).to receive(:open).and_return(dummy_open)
80
+ allow( dummy_open ).to receive(:read).and_return(single_record_xml)
81
+ expect( subject._export 'core_company', encoded_query, max_export ).to be == [single_record_hash]
82
+ end
83
+ end
84
+
85
+ context 'multiple results' do
86
+ let(:multi_xml_return0) { make_multiple_xml 0, 100 }
87
+ let(:multi_xml_return1) { make_multiple_xml 100, 200 }
88
+ let(:multi_xml_return2) { make_multiple_xml 200, 252 }
89
+ let(:sys_ids) { (0..299).map { |num| "deadbeefdeadbeefdeadbeefdead#{num}" }.join(',') }
90
+ let(:export_url0) { "https://reporting.service-now.com/core_company.do?XML&sysparm_order_by=sys_id&sysparm_query=#{CGI.escape(encoded_query + '^')}sys_id#{CGI.escape('>=') + "deadbeefdeadbeefdeadbeefdead0"}&sysparm_record_count=#{max_export}" }
91
+ let(:export_url1) { "https://reporting.service-now.com/core_company.do?XML&sysparm_order_by=sys_id&sysparm_query=#{CGI.escape(encoded_query + '^')}sys_id#{CGI.escape('>=') + "deadbeefdeadbeefdeadbeefdead100"}&sysparm_record_count=#{max_export}" }
92
+ let(:export_url2) { "https://reporting.service-now.com/core_company.do?XML&sysparm_order_by=sys_id&sysparm_query=#{CGI.escape(encoded_query + '^')}sys_id#{CGI.escape('>=') + "deadbeefdeadbeefdeadbeefdead200"}&sysparm_record_count=#{max_export}" }
93
+
94
+ before :each do
95
+ allow( subject ).to receive(:get_keys).and_return({:count => "251", :sys_id => sys_ids})
96
+
97
+ end
98
+
99
+ it 'should get records 100 at a time using sys_ids as the index' do
100
+ expect( subject ).to receive(:open).with(export_url0, :http_basic_authentication => ["user", "supersekrit"]).and_return(dummy_open)
101
+ expect( subject ).to receive(:open).with(export_url1, :http_basic_authentication => ["user", "supersekrit"]).and_return(dummy_open)
102
+ expect( subject ).to receive(:open).with(export_url2, :http_basic_authentication => ["user", "supersekrit"]).and_return(dummy_open)
103
+ allow( dummy_open ).to receive(:read).and_return(multi_xml_return0, multi_xml_return1, multi_xml_return2)
104
+ subject._export 'core_company', encoded_query, max_export
105
+ end
106
+
107
+ it 'should parse the xml and return an array of hashes' do
108
+ allow( subject ).to receive(:open).and_return(dummy_open)
109
+ allow( dummy_open ).to receive(:read).and_return(multi_xml_return0, multi_xml_return1, multi_xml_return2)
110
+ expect( subject._export 'core_company', encoded_query, max_export ).to be == multi_record_hash
111
+ end
112
+ end
113
+
114
+ end
115
+
116
+ describe '#get' do
117
+ let(:dummy_client) { Object.new }
118
+ let(:dummy_response) { Object.new }
119
+ let(:get_response) { make_record_hash }
120
+ let(:dummy_response_hash) { {:envelope => {:body => {:get_response => get_response } } } }
121
+ let(:sys_id) { "deadbeefdeadbeefdeadbeefdeadbeef" }
122
+
123
+ before :each do
124
+ allow( subject ).to receive(:setup_client).and_return(dummy_client)
125
+ allow( dummy_response ).to receive(:hash).and_return(dummy_response_hash)
126
+ allow( dummy_client ).to receive(:call).and_return(dummy_response)
127
+ end
128
+
129
+ it 'should return a hash' do
130
+ expect( dummy_client ).to receive(:call).with(:get, :message => {:sys_id => sys_id})
131
+
132
+ expect( subject._get("core_company", sys_id) ).to be == get_response
133
+ end
134
+ end
135
+
136
+ describe '#_insert' do
137
+ let(:dummy_client) { Object.new }
138
+ let(:dummy_response) { Object.new }
139
+ let(:insert_response) { make_insert_response_hash }
140
+ let(:insert_request) {
141
+ {
142
+ :active => true,
143
+ :assigned_to => "me",
144
+ :cmdb_ci => "router1",
145
+ :severity => 1,
146
+ :urgency => 1,
147
+ }
148
+ }
149
+
150
+ before :each do
151
+ allow( subject ).to receive(:setup_client).and_return(dummy_client)
152
+ allow( dummy_response ).to receive(:hash).and_return(insert_response)
153
+ allow( dummy_client ).to receive(:call).and_return(dummy_response)
154
+ end
155
+
156
+ it 'should return a sys_id' do
157
+ expect( dummy_client ).to receive(:call).with(:insert, :message => insert_request)
158
+
159
+ expect( subject._insert("incident", insert_request) ).to be == "deadbeefdeadbeefdeadbeefdeadbeef"
160
+ end
161
+ end
162
+
163
+ describe '#_update' do
164
+ let(:dummy_client) { Object.new }
165
+ let(:dummy_response) { Object.new }
166
+ let(:update_response) { make_insert_response_hash }
167
+ let(:update_request) {
168
+ {
169
+ :active => true,
170
+ }
171
+ }
172
+
173
+ before :each do
174
+ allow( subject ).to receive(:setup_client).and_return(dummy_client)
175
+ allow( dummy_response ).to receive(:hash).and_return(update_response)
176
+ allow( dummy_client ).to receive(:call).and_return(dummy_response)
177
+ end
178
+
179
+ it 'should update the record' do
180
+ expect( dummy_client ).to receive(:call).with(:insert, :message => update_request)
181
+ subject._insert("incident", update_request)
182
+ end
183
+ end
184
+
185
+ end
186
+ end
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rs_service_now
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
4
+ version: 0.0.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - nemski
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2015-02-01 00:00:00.000000000 Z
11
+ date: 2015-03-23 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bundler
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: savon
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ~>
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ~>
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: activesupport
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ! '>='
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ! '>='
76
67
  - !ruby/object:Gem::Version
@@ -89,33 +80,40 @@ files:
89
80
  - Rakefile
90
81
  - lib/rs_service_now.rb
91
82
  - lib/rs_service_now/ci.rb
83
+ - lib/rs_service_now/common.rb
92
84
  - lib/rs_service_now/company.rb
93
85
  - lib/rs_service_now/record.rb
94
86
  - lib/rs_service_now/version.rb
95
87
  - rs_service_now.gemspec
88
+ - spec/helpers.rb
89
+ - spec/spec_helper.rb
90
+ - spec/unit/records_spec.rb
96
91
  homepage: https://github.com/nemski/rs_service_now
97
92
  licenses:
98
93
  - BSD
94
+ metadata: {}
99
95
  post_install_message:
100
96
  rdoc_options: []
101
97
  require_paths:
102
98
  - lib
103
99
  required_ruby_version: !ruby/object:Gem::Requirement
104
- none: false
105
100
  requirements:
106
101
  - - ! '>='
107
102
  - !ruby/object:Gem::Version
108
103
  version: '0'
109
104
  required_rubygems_version: !ruby/object:Gem::Requirement
110
- none: false
111
105
  requirements:
112
106
  - - ! '>='
113
107
  - !ruby/object:Gem::Version
114
108
  version: '0'
115
109
  requirements: []
116
110
  rubyforge_project:
117
- rubygems_version: 1.8.28
111
+ rubygems_version: 2.4.6
118
112
  signing_key:
119
- specification_version: 3
113
+ specification_version: 4
120
114
  summary: A Ruby Soap ServiceNow interface.
121
- test_files: []
115
+ test_files:
116
+ - spec/helpers.rb
117
+ - spec/spec_helper.rb
118
+ - spec/unit/records_spec.rb
119
+ has_rdoc: