response_mate 0.1.14 → 0.2.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.
data/.gitignore CHANGED
@@ -7,6 +7,9 @@ tmp
7
7
  .rvmrc
8
8
  .rbenv*
9
9
 
10
+ spec/source/responses
11
+ spec/source/responses.last_recording
12
+
10
13
  output
11
14
  oauth.yml
12
15
 
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/Gemfile CHANGED
@@ -3,3 +3,15 @@ source 'https://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  gem 'coveralls', require: false
6
+
7
+ group :development, :test do
8
+ gem 'pry-debugger'
9
+ gem 'guard-rspec', require: false
10
+ gem 'guard-rubocop', require: false
11
+ end
12
+
13
+ group :test do
14
+ gem 'rspec', '~> 2.14.0'
15
+ gem 'simplecov', '~> 0.8.2'
16
+ gem 'fakeweb', '~> 1.2.8'
17
+ end
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- response_mate (0.1.13)
4
+ response_mate (0.2.0)
5
5
  activesupport
6
6
  addressable
7
7
  awesome_print
@@ -10,86 +10,120 @@ PATH
10
10
  faraday_middleware
11
11
  highline
12
12
  mustache
13
- thor (~> 0.18.1)
13
+ thor (~> 0.19)
14
14
 
15
15
  GEM
16
16
  remote: https://rubygems.org/
17
17
  specs:
18
- activesupport (4.0.2)
19
- i18n (~> 0.6, >= 0.6.4)
20
- minitest (~> 4.2)
21
- multi_json (~> 1.3)
18
+ activesupport (4.1.4)
19
+ i18n (~> 0.6, >= 0.6.9)
20
+ json (~> 1.7, >= 1.7.7)
21
+ minitest (~> 5.1)
22
22
  thread_safe (~> 0.1)
23
- tzinfo (~> 0.3.37)
24
- addressable (2.3.5)
25
- ast (1.1.0)
26
- atomic (1.1.14)
23
+ tzinfo (~> 1.1)
24
+ addressable (2.3.6)
25
+ ast (2.0.0)
27
26
  awesome_print (1.2.0)
28
- coderay (1.0.9)
27
+ celluloid (0.15.2)
28
+ timers (~> 1.1.0)
29
+ coderay (1.1.0)
29
30
  colored (1.2)
31
+ columnize (0.8.9)
30
32
  coveralls (0.7.0)
31
33
  multi_json (~> 1.3)
32
34
  rest-client
33
35
  simplecov (>= 0.7)
34
36
  term-ansicolor
35
37
  thor
38
+ debugger (1.6.6)
39
+ columnize (>= 0.3.1)
40
+ debugger-linecache (~> 1.2.0)
41
+ debugger-ruby_core_source (~> 1.3.2)
42
+ debugger-linecache (1.2.0)
43
+ debugger-ruby_core_source (1.3.5)
36
44
  diff-lcs (1.2.5)
37
45
  docile (1.1.1)
38
46
  fakefs (0.4.3)
39
- faraday (0.8.9)
40
- multipart-post (~> 1.2.0)
41
- faraday_middleware (0.9.0)
42
- faraday (>= 0.7.4, < 0.9)
43
- highline (1.6.20)
47
+ fakeweb (1.2.8)
48
+ faraday (0.9.0)
49
+ multipart-post (>= 1.2, < 3)
50
+ faraday_middleware (0.9.1)
51
+ faraday (>= 0.7.4, < 0.10)
52
+ ffi (1.9.3)
53
+ formatador (0.2.4)
54
+ guard (2.6.1)
55
+ formatador (>= 0.2.4)
56
+ listen (~> 2.7)
57
+ lumberjack (~> 1.0)
58
+ pry (>= 0.9.12)
59
+ thor (>= 0.18.1)
60
+ guard-rspec (4.2.9)
61
+ guard (~> 2.1)
62
+ rspec (>= 2.14, < 4.0)
63
+ guard-rubocop (1.1.0)
64
+ guard (~> 2.0)
65
+ rubocop (~> 0.20)
66
+ highline (1.6.21)
44
67
  i18n (0.6.9)
68
+ json (1.8.1)
69
+ listen (2.7.5)
70
+ celluloid (>= 0.15.2)
71
+ rb-fsevent (>= 0.9.3)
72
+ rb-inotify (>= 0.9)
73
+ lumberjack (1.0.5)
45
74
  method_source (0.8.2)
46
75
  mime-types (2.0)
47
- minitest (4.7.5)
76
+ minitest (5.3.5)
48
77
  multi_json (1.8.2)
49
- multipart-post (1.2.0)
78
+ multipart-post (2.0.0)
50
79
  mustache (0.99.5)
51
- parser (2.1.1)
52
- ast (~> 1.1)
80
+ parser (2.1.9)
81
+ ast (>= 1.1, < 3.0)
53
82
  slop (~> 3.4, >= 3.4.5)
54
83
  powerpack (0.0.9)
55
- pry (0.9.12.2)
56
- coderay (~> 1.0.5)
84
+ pry (0.9.12.6)
85
+ coderay (~> 1.0)
57
86
  method_source (~> 0.8)
58
87
  slop (~> 3.4)
59
- pry-nav (0.2.3)
88
+ pry-debugger (0.2.2)
89
+ debugger (~> 1.3)
60
90
  pry (~> 0.9.10)
61
- pry-remote (0.1.7)
62
- pry (~> 0.9)
63
- slop (~> 3.0)
64
- rainbow (1.99.0)
91
+ rainbow (2.0.0)
65
92
  rake (10.1.0)
93
+ rb-fsevent (0.9.4)
94
+ rb-inotify (0.9.4)
95
+ ffi (>= 0.5.0)
66
96
  rest-client (1.6.7)
67
97
  mime-types (>= 1.16)
68
98
  rspec (2.14.1)
69
99
  rspec-core (~> 2.14.0)
70
100
  rspec-expectations (~> 2.14.0)
71
101
  rspec-mocks (~> 2.14.0)
72
- rspec-core (2.14.7)
73
- rspec-expectations (2.14.4)
102
+ rspec-core (2.14.8)
103
+ rspec-expectations (2.14.5)
74
104
  diff-lcs (>= 1.1.3, < 2.0)
75
- rspec-mocks (2.14.4)
76
- rubocop (0.16.0)
77
- parser (~> 2.1)
105
+ rspec-mocks (2.14.6)
106
+ rubocop (0.23.0)
107
+ json (>= 1.7.7, < 2)
108
+ parser (~> 2.1.9)
78
109
  powerpack (~> 0.0.6)
79
- rainbow (>= 1.1.4)
110
+ rainbow (>= 1.99.1, < 3.0)
111
+ ruby-progressbar (~> 1.4)
112
+ ruby-progressbar (1.5.1)
80
113
  simplecov (0.8.2)
81
114
  docile (~> 1.1.0)
82
115
  multi_json
83
116
  simplecov-html (~> 0.8.0)
84
117
  simplecov-html (0.8.0)
85
- slop (3.4.6)
118
+ slop (3.5.0)
86
119
  term-ansicolor (1.2.2)
87
120
  tins (~> 0.8)
88
- thor (0.18.1)
89
- thread_safe (0.1.3)
90
- atomic
121
+ thor (0.19.1)
122
+ thread_safe (0.3.4)
123
+ timers (1.1.0)
91
124
  tins (0.13.1)
92
- tzinfo (0.3.38)
125
+ tzinfo (1.2.1)
126
+ thread_safe (~> 0.1)
93
127
 
94
128
  PLATFORMS
95
129
  ruby
@@ -98,10 +132,11 @@ DEPENDENCIES
98
132
  bundler (~> 1.3)
99
133
  coveralls
100
134
  fakefs
101
- pry
102
- pry-nav
103
- pry-remote
135
+ fakeweb (~> 1.2.8)
136
+ guard-rspec
137
+ guard-rubocop
138
+ pry-debugger
104
139
  rake
105
140
  response_mate!
106
- rspec (~> 2.14)
107
- rubocop
141
+ rspec (~> 2.14.0)
142
+ simplecov (~> 0.8.2)
data/Guardfile ADDED
@@ -0,0 +1,16 @@
1
+ rspec_options = {
2
+ cmd: "bundle exec rspec --order rand"
3
+ }
4
+
5
+ guard 'rspec', rspec_options do
6
+ watch(%r{^spec/.+_spec\.rb$})
7
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
8
+ watch('spec/spec_helper.rb') { "spec" }
9
+
10
+ watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
11
+ end
12
+
13
+ #guard :rubocop, all_on_start: false do
14
+ #watch(%r{.+\.rb$})
15
+ #watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
16
+ #end
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2012 Dimitris Zorbas / zorbash
1
+ Copyright 2014 Dimitris Zorbas / zorbash
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -9,4 +9,4 @@ RSpec::Core::RakeTask.new(:test) do |spec|
9
9
  spec.rspec_opts = ['--color', '--format nested']
10
10
  end
11
11
 
12
- task :default => :test
12
+ task default: :test
data/bin/response_mate CHANGED
@@ -3,4 +3,12 @@
3
3
 
4
4
  require 'response_mate'
5
5
 
6
- ResponseMate::CLI.start(ARGV)
6
+ begin
7
+ ResponseMate::CLI.start(ARGV)
8
+ rescue ResponseMate::OutputDirError
9
+ puts <<-OUT
10
+ Output directory does not exist, invoking setup..
11
+ Please retry after setup
12
+ OUT
13
+ ResponseMate::CLI.start(['setup'])
14
+ end
@@ -5,23 +5,17 @@ module ResponseMate
5
5
  package_name 'response_mate'
6
6
 
7
7
  desc 'record', 'Perform requests and record their output'
8
- method_option :base_url, aliases: '-b'
9
8
  method_option :requests_manifest, aliases: '-r'
10
- method_option :keys, aliases: '-k', type: :array
9
+ method_option :keys, aliases: '-k', type: :array, default: []
11
10
  def record
12
11
  ResponseMate::Commands::Record.new(args, options).run
13
-
14
- rescue ResponseMate::OutputDirError
15
- puts 'Output directory does not exist, invoking setup..'
16
- puts 'Please retry after setup'
17
- invoke :setup, []
12
+ rescue ResponseMate::KeysNotFound => e
13
+ puts "The requested keys: #{e.message} could not be found"
18
14
  end
19
15
 
20
16
  desc 'inspect [key1,key2]', 'Perform requests and print their output'
21
- method_option :base_url, aliases: '-b'
22
17
  method_option :requests_manifest, aliases: '-r'
23
- method_option :interactive, type: :boolean, aliases: "-i"
24
- method_option :print, type: :string, aliases: '-p', default: 'raw'
18
+ method_option :interactive, type: :boolean, aliases: '-i'
25
19
  def inspect(*keys)
26
20
  ResponseMate::Commands::Inspect.new(args, options).run
27
21
  end
@@ -41,16 +35,11 @@ module ResponseMate
41
35
  method_option :requests_manifest, aliases: '-r'
42
36
  def list(type = 'requests')
43
37
  ResponseMate::Commands::List.new(args, options).run
44
-
45
- rescue ResponseMate::OutputDirError
46
- puts 'Output directory does not exist, invoking setup..'
47
- puts 'Please retry after setup'
48
- invoke :setup, []
49
38
  end
50
39
 
51
40
  desc 'version', 'Print version information'
52
41
  def version
