dvr 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in dvr.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Kyle Conarro
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,34 @@
1
+ # DVR [![Build Status](https://travis-ci.org/kconarro14/dvr.png?branch=master)](https://travis-ci.org/kconarro14/dvr)
2
+
3
+ DVR makes it easy to mimic your Rails API backend by generating a fake server using recorded HTTP responses.
4
+
5
+ The goals of DVR are as follows:
6
+
7
+ * Ease API client testing for Rails API backends
8
+ * Simplify keeping client testing synchronized with changes to the backend
9
+
10
+ A nice side effect of using DVR is that it relies on recorded API responses (for now, in the form of [rspec-api-documentation](https://github.com/zipmark/rspec_api_documentation) docs).
11
+
12
+ ## Installation & Usage
13
+ ``` bash
14
+ $ gem install dvr
15
+ $ dvr record --episode-location '/absolute/path/to/rspec-api-documentation'
16
+ ```
17
+ *Note that this is a command-line tool that doesn't need to be in your Gemfile.
18
+
19
+ ### Options
20
+ ``` bash
21
+ -l, [--episode-location=EPISODE_LOCATION] # The location of the recorded HTTP responses
22
+ -n, [--filename=FILENAME] # The name for the recorded server file
23
+ -f, [--episode-format=EPISODE_FORMAT] # The format of the provided files
24
+ -s, [--episode-source=EPISODE_SOURCE] # The source of the JSON files
25
+ -l, --episode-location=EPISODE_LOCATION # The location of the JSON files to record
26
+ -d, [--destination=DESTINATION] # The destination for the recorded server file
27
+ ```
28
+ ## Contributing
29
+
30
+ 1. Fork it
31
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
32
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
33
+ 4. Push to the branch (`git push origin my-new-feature`)
34
+ 5. Create new Pull Request
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
data/bin/dvr ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ lib = File.expand_path('../../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
4
+
5
+ require 'dvr'
6
+ require 'dvr/cli'
7
+
8
+ DVR::CLI::App.start
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'dvr/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "dvr"
8
+ spec.version = Dvr::VERSION
9
+ spec.authors = ["Kyle Conarro"]
10
+ spec.email = ["kyle.conarro@rigor.com"]
11
+ spec.description = "Mimic your Rails API backend by generating a fake server using recorded HTTP responses"
12
+ spec.summary = "DVR makes it easy to mimic your Rails API backend by generating a fake server using recorded HTTP responses"
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "pry"
25
+
26
+ spec.add_dependency 'thor'
27
+ spec.add_dependency 'json'
28
+ spec.add_dependency 'sinatra'
29
+ end
@@ -0,0 +1,42 @@
1
+ require 'json'
2
+ require "dvr/version"
3
+ require "dvr/configuration"
4
+ require "dvr/episode"
5
+ require "dvr/recorder"
6
+ require "dvr/season"
7
+
8
+ module DVR
9
+ extend self
10
+
11
+ def play
12
+ `bundle exec ruby #{DVR.configuration.recording_location}`
13
+ end
14
+
15
+ def record
16
+ raise DVR::InvalidConfiguration unless configuration.episode_location
17
+ recorder.get_season
18
+ end
19
+
20
+ def record_and_download
21
+ record.download
22
+ puts "Downloaded to #{download_location}"
23
+ end
24
+
25
+ def recorder
26
+ @recorder ||= Recorder.new
27
+ end
28
+
29
+ def download_location
30
+ @download_location ||= File.join(DVR.configuration.destination, DVR.configuration.filename)
31
+ end
32
+
33
+ def prep_destination
34
+ unless File.directory?(DVR.configuration.destination)
35
+ puts "Created destination directory at #{DVR.configuration.destination}"
36
+ Dir.mkdir(DVR.configuration.destination)
37
+ else
38
+ puts "Used existing destination directory at #{DVR.configuration.destination}"
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,2 @@
1
+ require 'thor'
2
+ require 'dvr/cli/app'
@@ -0,0 +1,34 @@
1
+ module DVR
2
+ module CLI
3
+ class App < Thor
4
+ namespace :dvr
5
+
6
+ desc "record", "Record episodes from API docs and playback as a Sinatra server file"
7
+ method_option :episode_location, :aliases => "-l", :desc => "The location of the JSON files to record", :required => true
8
+ method_option :episode_format, :aliases => "-f", :desc => "The format of the provided files", :required => false
9
+ method_option :episode_source, :aliases => "-s", :desc => "The source of the JSON files", :required => false
10
+ method_option :destination, :aliases => "-d", :desc => "The destination for the recorded server file", :required => false
11
+ method_option :filename, :aliases => "-n", :desc => "The name for the recorded server file", :required => false
12
+ def record
13
+ configure_options!
14
+ DVR.record_and_download
15
+ end
16
+
17
+ desc "play", "Play back recorded episodes by starting a Sinatra server"
18
+ method_option :recording_location, :aliases => "-r", :desc => "The location of the recorded Sinatra file", :required => true
19
+ def play
20
+ configure_options!
21
+ DVR.play
22
+ end
23
+
24
+ private
25
+
26
+ def configure_options!
27
+ DVR.configure do |config|
28
+ options.each {|option, value| config.send("#{option}=", value)}
29
+ end
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,30 @@
1
+ module DVR
2
+
3
+ class Configuration
4
+ attr_accessor :episode_format, :episode_location, :episode_source, :filename, :destination, :recording_location
5
+
6
+ def initialize
7
+ @episode_format = :rspec_api_documentation
8
+ @episode_location = nil
9
+ @episode_source = :filesystem
10
+ @filename = 'dvr_server.rb'
11
+ @destination = "#{Dir.pwd}/dvr"
12
+ @recording_location = File.join(@destination, @filename)
13
+ end
14
+
15
+ end
16
+
17
+ class InvalidConfiguration < Exception; end
18
+
19
+ extend self
20
+ attr_accessor :configuration
21
+
22
+ def configuration
23
+ @configuration ||= Configuration.new
24
+ end
25
+
26
+ def configure
27
+ yield(configuration)
28
+ end
29
+
30
+ end
@@ -0,0 +1,48 @@
1
+ module DVR
2
+ class Episode
3
+ attr_reader :content
4
+
5
+ def self.batch_record contents
6
+ contents.map {|c| record(c)}
7
+ end
8
+
9
+ def self.record content
10
+ new(content)
11
+ end
12
+
13
+ def initialize content
14
+ @content = content
15
+ end
16
+
17
+ def play
18
+ translate.map do |e|
19
+ "#{e[:method]} '#{e[:path]}' do\n '#{e[:response].body}'\nend\n\n"
20
+ end.join
21
+ end
22
+
23
+ def translate
24
+ data.map do |req|
25
+ {
26
+ :method => req['request_method'].downcase,
27
+ :path => req['request_path'].gsub('?', '/'),
28
+ :response => build_response(req)
29
+ }
30
+ end
31
+ end
32
+
33
+ def data
34
+ content.fetch('requests')
35
+ end
36
+
37
+ def build_response req
38
+ OpenStruct.new(
39
+ :status_code => req['response_status'],
40
+ :status_text => req['response_status_text'],
41
+ :body => req['response_body'],
42
+ :content_type => req['response_content_type'],
43
+ :headers => req['response_headers']
44
+ )
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,26 @@
1
+ module DVR
2
+ class Recorder
3
+
4
+ def get_episodes
5
+ puts "Recording episodes..."
6
+ Episode.batch_record(parsed_files)
7
+ end
8
+
9
+ def get_season
10
+ Season.new(get_episodes)
11
+ end
12
+
13
+ def files
14
+ Dir.glob("#{DVR.configuration.episode_location}/**/*.json").select {|f| !f.include?('index.json') }
15
+ end
16
+
17
+ def parsed_files
18
+ files.map {|f| parse_file(f)}
19
+ end
20
+
21
+ def parse_file file_loc
22
+ JSON.parse(File.open(file_loc).read)
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,41 @@
1
+ module DVR
2
+ class Season
3
+ attr_reader :episodes
4
+
5
+ def initialize episodes
6
+ @episodes = episodes
7
+ end
8
+
9
+ def binge_watch
10
+ episodes.map(&:play).join
11
+ end
12
+
13
+ def download
14
+ puts 'Downloading season to destination...'
15
+ save
16
+ end
17
+
18
+ protected
19
+
20
+ def save
21
+ DVR.prep_destination
22
+ File.open(DVR.download_location, 'w') do |f|
23
+ f.write(sinatra_file_headers)
24
+ f.write(before_hooks)
25
+ f.write(binge_watch)
26
+ end
27
+ end
28
+
29
+ def before_hooks
30
+ %(\nbefore { request.path_info += '/'+ request.query_string if request.query_string && !request.query_string.empty? }\n\n)
31
+ end
32
+
33
+ def sinatra_requirements
34
+ ['rubygems', 'sinatra']
35
+ end
36
+
37
+ def sinatra_file_headers
38
+ sinatra_requirements.map {|r| "require '#{r}'\n"}.join
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,3 @@
1
+ module Dvr
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe DVR::Configuration do
4
+
5
+ describe 'default options' do
6
+ it 'uses filesystem as the episode source' do
7
+ expect(subject.episode_source).to eq(:filesystem)
8
+ end
9
+
10
+ it 'uses rspec api documentation as the episode format' do
11
+ expect(subject.episode_format).to eq(:rspec_api_documentation)
12
+ end
13
+
14
+ it 'has no default location from which to record episodes' do
15
+ expect(subject.episode_location).to be_nil
16
+ end
17
+
18
+ it 'has a destination directory to record to' do
19
+ expect(subject.destination).to be_a(String)
20
+ end
21
+
22
+ it 'has a server name to use for the recorded file' do
23
+ expect(subject.filename).to be_a(String)
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ describe DVR::Episode do
4
+ let(:content) { JSON.parse(File.open(example_request_file).read) }
5
+ let(:batch_content) { [content] }
6
+ let(:episode) { DVR::Episode.new(content) }
7
+
8
+ describe 'defaults' do
9
+ it 'has content' do
10
+ expect(episode.content).to_not be_nil
11
+ end
12
+ end
13
+
14
+ describe '#translate' do
15
+ let(:translation) { episode.translate.first }
16
+
17
+ it 'translates the request method' do
18
+ expect(['get', 'post', 'put', 'patch', 'delete'].include?(translation.fetch(:method))).to be_true
19
+ end
20
+
21
+ it 'translates request path' do
22
+ expect(translation.fetch(:path)).to be_a(String)
23
+ end
24
+
25
+ context 'response' do
26
+ let(:response) { translation.fetch(:response) }
27
+
28
+ it 'builds a response object' do
29
+ expect(response).to be_an(OpenStruct)
30
+ end
31
+
32
+ it 'sets the status code' do
33
+ expect(response.status_code).to be_an(Integer)
34
+ end
35
+
36
+ it 'sets the status text' do
37
+ expect(response.status_text).to be_a(String)
38
+ end
39
+
40
+ it 'sets response body' do
41
+ expect(response.body).to be_a(String)
42
+ end
43
+
44
+ it 'sets the content type' do
45
+ expect(response.content_type).to be_a(String)
46
+ end
47
+
48
+ it 'sets the response headers' do
49
+ expect(response.headers).to be_a(Hash)
50
+ end
51
+ end
52
+
53
+ end
54
+
55
+ describe '#record' do
56
+ it 'records a new episode' do
57
+ expect(DVR::Episode.record(content)).to be_a(DVR::Episode)
58
+ end
59
+ end
60
+
61
+ describe '#batch_record' do
62
+ let(:result) { DVR::Episode.batch_record(batch_content) }
63
+
64
+ it 'records multiple episodes' do
65
+ expect(result).to be_an(Array)
66
+ expect(result.first).to be_an(DVR::Episode)
67
+ end
68
+ end
69
+
70
+ describe '#play' do
71
+ it 'plays the episode back as a string' do
72
+ expect(episode.play).to be_a(String)
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe DVR::Recorder do
4
+ before do
5
+ DVR.configure {|c| c.episode_location = fixture_path}
6
+ end
7
+
8
+ it 'finds files from the episode location' do
9
+ expect(File.file?(subject.files.first)).to be_true
10
+ end
11
+
12
+ it 'parses files to json' do
13
+ expect(subject.parse_file(subject.files.first)).to be_a(Hash)
14
+ end
15
+
16
+ it 'records episodes' do
17
+ expect(subject.get_episodes.first).to be_a(DVR::Episode)
18
+ end
19
+
20
+ it 'records seasons' do
21
+ expect(subject.get_season).to be_a(DVR::Season)
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe DVR::Season do
4
+ before { DVR.configure {|c| c.destination = '/my/destination' } }
5
+
6
+ let(:content) { JSON.parse(File.open(example_request_file).read) }
7
+ let(:episode) { DVR::Episode.new(content) }
8
+ let(:season) { DVR::Season.new([episode]) }
9
+
10
+ describe 'defaults' do
11
+ it 'has a collection of episodes' do
12
+ expect(season.episodes).to be_an(Array)
13
+ expect(season.episodes.first).to be_an(DVR::Episode)
14
+ end
15
+ end
16
+
17
+ describe '#binge_watch' do
18
+ it 'plays all episodes in the season' do
19
+ expect(season.episodes.first).to receive(:play)
20
+ season.binge_watch
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ module Kernel
4
+ def `(cmd)
5
+ cmd
6
+ end
7
+ end
8
+
9
+ describe DVR do
10
+ describe '#play' do
11
+ it 'plays back a recorded server' do
12
+ expect(DVR.play).to eq("bundle exec ruby #{DVR.configuration.recording_location}")
13
+ end
14
+ end
15
+
16
+ describe '#record' do
17
+ it 'records a season of episodes' do
18
+ expect(DVR.record).to be_a(DVR::Season)
19
+ expect(DVR.recorder).to receive(:get_season)
20
+ DVR.record
21
+ end
22
+ end
23
+
24
+ it 'has a download location' do
25
+ expect(DVR.download_location).to be_a(String)
26
+ end
27
+ end
@@ -0,0 +1,50 @@
1
+ {
2
+ "resource": "Har Records",
3
+ "http_method": "POST",
4
+ "route": "api/v1/har_records",
5
+ "description": "Creating a single record",
6
+ "explanation": null,
7
+ "parameters": [
8
+ {
9
+ "name": "har_url",
10
+ "description": "The URL of the HAR file"
11
+ },
12
+ {
13
+ "name": "account_id",
14
+ "description": "The account id to associate with the record"
15
+ },
16
+ {
17
+ "name": "check_id",
18
+ "description": "The check id to associate with the record"
19
+ },
20
+ {
21
+ "name": "check_run_history_id",
22
+ "description": "The check run history id to associate with the record"
23
+ },
24
+ {
25
+ "name": "location_id",
26
+ "description": "The location id to associate with the record"
27
+ }
28
+ ],
29
+ "requests": [
30
+ {
31
+ "request_method": "POST",
32
+ "request_path": "api/v1/har_records",
33
+ "request_body": "har_record[account_id]=1&har_record[check_id]=1&har_record[location_id]=1&har_record[check_run_history_id]=1&har_record[har_url]=https%3A%2F%2Fs3.amazonaws.com%2Fcheckdata.rigor.com%2F2.harp",
34
+ "request_headers": {
35
+ "Host": "example.org",
36
+ "Content-Type": "application/x-www-form-urlencoded",
37
+ "Cookie": ""
38
+ },
39
+ "request_query_parameters": {
40
+ },
41
+ "request_content_type": "application/x-www-form-urlencoded",
42
+ "response_status": 202,
43
+ "response_status_text": "Accepted",
44
+ "response_body": "{\"job_id\":\"00c5ff51ca644e3f3de14dd5\"}",
45
+ "response_headers": {"X-Frame-Options":"SAMEORIGIN","X-XSS-Protection":"1; mode=block","X-Content-Type-Options":"nosniff","X-UA-Compatible":"chrome=1","Content-Type":"application/json; charset=utf-8","Cache-Control":"no-cache","X-Request-Id":"c972cd0e-608b-48a5-b1b9-cbcf7054ff42","X-Runtime":"0.028218","Content-Length":"37"},
46
+ "response_content_type": "application/json; charset=utf-8",
47
+ "curl": null
48
+ }
49
+ ]
50
+ }
@@ -0,0 +1,13 @@
1
+ require 'dvr'
2
+
3
+ def fixture_path
4
+ File.expand_path('../fixtures', __FILE__)
5
+ end
6
+
7
+ def example_request_file
8
+ "#{fixture_path}/requests/rspec_api_documentation.json"
9
+ end
10
+
11
+ RSpec.configure do |config|
12
+ config.color_enabled = true # Use color in STDOUT
13
+ end
@@ -0,0 +1,48 @@
1
+ require 'rubygems'
2
+ require 'sinatra'
3
+
4
+ before { request.path_info = request.path_info + '/' + request.query_string }
5
+ post 'api/v1/har_records' do
6
+ '{"job_id":"00c5ff51ca644e3f3de14dd5"}'
7
+ end
8
+
9
+ get '/api/v1/har_records/account_id=1' do
10
+ '{"count":1,"har_records":{"1940":{"id":"1940","source_url":null,"wait_time":null,"dns_time":null,"send_time":null,"connect_time":null,"blocked_time":null,"receive_time":null,"browser":null,"creator":null,"domain":null,"har_url":"https://s3.amazonaws.com/checkdata.rigor.com/49.harp","entry_count":null,"error_count":null,"dom_load_time":null,"page_load_time":null,"server_time":null,"page_size":null,"client_error_count":null,"server_error_count":null,"connection_error_count":null,"created_at":"2013-12-09T22:40:54Z","updated_at":"2013-12-09T22:40:54Z","started_date_time":null,"account_id":1,"check_id":1,"check_run_history_id":1,"location_id":1,"image_count":null,"javascript_count":null,"css_count":null,"html_count":null,"flash_count":null,"other_count":null,"run_record_id":null}},"results":[{"key":"har_records","id":"1940"}]}'
11
+ end
12
+
13
+ get '/api/v1/har_records/check_id=1' do
14
+ '{"count":1,"har_records":{"1941":{"id":"1941","source_url":null,"wait_time":null,"dns_time":null,"send_time":null,"connect_time":null,"blocked_time":null,"receive_time":null,"browser":null,"creator":null,"domain":null,"har_url":"https://s3.amazonaws.com/checkdata.rigor.com/50.harp","entry_count":null,"error_count":null,"dom_load_time":null,"page_load_time":null,"server_time":null,"page_size":null,"client_error_count":null,"server_error_count":null,"connection_error_count":null,"created_at":"2013-12-09T22:40:54Z","updated_at":"2013-12-09T22:40:54Z","started_date_time":null,"account_id":1,"check_id":1,"check_run_history_id":1,"location_id":1,"image_count":null,"javascript_count":null,"css_count":null,"html_count":null,"flash_count":null,"other_count":null,"run_record_id":null}},"results":[{"key":"har_records","id":"1941"}]}'
15
+ end
16
+
17
+ get '/api/v1/har_records/check_run_history_id=1' do
18
+ '{"count":1,"har_records":{"1937":{"id":"1937","source_url":null,"wait_time":null,"dns_time":null,"send_time":null,"connect_time":null,"blocked_time":null,"receive_time":null,"browser":null,"creator":null,"domain":null,"har_url":"https://s3.amazonaws.com/checkdata.rigor.com/46.harp","entry_count":null,"error_count":null,"dom_load_time":null,"page_load_time":null,"server_time":null,"page_size":null,"client_error_count":null,"server_error_count":null,"connection_error_count":null,"created_at":"2013-12-09T22:40:54Z","updated_at":"2013-12-09T22:40:54Z","started_date_time":null,"account_id":1,"check_id":1,"check_run_history_id":1,"location_id":1,"image_count":null,"javascript_count":null,"css_count":null,"html_count":null,"flash_count":null,"other_count":null,"run_record_id":null}},"results":[{"key":"har_records","id":"1937"}]}'
19
+ end
20
+
21
+ get '/api/v1/har_records/start=2013-11-11&end=2013-11-21' do
22
+ '{"count":1,"har_records":{"1936":{"id":"1936","source_url":null,"wait_time":null,"dns_time":null,"send_time":null,"connect_time":null,"blocked_time":null,"receive_time":null,"browser":null,"creator":null,"domain":null,"har_url":"https://s3.amazonaws.com/checkdata.rigor.com/45.harp","entry_count":null,"error_count":null,"dom_load_time":null,"page_load_time":null,"server_time":null,"page_size":null,"client_error_count":null,"server_error_count":null,"connection_error_count":null,"created_at":"2013-12-09T22:40:54Z","updated_at":"2013-12-09T22:40:54Z","started_date_time":null,"account_id":1,"check_id":1,"check_run_history_id":1,"location_id":1,"image_count":null,"javascript_count":null,"css_count":null,"html_count":null,"flash_count":null,"other_count":null,"run_record_id":null}},"results":[{"key":"har_records","id":"1936"}]}'
23
+ end
24
+
25
+ get '/api/v1/har_records/location_id=1' do
26
+ '{"count":1,"har_records":{"1939":{"id":"1939","source_url":null,"wait_time":null,"dns_time":null,"send_time":null,"connect_time":null,"blocked_time":null,"receive_time":null,"browser":null,"creator":null,"domain":null,"har_url":"https://s3.amazonaws.com/checkdata.rigor.com/48.harp","entry_count":null,"error_count":null,"dom_load_time":null,"page_load_time":null,"server_time":null,"page_size":null,"client_error_count":null,"server_error_count":null,"connection_error_count":null,"created_at":"2013-12-09T22:40:54Z","updated_at":"2013-12-09T22:40:54Z","started_date_time":null,"account_id":1,"check_id":1,"check_run_history_id":1,"location_id":1,"image_count":null,"javascript_count":null,"css_count":null,"html_count":null,"flash_count":null,"other_count":null,"run_record_id":null}},"results":[{"key":"har_records","id":"1939"}]}'
27
+ end
28
+
29
+ get '/api/v1/har_records' do
30
+ '{"count":1,"har_records":{"1938":{"id":"1938","source_url":null,"wait_time":null,"dns_time":null,"send_time":null,"connect_time":null,"blocked_time":null,"receive_time":null,"browser":null,"creator":null,"domain":null,"har_url":"https://s3.amazonaws.com/checkdata.rigor.com/47.harp","entry_count":null,"error_count":null,"dom_load_time":null,"page_load_time":null,"server_time":null,"page_size":null,"client_error_count":null,"server_error_count":null,"connection_error_count":null,"created_at":"2013-12-09T22:40:54Z","updated_at":"2013-12-09T22:40:54Z","started_date_time":null,"account_id":1,"check_id":1,"check_run_history_id":1,"location_id":1,"image_count":null,"javascript_count":null,"css_count":null,"html_count":null,"flash_count":null,"other_count":null,"run_record_id":null}},"results":[{"key":"har_records","id":"1938"}]}'
31
+ end
32
+
33
+ get '/api/v1/har_records/per_page=1&page=1' do
34
+ '{"count":1,"har_records":{"1935":{"id":"1935","source_url":null,"wait_time":null,"dns_time":null,"send_time":null,"connect_time":null,"blocked_time":null,"receive_time":null,"browser":null,"creator":null,"domain":null,"har_url":"https://s3.amazonaws.com/checkdata.rigor.com/44.harp","entry_count":null,"error_count":null,"dom_load_time":null,"page_load_time":null,"server_time":null,"page_size":null,"client_error_count":null,"server_error_count":null,"connection_error_count":null,"created_at":"2013-12-09T22:40:54Z","updated_at":"2013-12-09T22:40:54Z","started_date_time":null,"account_id":1,"check_id":1,"check_run_history_id":1,"location_id":1,"image_count":null,"javascript_count":null,"css_count":null,"html_count":null,"flash_count":null,"other_count":null,"run_record_id":null}},"results":[{"key":"har_records","id":"1935"}]}'
35
+ end
36
+
37
+ post 'api/v1/har_records_bulk' do
38
+ '{"job_id":"b48c6bd17724fd2324a97f4b"}'
39
+ end
40
+
41
+ delete 'api/v1/har_records_bulk/destroy_by_account_id' do
42
+ '{"job_id":"997743e056e5d75ef0a142b4"}'
43
+ end
44
+
45
+ delete 'api/v1/har_records_bulk/destroy_by_check_id' do
46
+ '{"job_id":"d29dcc8754dc997a182f15b5"}'
47
+ end
48
+
metadata ADDED
@@ -0,0 +1,195 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dvr
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 2
10
+ version: 0.0.2
11
+ platform: ruby
12
+ authors:
13
+ - Kyle Conarro
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2013-12-12 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: bundler
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ hash: 9
29
+ segments:
30
+ - 1
31
+ - 3
32
+ version: "1.3"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: rake
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :development
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: rspec
51
+ prerelease: false
52
+ requirement: &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: :development
62
+ version_requirements: *id003
63
+ - !ruby/object:Gem::Dependency
64
+ name: pry
65
+ prerelease: false
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 3
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ type: :development
76
+ version_requirements: *id004
77
+ - !ruby/object:Gem::Dependency
78
+ name: thor
79
+ prerelease: false
80
+ requirement: &id005 !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ hash: 3
86
+ segments:
87
+ - 0
88
+ version: "0"
89
+ type: :runtime
90
+ version_requirements: *id005
91
+ - !ruby/object:Gem::Dependency
92
+ name: json
93
+ prerelease: false
94
+ requirement: &id006 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ hash: 3
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ type: :runtime
104
+ version_requirements: *id006
105
+ - !ruby/object:Gem::Dependency
106
+ name: sinatra
107
+ prerelease: false
108
+ requirement: &id007 !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ hash: 3
114
+ segments:
115
+ - 0
116
+ version: "0"
117
+ type: :runtime
118
+ version_requirements: *id007
119
+ description: Mimic your Rails API backend by generating a fake server using recorded HTTP responses
120
+ email:
121
+ - kyle.conarro@rigor.com
122
+ executables:
123
+ - dvr
124
+ extensions: []
125
+
126
+ extra_rdoc_files: []
127
+
128
+ files:
129
+ - .gitignore
130
+ - .travis.yml
131
+ - Gemfile
132
+ - LICENSE.txt
133
+ - README.md
134
+ - Rakefile
135
+ - bin/dvr
136
+ - dvr.gemspec
137
+ - lib/dvr.rb
138
+ - lib/dvr/cli.rb
139
+ - lib/dvr/cli/app.rb
140
+ - lib/dvr/configuration.rb
141
+ - lib/dvr/episode.rb
142
+ - lib/dvr/recorder.rb
143
+ - lib/dvr/season.rb
144
+ - lib/dvr/version.rb
145
+ - spec/dvr/configuration_spec.rb
146
+ - spec/dvr/episode_spec.rb
147
+ - spec/dvr/recorder_spec.rb
148
+ - spec/dvr/season_spec.rb
149
+ - spec/dvr_spec.rb
150
+ - spec/fixtures/requests/rspec_api_documentation.json
151
+ - spec/spec_helper.rb
152
+ - spec/support/server.rb
153
+ homepage: ""
154
+ licenses:
155
+ - MIT
156
+ post_install_message:
157
+ rdoc_options: []
158
+
159
+ require_paths:
160
+ - lib
161
+ required_ruby_version: !ruby/object:Gem::Requirement
162
+ none: false
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ hash: 3
167
+ segments:
168
+ - 0
169
+ version: "0"
170
+ required_rubygems_version: !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ hash: 3
176
+ segments:
177
+ - 0
178
+ version: "0"
179
+ requirements: []
180
+
181
+ rubyforge_project:
182
+ rubygems_version: 1.8.15
183
+ signing_key:
184
+ specification_version: 3
185
+ summary: DVR makes it easy to mimic your Rails API backend by generating a fake server using recorded HTTP responses
186
+ test_files:
187
+ - spec/dvr/configuration_spec.rb
188
+ - spec/dvr/episode_spec.rb
189
+ - spec/dvr/recorder_spec.rb
190
+ - spec/dvr/season_spec.rb
191
+ - spec/dvr_spec.rb
192
+ - spec/fixtures/requests/rspec_api_documentation.json
193
+ - spec/spec_helper.rb
194
+ - spec/support/server.rb
195
+ has_rdoc: