pdc 0.1.0 → 0.1.1

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 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