53
- puts "ResponseMate version #{ResponseMate::VERSION}"
42
+ puts "response_mate version #{ResponseMate::VERSION}"
54
43
  end
55
44
  map ['--version'] => :version
56
45
 
@@ -1,44 +1,24 @@
1
1
  # coding: utf-8
2
2
 
3
- module ResponseMate
4
- module Commands
5
- class ResponseMate::Commands::Inspect < Base
6
- attr_reader :inspector
7
- attr_accessor :history
3
+ class ResponseMate::Commands::Inspect < ResponseMate::Commands::Base
4
+ attr_reader :inspector
5
+ attr_accessor :history
8
6
 
9
- def initialize(args, options)
10
- super(args, options)
7
+ def initialize(args, options)
8
+ super(args, options)
11
9
 
12
- @options[:manifest] = ResponseMate::Manifest.new(options[:requests_manifest])
13
- @inspector = ResponseMate::Inspector.new(@options)
14
- @history = []
15
- end
10
+ @options[:manifest] = ResponseMate::Manifest.new(options[:requests_manifest])
11
+ @inspector = ResponseMate::Inspector.new(@options)
12
+ @history = []
13
+ end
16
14
 
17
- def run
18
- if options[:interactive]
19
- interactive
20
- else
21
- args.each do |key|
22
- inspector.inspect_key(key)
23
- end
24
- end
25
- end
15
+ def run
16
+ if args.empty?
17
+ return $stderr.puts 'At least one key has to be specified'.red
18
+ end
26
19
 
27
- def interactive
28
- loop do
29
- input = ask('response_mate> ')
30
- case input
31
- when 'history'
32
- input = choose { |menu|
33
- menu.prompt = 'Replay any?'
34
- menu.choices(*([:no] + history))
35
- }.to_s
36
- else
37
- history << input
38
- end
39
- inspector.inspect_interactive(input)
40
- end
41
- end
20
+ args.each do |key|
21
+ inspector.inspect_key(key)
42
22
  end
43
23
  end
44
24
  end
@@ -1,52 +1,41 @@
1
1
  # coding: utf-8
2
+ class ResponseMate::Commands::List < ResponseMate::Commands::Base
3
+ def run
4
+ environment = ResponseMate::Environment.new(options[:environment])
5
+ @manifest = ResponseMate::Manifest.new(options[:requests_manifest], environment)
2
6
 
3
- module ResponseMate
4
- module Commands
5
- class ResponseMate::Commands::List < Base
6
- attr_accessor :type
7
-
8
- def initialize(args, options)
9
- super(args, options)
10
- @type = args.first || 'requests'
11
-
12
- environment = ResponseMate::Environment.new(options[:environment])
13
- @options[:manifest] = ResponseMate::Manifest.new(options[:requests_manifest],
14
- environment)
15
- end
16
-
17
- def run
18
- if type == 'requests'
19
- choices = options[:manifest].requests.map { |r| r.key.to_sym }
20
- elsif type == 'recordings'
21
- choices = Dir.glob('output/responses/*.yml').map do |f|
22
- File.basename(f).gsub(/\.yml/, '').to_sym
23
- end
24
- end
25
-
26
- puts choices.join "\n"
27
- puts "\n\n"
28
- action = choose { |menu|
29
- menu.prompt = 'Want to perform any of the actions above?'
30
- menu.choices(:record, :inspect, :no)
31
- }
32
-
33
- unless action == :no
34
- key = choose { |menu|
35
- menu.prompt = 'Which one?'
36
- menu.choices(*choices)
37
- }.to_s
38
- end
39
-
40
- if key
41
- case action
42
- when :record
43
- ResponseMate::Recorder.new({ manifest: options[:manifest], keys: [key] }).
44
- record
45
- when :inspect
46
- ResponseMate::Inspector.new(manifest: options[:manifest]).inspect_key(key)
47
- end
48
- end
49
- end
7
+ available_keys = @manifest.requests.map { |r| r.key.to_sym }
8
+
9
+ puts available_keys.join("\n") << "\n\n"
10
+
11
+ action = ask_action
12
+ return if action == :no
13
+
14
+ perform_action(action, ask_key(available_keys))
15
+ end
16
+
17
+ private
18
+
19
+ def ask_action
20
+ choose do |menu|
21
+ menu.prompt = 'Want to perform any of the actions above?'
22
+ menu.choices(:record, :inspect, :no)
23
+ end
24
+ end
25
+
26
+ def ask_key(available_keys)
27
+ choose { |menu|
28
+ menu.prompt = 'Which one?'
29
+ menu.choices(*available_keys)
30
+ }.to_s
31
+ end
32
+
33
+ def perform_action(action, key)
34
+ case action
35
+ when :record
36
+ ResponseMate::Recorder.new(manifest: @manifest).record([key])
37
+ when :inspect
38
+ ResponseMate::Inspector.new(manifest: @manifest).inspect_key(key)
50
39
  end
