pdc 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 75e51486f499cbbb02b2bbd086e4afafa4bd55dc
4
- data.tar.gz: a134eedc49ae661ba3c7edb44ebdf5707ad111b1
3
+ metadata.gz: 234203e23bbe2f53796496c2048352e4029c6821
4
+ data.tar.gz: cd1c02de0fe5905a7312dc5f843b7ca7cc2986a9
5
5
  SHA512:
6
- metadata.gz: 5b7face60ca16ecaeeed911fab646b5d5290705502ea0db5b6df117afca97b97e0abd1b2b6af12dba9f02bbcb90cadc3f188030ecea947c35c81522d3cc608ae
7
- data.tar.gz: d8cb2c53473525966c40b15c57c9cec48e136b4bd0569d5b3b7123204e4182c6b57a3eccfa8daabd7760810623809e5fe8c54c94bb655f1a5741e5dc80e44716
6
+ metadata.gz: a85cc7e23ec88086c115e4071de94266f327ffdb05044205cf469b1c46e9aced707bfc21ab64c642136d59fd5b617e20ff2a6e2569c4e6262eaf8c0816982d0b
7
+ data.tar.gz: 1f31b025816cebc99da89a81dd768a7fd9741ebcac826f69ced6b2a0a6f27093b0215fd81ff3be743321ea56bdf4fc96b162562e57b0cc89cf60cefbd84a491d
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # PDC
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/pdc`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ Ruby `PDC` library that maps `PDC` json api to ActiveRecord like objects.
6
4
 
7
5
  ## Installation
8
6
 
@@ -26,16 +24,37 @@ TODO: Write usage instructions here
26
24
 
27
25
  ## Development
28
26
 
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
27
+ After checking out the repo, run `bin/setup` to install dependencies.
28
+ Then, run `rake test` to run the tests. You can also run `bin/console` for
29
+ an interactive prompt that will allow you to experiment.
30
30
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
31
+ To install this gem onto your local machine, run `bundle exec rake install`.
32
+ To release a new version, update the version number in `version.rb`, and
33
+ then run `bundle exec rake release`, which will create a git tag for the
34
+ version, push git commits and tags, and push the `.gem` file to [rubygems][]
32
35
 
33
36
  ## Contributing
34
37
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/pdc. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
38
+ Bug reports and pull requests are welcome on GitHub at
39
+ [product-definition-center/pdc-ruby-gem][pdc-github] . This project is intended to be a safe,
40
+ welcoming space for collaboration, and contributors are expected to adhere to
41
+ the [Contributor Covenant][coc] code of conduct.
36
42
 
37
43
 
38
44
  ## License
39
45
 
40
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
46
+ The gem is available as open source under the terms of the [MIT License][mit-license]
47
+
48
+ ## Credits
49
+
50
+ This gem is heavily influenced by the [spyke][] gem which requires
51
+ `activesupport 4.0` or above where as the `pdc` gem needs to run against
52
+ `activesupport 3.2.22`. If you are using `activesupport 4` (rails 4) or above
53
+ and is looking for json api to ORM framework please consider using [spyke][] instead.
54
+
41
55
 
56
+ [rubygems]: https://rubygems.org
57
+ [mit-license]: http://opensource.org/licenses/MIT
58
+ [coc]: http://contributor-covenant.org
59
+ [pdc-github]: https://github.com/product-definition-center/pdc-ruby-gem
60
+ [spyke]: https://github.com/balvig/spyke
@@ -14,5 +14,5 @@ begin
14
14
  release.to_a
15
15
  rescue PDC::Error::ResourceNotFound => e
16
16
  ap e
17
- puts "Got resource not found as expected: #{e.response[:status]}".yellowish
17
+ puts "Got resource not found as expected: #{e.response[:status]}"
18
18
  end
@@ -7,9 +7,9 @@ WebMock.disable! # this uses real server
7
7
  def token
8
8
  script_path = File.expand_path(File.dirname(__FILE__))
9
9
  token_path = File.join(script_path, '.token', 'pdc.prod')
10
- File.read(token_path).chomp.tap { |x| puts "Using token :#{x.ai}" }
10
+ File.read(token_path).chomp.tap { |x| puts "Using token :#{x}" }
11
11
  rescue Errno::ENOENT => e
12
- puts "Hey! did you forget to create #{token_path.ai} \n".red
12
+ puts "Hey! did you forget to create #{token_path} \n"
13
13
  raise e
14
14
  end
15
15
 
@@ -13,7 +13,7 @@ end
13
13
 
14
14
  ActiveSupport::Notifications.subscribe "http_cache.faraday" do |*args|
15
15
  event = ActiveSupport::Notifications::Event.new(*args)
16
- puts " >>> ".yellow + "cache: #{event.payload[:cache_status]}"
16
+ puts " >>> " + "cache: #{event.payload[:cache_status]}"
17
17
  ap event.payload
18
18
  end
19
19
 
@@ -23,8 +23,8 @@ def benchmark(description, opts = {}, &block)
23
23
  initial = Benchmark.measure(&block)
24
24
  repeat = Benchmark.measure(&block)
25
25
 
26
- puts "Initial : #{initial.to_s.chomp} >> #{initial.real.round(2).ai}"
27
- puts "Repeat : #{repeat.to_s.chomp} >> #{repeat.real.round(2).ai} \n"
26
+ puts "Initial : #{initial.to_s.chomp} >> #{initial.real.round(2)}"
27
+ puts "Repeat : #{repeat.to_s.chomp} >> #{repeat.real.round(2)} \n"
28
28
  end
29
29
 
30
30
  def main
@@ -18,7 +18,7 @@ def main
18
18
  ap resources
19
19
  rescue PDC::ResourceNotFound => e
20
20
  ap e
21
- puts "Got resource not found as expected: #{e.response.status}".yellowish
21
+ puts "Got resource not found as expected: #{e.response.status}"
22
22
  ap e.message
23
23
  end
24
24
  end
data/lib/pdc/config.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'faraday-http-cache'
2
- require 'curb'
2
+ require 'pdc/http/request/token_fetcher'
3
3
 
4
4
  module PDC
5
5
  # This class is the main access point for all PDC::Resource instances.
@@ -90,7 +90,7 @@ module PDC
90
90
  end
91
91
 
92
92
  def token
93
- config.token || fetch_token
93
+ config.token || Request::TokenFetcher.fetch(token_url)
94
94
  end
95
95
 
96
96
  private
@@ -107,10 +107,16 @@ module PDC
107
107
 
108
108
  # resets and returns the +Faraday+ +connection+ object
109
109
  def reset_base_connection
110
- headers = PDC::Request.default_headers
111
- PDC::Base.connection = Faraday.new(url: api_url, headers: headers) do |c|
110
+
111
+ faraday_config = {
112
+ url: api_url,
113
+ headers: PDC::Request.default_headers,
114
+ ssl: ssl_config
115
+ }
116
+
117
+ PDC::Base.connection = Faraday.new(faraday_config) do |c|
112
118
  c.request :append_slash_to_path
113
- c.request :authorization, 'Token', token if config.requires_token
119
+ c.request :pdc_token, token: config.token, token_url: token_url if config.requires_token
114
120
 
115
121
  c.response :logger, config.logger
116
122
  c.response :pdc_paginator
@@ -129,29 +135,13 @@ module PDC
129
135
  end
130
136
  end
131
137
 
138
+ def ssl_config
139
+ { verify: config.ssl_verify_mode == OpenSSL::SSL::VERIFY_PEER }
140
+ end
141
+
132
142
  def cache_store
133
143
  config.cache_store || ActiveSupport::Cache.lookup_store(:memory_store)
134
144
  end
135
145
 
136
- def fetch_token
137
- curl = Curl::Easy.new(token_url.to_s) do |request|
138
- request.headers['Accept'] = 'application/json'
139
- request.http_auth_types = :gssnegotiate
140
-
141
- # The curl man page (http://curl.haxx.se/docs/manpage.html)
142
- # specifes setting a fake username when using Negotiate auth,
143
- # and use ':' in their example.
144
- request.username = ':'
145
- end
146
- curl.perform
147
- if curl.response_code != 200
148
- logger.info "Obtain token from #{token_url} failed: #{curl.body_str}"
149
- error = { token_url: token_url, body: curl.body, code: curl.response_code }
150
- raise PDC::TokenFetchFailed, error
151
- end
152
- result = JSON.parse(curl.body_str)
153
- curl.close
154
- result['token']
155
- end
156
146
  end
157
147
  end
@@ -5,14 +5,14 @@ module PDC
5
5
  Faraday::Request.register_middleware :append_slash_to_path => self
6
6
 
7
7
  def call(env)
8
- logger.debug "\n..... append slash ..........................................".green
8
+ logger.debug "\n..... append slash .........................................."
9
9
  logger.debug self.class
10
10
  logger.debug env.url
11
11
 
12
12
  path = env.url.path
13
13
  env.url.path = path + '/' unless path.ends_with?('/')
14
14
 
15
- logger.debug "... after adding / #{env.url.path}: #{env.url.ai}"
15
+ logger.debug "... after adding / #{env.url.path}: #{env.url}"
16
16
  @app.call(env)
17
17
  end
18
18
  end
@@ -0,0 +1,30 @@
1
+ module PDC::Request
2
+
3
+ # Adds TokenAuthentication to request header. Uses the token if passed
4
+ # else fetches token using the TokenFetcher to get the token once
5
+ class Token < Faraday::Middleware
6
+ include PDC::Logging
7
+
8
+ Faraday::Request.register_middleware pdc_token: self
9
+
10
+ def initialize(app, options = {})
11
+ @options = options
12
+ super(app)
13
+ end
14
+
15
+ def call(env)
16
+ env.request_headers['Token'] = token
17
+ logger.debug "Token set, headers: #{env.request_headers}"
18
+ @app.call(env)
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :options
24
+
25
+ # uses the token passed or fetches one only once
26
+ def token
27
+ @token ||= options[:token] || TokenFetcher.fetch(options[:token_url])
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,32 @@
1
+ require 'curb'
2
+ require 'json'
3
+
4
+ module PDC::Request
5
+ module TokenFetcher
6
+
7
+ # uses kerberos token to obtain token from pdc
8
+ def self.fetch(token_url)
9
+ PDC.logger.debug "Fetch token from: #{token_url}"
10
+ curl = Curl::Easy.new(token_url.to_s) do |request|
11
+ request.headers['Accept'] = 'application/json'
12
+ request.http_auth_types = :gssnegotiate
13
+
14
+ # The curl man page (http://curl.haxx.se/docs/manpage.html)
15
+ # specifes setting a fake username when using Negotiate auth,
16
+ # and use ':' in their example.
17
+ request.username = ':'
18
+ end
19
+
20
+ curl.perform
21
+ if curl.response_code != 200
22
+ PDC.logger.info "Obtain token from #{token_url} failed: #{curl.body_str}"
23
+ error = { token_url: token_url, body: curl.body, code: curl.response_code }
24
+ raise PDC::TokenFetchFailed, error
25
+ end
26
+ result = JSON.parse(curl.body_str)
27
+ curl.close
28
+ result['token']
29
+ end
30
+
31
+ end
32
+ end
@@ -1,4 +1,6 @@
1
+ require 'pdc/http/request/token_fetcher'
1
2
  require 'pdc/http/request/append_slash'
3
+ require 'pdc/http/request/pdc_token'
2
4
 
3
5
  module PDC
4
6
  module Request
@@ -5,7 +5,7 @@ module PDC::Response
5
5
  Faraday::Response.register_middleware :pdc_paginator => self
6
6
 
7
7
  def parse(json)
8
- logger.debug "\n.....paginate json .....................................".redish
8
+ logger.debug "\n.....paginate json ....................................."
9
9
 
10
10
  metadata = json[:metadata]
11
11
  logger.debug metadata
@@ -21,7 +21,7 @@ module PDC::Response
21
21
  previous_page: request_uri(metadata.delete(:previous)),
22
22
  }
23
23
 
24
- logger.debug '... after parsing pagination data:'.green
24
+ logger.debug '... after parsing pagination data:'
25
25
  logger.debug metadata
26
26
  json
27
27
  end
@@ -8,10 +8,10 @@ module PDC::Response
8
8
  Faraday::Response.register_middleware :pdc_json_parser => self
9
9
 
10
10
  def parse(body)
11
- logger.debug "\n.....parse to json .....................................".yellow
11
+ logger.debug "\n.....parse to json ....................................."
12
12
  logger.debug self.class
13
13
 
14
- logger.debug "... parsing #{body.ai.truncate(55)}"
14
+ logger.debug '... parsing' + body.to_s.truncate(55)
15
15
  begin
16
16
  json = MultiJson.load(body, symbolize_keys: true)
17
17
  rescue MultiJson::ParseError => e
@@ -8,7 +8,7 @@ module PDC::Resource
8
8
 
9
9
  module ClassMethods
10
10
  def request(method, path, query = {})
11
- PDC.logger.debug ' >>>'.yellow + " : #{path.ai} #{query.ai}"
11
+ PDC.logger.debug ' >>>' + " : #{path} #{query}"
12
12
  ActiveSupport::Notifications.instrument('request.pdc', method: method) do |payload|
13
13
  response = connection.send(method) do |request|
14
14
  request.url path, query
data/lib/pdc/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module PDC
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
data/lib/pdc.rb CHANGED
@@ -17,9 +17,4 @@ module PDC
17
17
  require 'pdc/config'
18
18
  require 'pdc/base'
19
19
  require 'pdc/v1'
20
-
21
- # TODO: delete debug gems
22
- require 'ap'
23
- require 'pry'
24
-
25
20
  end
data/pdc.gemspec CHANGED
@@ -6,8 +6,8 @@ require 'pdc/version'
6
6
  Gem::Specification.new do |s|
7
7
  s.name = 'pdc'
8
8
  s.version = PDC::VERSION
9
- s.authors = ['Sunil Thaha']
10
- s.email = ['sthaha@redhat.com']
9
+ s.authors = ['Sunil Thaha', 'Cheng Yu']
10
+ s.email = ['sthaha@redhat.com', 'ycheng@redhat.com']
11
11
 
12
12
  s.summary = 'Ruby gem for use with Product-Definition-Center'
13
13
  s.description = 'API for PDC'
@@ -10,11 +10,16 @@ describe PDC do
10
10
 
11
11
  describe '##configure' do
12
12
  let(:site) { 'https://pdc.production.site.org' }
13
+
13
14
  let(:token_url) do
14
15
  pdc = PDC.config
15
16
  URI.join(site, pdc.api_root, pdc.token_obtain_path)
16
17
  end
17
18
 
19
+ let(:releases_url) do
20
+ URI.join(site, PDC.config.api_root, 'v1/releases/')
21
+ end
22
+
18
23
  it 'wont accept invalid config' do
19
24
  assert_raises PDC::ConfigError do
20
25
  PDC.configure do |config|
@@ -31,24 +36,38 @@ describe PDC do
31
36
  ret.must_be_instance_of Faraday::Connection
32
37
  end
33
38
 
34
- it 'fetches token by default' do
35
- endpoint = stub_request(:get, token_url).to_return_json(token: 'foobar')
39
+ it 'must not fetch token during configure step' do
40
+ token = stub_request(:get, token_url).to_return_json(token: 'foobar')
41
+ PDC.configure { |pdc| pdc.site = site }
42
+
43
+ assert_not_requested token
44
+ end
45
+
46
+ it 'fetches token on first request' do
47
+ token = stub_request(:get, token_url).to_return_json(token: 'foobar')
48
+
36
49
  PDC.configure { |pdc| pdc.site = site }
50
+ assert_not_requested token
37
51
 
38
- assert_requested endpoint
39
- PDC.token.must_equal 'foobar'
52
+ releases = stub_request(:get, releases_url).to_return_json(count: 0)
53
+ 3.times { PDC::V1::Release.count }
54
+
55
+ # the releases will be requested n times but the token will be reused
56
+ assert_requested token, times: 1
57
+ assert_requested releases, times: 3
40
58
  end
41
59
 
42
60
  it 'raises TokenFetchFailed when fails' do
43
- endpoint = stub_request(:get, token_url).to_return_json(
61
+ token = stub_request(:get, token_url).to_return_json(
44
62
  { detail: 'Not found' },
45
63
  status: [404, 'NOT FOUND']
46
64
  )
47
65
 
66
+ PDC.configure { |pdc| pdc.site = site }
48
67
  assert_raises PDC::TokenFetchFailed do
49
- PDC.configure { |pdc| pdc.site = site }
68
+ PDC.token
50
69
  end
51
- assert_requested endpoint
70
+ assert_requested token
52
71
  end
53
72
  end
54
73
 
@@ -13,7 +13,7 @@ end
13
13
  WebMock.allow_net_connect!
14
14
 
15
15
  WebMock.stub_request(:any, /.*/).to_return do |request|
16
- puts "UNSTUBBED REQUEST:".red + " #{request.method.upcase} #{request.uri}"
16
+ puts "UNSTUBBED REQUEST:" + " #{request.method.upcase} #{request.uri}"
17
17
  { body: nil }
18
18
  end
19
19
 
@@ -22,7 +22,7 @@ module PDC
22
22
  module WebMockExtentions
23
23
  def stub_get(path)
24
24
  uri = URI.join(Fixtures::Base::SITE, 'fixtures/', path).to_s
25
- puts " stubbing: #{uri.ai}"
25
+ puts " stubbing: #{uri}"
26
26
  stub_request(:get, uri)
27
27
  end
28
28
  end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sunil Thaha
8
+ - Cheng Yu
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2016-08-18 00:00:00.000000000 Z
12
+ date: 2016-09-08 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: activesupport
@@ -125,6 +126,7 @@ dependencies:
125
126
  description: API for PDC
126
127
  email:
127
128
  - sthaha@redhat.com
129
+ - ycheng@redhat.com
128
130
  executables:
129
131
  - console
130
132
  - setup
@@ -169,6 +171,8 @@ files:
169
171
  - lib/pdc/http/errors.rb
170
172
  - lib/pdc/http/request.rb
171
173
  - lib/pdc/http/request/append_slash.rb
174
+ - lib/pdc/http/request/pdc_token.rb
175
+ - lib/pdc/http/request/token_fetcher.rb
172
176
  - lib/pdc/http/response.rb
173
177
  - lib/pdc/http/response/pagination.rb
174
178
  - lib/pdc/http/response/parser.rb
@@ -254,7 +258,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
254
258
  version: '0'
255
259
  requirements: []
256
260
  rubyforge_project:
257
- rubygems_version: 2.6.6
261
+ rubygems_version: 2.4.8
258
262
  signing_key:
259
263
  specification_version: 4
260
264
  summary: Ruby gem for use with Product-Definition-Center