51
40
  end
52
41
  end
@@ -3,22 +3,15 @@
3
3
  module ResponseMate
4
4
  module Commands
5
5
  # Handles the invocation of the record command
6
- class ResponseMate::Commands::Record < Base
7
- def initialize(args, options)
8
- super(args, options)
9
- @options = options.dup
10
- end
11
-
6
+ class Record < Base
12
7
  def run
13
8
  environment = ResponseMate::Environment.new(options[:environment])
14
-
15
- manifest = ResponseMate::Manifest.
16
- new(options[:requests_manifest], environment)
9
+ manifest = ResponseMate::Manifest.new(options[:requests_manifest], environment)
17
10
 
18
11
  options[:manifest] = manifest
19
12
  recorder = ResponseMate::Recorder.new(options)
20
13
 
21
- recorder.record
14
+ recorder.record(options[:keys])
22
15
 
23
16
  File.open(ResponseMate.configuration.output_dir + '.last_recording', 'w') do |f|
24
17
  f << Time.current
@@ -2,40 +2,33 @@
2
2
 
3
3
  # This class provides a layer above the HTTP client
4
4
  class ResponseMate::Connection
5
-
6
5
  delegate :params, to: :client
7
6
  delegate(*(ResponseMate::ManifestParser::HTTP_VERBS), to: :client)
8
7
 
9
- attr_accessor :client, :base_url
8
+ attr_accessor :client
10
9
 
11
- def initialize(base_url = nil)
12
- @base_url = base_url
10
+ def initialize
13
11
  @client = Faraday.new do |c|
14
12
  c.use FaradayMiddleware::FollowRedirects, limit: 5
15
13
  c.adapter Faraday.default_adapter
16
14
  end
17
-
18
- client.headers.merge(ResponseMate::DEFAULT_HEADERS)
19
- client.url_prefix = base_url if base_url
20
15
  end
21
16
 
22
17
  def fetch(request)
23
- client.params = request[:params] if !request[:params].nil?
24
- unless base_url || request[:path] =~ %r{http://}
25
- request[:path] = 'http://' + request[:path]
18
+ uri = URI.parse(request[:url])
19
+
20
+ if request[:params]
21
+ query = request[:params].to_query
22
+ query = uri.query ? uri.query << '&' << query : query
23
+ uri.query = query
26
24
  end
27
- client.send request[:verb].downcase.to_sym, "#{base_url}#{request[:path]}"
25
+
26
+ verb = request[:verb] || 'GET'
27
+
28
+ client.headers = request[:headers] if request[:headers]
29
+ client.send verb.downcase.to_sym, uri.to_s
28
30
  rescue Faraday::Error::ConnectionFailed
29
31
  puts "Is a server up and running at #{request[:path]}?".red
30
32
  exit 1
31
33
  end
32
-
33
- def set_headers_from_manifest(manifest)
34
- if manifest.default_headers
35
- manifest.default_headers.each_pair do |k, v|
36
-
37
- client.headers[ResponseMate::Helpers.headerize(k)] = v
38
- end
39
- end
40
- end
41
34
  end
@@ -1,7 +1,8 @@
1
1
  # coding: utf-8
2
- # The main module of the tool contains configuration code and some constats
2
+ # The main module of the tool contains configuration code and some constants
3
3
  module ResponseMate
4
4
  class OutputDirError < StandardError; end
5
+ class KeysNotFound < StandardError; end
5
6
 
6
7
  DEFAULT_HEADERS = {
7
8
  'User-Agent' => 'Response-Mate'
@@ -12,12 +13,11 @@ module ResponseMate
12
13
  end
13
14
 
14
15
  class Configuration
15
- attr_accessor :output_dir, :requests_manifest, :oauth_manifest, :environment
16
+ attr_accessor :output_dir, :requests_manifest, :environment
16
17
 
17
18
  def initialize
18
19
  @output_dir = './output/responses/'
19
20
  @requests_manifest = './requests.yml'
20
- @oauth_manifest = './oauth.yml'
21
21
  @environment = './environment.yml'
22
22
  end
23
23
  end
@@ -19,6 +19,6 @@ class ResponseMate::Environment
19
19
  exit 1
20
20
  end
21
21
 
22
- @env = YAML.load(environment_text)
22
+ @env = ::YAML.load(environment_text)
23
23
  end
24
24
  end
@@ -1,56 +1,24 @@
1
1
  # coding: utf-8
2
2
 
3
3
  class ResponseMate::Inspector
4
- attr_accessor :conn, :base_url, :oauth, :manifest, :print_type
4
+ attr_accessor :conn, :manifest
5
5
 
6
6
  def initialize(args = {})
7
7
  @manifest = args[:manifest]
8
- @oauth = ResponseMate::Oauth.new
9
- @base_url = args[:base_url] || manifest.base_url
10
- @print_type = args[:print] || 'raw'
11
8
 
12
- if !args[:interactive]
13
- @conn = ResponseMate::Connection.new(base_url)
14
- @conn.set_headers_from_manifest(manifest)
15
- else
16
- @conn = ResponseMate::Connection.new
17
- end
9
+ @conn = ResponseMate::Connection.new
18
10
  end
19
11
 
20
12
  def inspect_key(key, options = {})
21
13
  request = manifest.requests.find { |r| r.key == key }
22
- request = ResponseMate::Manifest.parse_request(request.request)
23
14
 
24
- puts "[#{key}] #{request[:verb]}".cyan_on_black.bold << " #{request[:path]}"
25
- puts "\tparams #{request[:params]}" if request[:params].present?
26
-
27
- print(conn.fetch(request))
28
- end
29
-
30
- def inspect_interactive(input)
31
- request = ResponseMate::Manifest.parse_request(input)
32
- print(conn.fetch(request))
33
- end
34
-
35
- def print(response)
36
- __send__ "print_#{print_type}", response
37
- end
38
-
39
- def print_raw(response)
40
- puts "\n"
41
- status = "#{response.status} #{ResponseMate::Http::STATUS_CODES[response.status]}"
42
- puts "HTTP/1.1 #{status}"
43
- response.headers.each_pair do |k, v|
44
- puts "#{ResponseMate::Helpers.headerize(k)}: #{v}"
45
- end
46
- puts response.body
15
+ puts request.to_cli_format
16
+ print_pretty(conn.fetch(request))
47
17
  end
48
18
 
49
19
  def print_pretty(response)
50
- ap(
51
- status: response.status,
52
- headers: response.headers,
53
- body: response.body
54
- )
20
+ ap(status: response.status,
21
+ headers: response.headers,
22
+ body: response.body)
55
23
  end
56
24
  end