mull 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9a2987de9b36325820ea3a5a25cbc342a366b2d3
4
+ data.tar.gz: 2796dbf0627c8d9ff9e4742eb1c1a6edc3e3db03
5
+ SHA512:
6
+ metadata.gz: 8683a179bb9713d53a6a3e8add738f5c7d0656913ed67ac7baf3825397156223442806aa31894927bc774819790b0aa24984d4c1426b617853bd62e043949873
7
+ data.tar.gz: ac9e98e2c823db374c10c7d1aebe20f5830351ee25b40cc62f99ca91d053f758ee58ed040ddec68df58edc13506d72a61c26597ceb48443efb2711f9b8c630b4
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ r.rb
11
+ mull-0.1.0.gem
12
+ mull.yml
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.0
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ before_install: gem install bundler -v 1.10.6
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in mull.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,42 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ ## Uncomment and set this to only include directories you want to watch
5
+ # directories %w(app lib config test spec features) \
6
+ # .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}
7
+
8
+ ## Note: if you are using the `directories` clause above and you are not
9
+ ## watching the project directory ('.'), then you will want to move
10
+ ## the Guardfile to a watched dir and symlink it back, e.g.
11
+ #
12
+ # $ mkdir config
13
+ # $ mv Guardfile config/
14
+ # $ ln -s config/Guardfile .
15
+ #
16
+ # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
17
+
18
+ guard :minitest do
19
+ # with Minitest::Unit
20
+ watch(%r{^test/(.*)\/?(.*)_test\.rb$})
21
+ watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| "test/#{m[1]}#{m[2]}_test.rb" }
22
+ watch(%r{^test/test_helper\.rb$}) { 'test' }
23
+
24
+ # with Minitest::Spec
25
+ # watch(%r{^spec/(.*)_spec\.rb$})
26
+ # watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
27
+ # watch(%r{^spec/spec_helper\.rb$}) { 'spec' }
28
+
29
+ # Rails 4
30
+ # watch(%r{^app/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
31
+ # watch(%r{^app/controllers/application_controller\.rb$}) { 'test/controllers' }
32
+ # watch(%r{^app/controllers/(.+)_controller\.rb$}) { |m| "test/integration/#{m[1]}_test.rb" }
33
+ # watch(%r{^app/views/(.+)_mailer/.+}) { |m| "test/mailers/#{m[1]}_mailer_test.rb" }
34
+ # watch(%r{^lib/(.+)\.rb$}) { |m| "test/lib/#{m[1]}_test.rb" }
35
+ # watch(%r{^test/.+_test\.rb$})
36
+ # watch(%r{^test/test_helper\.rb$}) { 'test' }
37
+
38
+ # Rails < 4
39
+ # watch(%r{^app/controllers/(.*)\.rb$}) { |m| "test/functional/#{m[1]}_test.rb" }
40
+ # watch(%r{^app/helpers/(.*)\.rb$}) { |m| "test/helpers/#{m[1]}_test.rb" }
41
+ # watch(%r{^app/models/(.*)\.rb$}) { |m| "test/unit/#{m[1]}_test.rb" }
42
+ end
data/LICENSE ADDED
@@ -0,0 +1,27 @@
1
+ Copyright (c) 2015, CrowdRise, Inc.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+
10
+ * Redistributions in binary form must reproduce the above copyright notice,
11
+ this list of conditions and the following disclaimer in the documentation
12
+ and/or other materials provided with the distribution.
13
+
14
+ * Neither the name of [project] nor the names of its
15
+ contributors may be used to endorse or promote products derived from
16
+ this software without specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Ehren Murdick and Scott Orlyck
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,102 @@
1
+ # Mull
2
+
3
+
4
+ > mull
5
+ >
6
+ > **verb**
7
+ >
8
+ > think about (a fact, proposal, or request) deeply and at length.
9
+ > "she began to mull over the various possibilities"
10
+ > synonyms: ponder, consider, think over/about, reflect on, contemplate, turn over in one's mind, chew over, cogitate on, give some thought to
11
+ > "I'll have to mull it over before making a final decision"
12
+
13
+ mull is a tool for thinking over an api service you are consuming.
14
+
15
+ It has two jobs:
16
+
17
+ * execute pre-defined requests against an api server you are consuming and save the results to a fixtures directory
18
+ * mirror those requests with the fixture content
19
+
20
+
21
+ ## Installation
22
+
23
+ Add this line to your application's Gemfile:
24
+
25
+ ```
26
+ gem 'mull'
27
+ ```
28
+
29
+ And then execute:
30
+
31
+ $ bundle
32
+
33
+ Or install it yourself as:
34
+
35
+ $ gem install mull
36
+
37
+ ## Usage
38
+
39
+ Define all your requests in a `mull.yml` file. It has the following format:
40
+
41
+ ```
42
+ root_url: http://jsonplaceholder.typicode.com
43
+ path_prefix: fixtures
44
+ requests:
45
+ - url: /posts/1
46
+ matcher: /posts/\d+
47
+ method: POST
48
+ status: 200
49
+ file: foobar.json
50
+ headers:
51
+ test-header: 1
52
+ post_body:
53
+ thing: ^\d$
54
+
55
+ ```
56
+
57
+ **Valid keys**
58
+
59
+ *Top level keys*
60
+
61
+ * `root_url:` The root url of the api server you are consuming
62
+ * `path_prefix:` The directory where you want the fixture files to go
63
+
64
+
65
+ *Per request keys*
66
+
67
+ * `url:` The exact path of the request on the server, eg. `/posts/1`. If `matcher:` is not present, this value is also used to route incoming requests. The outgoing request won't be made if this key is missing.
68
+ * `matcher:` A regex that matches the exact path. `mull server` will use this to map incoming requests
69
+ * `matcher_headers:` Hash of headers to use. If present, `mull server` will use this to map incoming requests. If not, no header checking will occur against incoming requests.
70
+ * `headers:` Hash of headers to use. If present, `mull fetch_all` requests will this for outgoing requests. If not, no headers will be used for outgoing requests.
71
+ * `post_body:` Hash of multipart form body values. Will both be submitted with the `mull fetch_all` requests and matched against incoming requests to `mull server`
72
+ * `method:` HTTP method of the request. Incoming and outgoing
73
+ * `status:` HTTP status
74
+ * `file:` Path to fixture file to use
75
+ * `body:` Hard-coded response for this endpoint. It is an error to use both the `body` key and the `file` key. The outgoing request will not be made if this key is present.
76
+
77
+
78
+ Once your mull file is good to go, you can execute all the defined requests and save the results by running
79
+
80
+ ```
81
+ mull fetch_all
82
+ ```
83
+
84
+ Then with the fixtures in place, start up a local server with
85
+
86
+ ```
87
+ mull server
88
+ ```
89
+
90
+ ## Development
91
+
92
+ 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.
93
+
94
+ ## Contributing
95
+
96
+ Bug reports and pull requests are welcome.
97
+
98
+
99
+ ## License
100
+
101
+ mull is [BSD licensed](./LICENSE).
102
+
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task :default => :test
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "mull"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/exe/mull ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'mull'
4
+ Mull::Cli.start(ARGV)
data/lib/mull.rb ADDED
@@ -0,0 +1,75 @@
1
+ require "mull/version"
2
+ require 'mull/request'
3
+ require 'mull/cli'
4
+ require 'mull/file_util'
5
+ require 'mull/response'
6
+ require 'sinatra'
7
+ require 'httparty'
8
+
9
+ class MullServer < Sinatra::Base
10
+ set :bind, '0.0.0.0'
11
+ end
12
+
13
+ module Mull
14
+ extend self
15
+
16
+ module Container
17
+ extend self
18
+ def file_utils; FileUtils; end
19
+ def file; File; end
20
+ def http; HTTParty; end
21
+ def server; MullServer; end
22
+
23
+ def config key
24
+ @config ||= YAML.load_file('mull.yml')
25
+ @config[key.to_s]
26
+ end
27
+
28
+ def request(definition:)
29
+ Request.new(
30
+ definition: definition,
31
+ file_utils: file_util,
32
+ http: http,
33
+ root_url: config(:root_url)
34
+ )
35
+ end
36
+
37
+ def response(definition:)
38
+ Response.new(
39
+ definition: definition,
40
+ file_utils: file_util,
41
+ server: server
42
+ )
43
+ end
44
+
45
+ def file_util
46
+ Mull::FileUtil.new(
47
+ path_prefix: config(:path_prefix),
48
+ file: file,
49
+ file_utils: file_utils
50
+ )
51
+ end
52
+ end
53
+
54
+
55
+ def requests
56
+ @requests ||= Container.config(:requests).map do |d|
57
+ Container.request(definition: d)
58
+ end
59
+ end
60
+
61
+ def responses
62
+ @responses ||= Container.config(:requests).map do |d|
63
+ Container.response(definition: d)
64
+ end
65
+ end
66
+
67
+ def save_all
68
+ requests.each(&:save_response!)
69
+ end
70
+
71
+ def server
72
+ responses.each(&:map_server_route)
73
+ Container.server.run!
74
+ end
75
+ end
data/lib/mull/cli.rb ADDED
@@ -0,0 +1,21 @@
1
+ require 'thor'
2
+
3
+ module Mull
4
+ class Cli < Thor
5
+ class << self
6
+ attr_accessor :app
7
+ end
8
+
9
+ self.app = Mull
10
+
11
+ desc "fetch_all", "Fetch all endpoints defined in the yml and save the responses"
12
+ def fetch_all
13
+ self.class.app.save_all
14
+ end
15
+
16
+ desc "server", "Start the server"
17
+ def server
18
+ self.class.app.server
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,35 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext'
3
+
4
+ module Mull
5
+ class FileUtil
6
+
7
+ delegate :join, to: :file
8
+
9
+ attr_accessor\
10
+ :path_prefix,
11
+ :file,
12
+ :file_utils
13
+
14
+ def initialize(path_prefix:, file:, file_utils:)
15
+ self.path_prefix = path_prefix || '.'
16
+ self.file = file
17
+ self.file_utils = file_utils
18
+ end
19
+
20
+ def read_file(path:)
21
+ return nil unless path
22
+ path = file.join(path_prefix, path)
23
+ file.read(path)
24
+ end
25
+
26
+ def write_file(path:, content:)
27
+ path = file.join(path_prefix, path)
28
+ dir = file.dirname(path)
29
+ unless file.exists?(dir)
30
+ file_utils.mkpath(dir)
31
+ end
32
+ file.open(path, 'w+') { |f| f.write content }
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,89 @@
1
+ require 'httparty'
2
+ require 'active_support'
3
+ require 'active_support/core_ext'
4
+ require 'json'
5
+
6
+ module Mull
7
+ class Request
8
+ # dependencies
9
+ attr_accessor\
10
+ :file_utils,
11
+ :http
12
+
13
+
14
+ attr_accessor\
15
+ :filepath,
16
+ :headers,
17
+ :matcher,
18
+ :method,
19
+ :post_body,
20
+ :root_url,
21
+ :status,
22
+ :url
23
+
24
+ def initialize(root_url:, definition:, file_utils:, http:)
25
+ self.file_utils = file_utils
26
+ self.http = http
27
+ self.root_url = root_url
28
+
29
+ defaults = {
30
+ 'method' => 'GET',
31
+ 'post_body' => {},
32
+ 'headers' => {},
33
+ 'status' => 200,
34
+ }
35
+
36
+ definition = defaults.merge(definition)
37
+
38
+ self.filepath = definition['file']
39
+ self.headers = definition['headers']
40
+ self.method = definition['method']
41
+ self.post_body = definition['post_body']
42
+ self.url = definition['url']
43
+ self.status = definition['status']
44
+ self.matcher = definition['matcher'] || url
45
+ end
46
+
47
+ def headers
48
+ Hash[@headers.map do |h, k|
49
+ [h.to_s, k.to_s]
50
+ end]
51
+ end
52
+
53
+ def fully_qualified_url
54
+ @_fully_qualified_url ||= file_utils.join(root_url, url)
55
+ end
56
+
57
+ def request_options
58
+ opts = {}
59
+ opts[:headers] = headers if headers.present?
60
+ opts[:body] = post_body if post_body.present?
61
+ opts
62
+ end
63
+
64
+ def result
65
+ @result ||= \
66
+ if request_options.empty?
67
+ http.send(method.downcase, fully_qualified_url)
68
+ else
69
+ http.send(method.downcase, fully_qualified_url, request_options)
70
+ end
71
+ end
72
+
73
+ def pretty_json_if_possible(body)
74
+ begin
75
+ parsedJson = JSON.parse(body)
76
+ return JSON.pretty_generate(parsedJson)
77
+ rescue Exception => e
78
+ return body
79
+ end
80
+ end
81
+
82
+ def save_response!
83
+ return unless filepath
84
+ return unless url
85
+
86
+ file_utils.write_file(path: filepath, content: pretty_json_if_possible(result.body))
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,49 @@
1
+ class Response
2
+ attr_accessor\
3
+ :file_utils,
4
+ :filepath,
5
+ :headers,
6
+ :matcher,
7
+ :method,
8
+ :post_body,
9
+ :response_body,
10
+ :server,
11
+ :status
12
+
13
+ def initialize(definition:, file_utils:, server:)
14
+ self.file_utils = file_utils
15
+ self.server = server
16
+
17
+ self.filepath = definition['file']
18
+ self.headers = definition['matcher_headers'] || {}
19
+ self.method = definition['method'] || 'GET'
20
+ self.post_body = definition['post_body'] || {}
21
+ self.status = definition['status'] || 200
22
+ self.matcher = definition['matcher'] || definition['url']
23
+
24
+ self.response_body = definition['body'] || file_utils.read_file(path: filepath)
25
+ end
26
+
27
+ def headers
28
+ return {} unless @headers
29
+ Hash[@headers.map do |h, k|
30
+ [h.to_s, k.to_s]
31
+ end]
32
+ end
33
+
34
+ def map_server_route
35
+ this = self
36
+ server.send(method.downcase, Regexp.new(matcher)) do
37
+ this.headers.each do |key, value|
38
+ pass and return unless request.env["HTTP_" + key.gsub(/-/, '_').upcase] == value
39
+ end
40
+
41
+ this.post_body.each do |key, value|
42
+ pass and return unless Regexp.new(value.to_s) === params[key]
43
+ end
44
+
45
+ status this.status
46
+ this.response_body
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,3 @@
1
+ module Mull
2
+ VERSION = "0.1.0"
3
+ end
data/mull.example.yml ADDED
@@ -0,0 +1,11 @@
1
+ root_url: http://jsonplaceholder.typicode.com
2
+ requests:
3
+ - url: /posts/1
4
+ method: GET
5
+ status: 200
6
+ file: artifacts/foo
7
+
8
+ - url: /posts/1
9
+ method: GET
10
+ status: 200
11
+ file: artifacts/bar
data/mull.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mull/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "mull"
8
+ spec.version = Mull::VERSION
9
+ spec.authors = ["CrowdRise"]
10
+ spec.email = ["devteam@crowdrise.com"]
11
+ spec.homepage = 'https://github.com/crowdrise/mull'
12
+
13
+ spec.summary = %q{Mull is a tool to mirror a live api for development}
14
+ spec.license = "BSD"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = ['mull']
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.required_ruby_version = '~> 2.1'
22
+
23
+ spec.add_dependency "httparty", "~> 0.13"
24
+ spec.add_dependency "sinatra", "~> 1.4"
25
+ spec.add_dependency "activesupport", "~> 4.2"
26
+
27
+ spec.add_development_dependency "bundler", "~> 1.10"
28
+ spec.add_development_dependency "rake", "~> 10.0"
29
+ spec.add_development_dependency "minitest", "~> 5.1"
30
+ spec.add_development_dependency "guard", "~> 2.13"
31
+ spec.add_development_dependency "guard-minitest", "~> 2.4"
32
+ end
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mull
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - CrowdRise
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-11-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.13'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: sinatra
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.4'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '4.2'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '4.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.10'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.10'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '5.1'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '5.1'
97
+ - !ruby/object:Gem::Dependency
98
+ name: guard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.13'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.13'
111
+ - !ruby/object:Gem::Dependency
112
+ name: guard-minitest
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '2.4'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '2.4'
125
+ description:
126
+ email:
127
+ - devteam@crowdrise.com
128
+ executables:
129
+ - mull
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - ".gitignore"
134
+ - ".ruby-version"
135
+ - ".travis.yml"
136
+ - Gemfile
137
+ - Guardfile
138
+ - LICENSE
139
+ - LICENSE.txt
140
+ - README.md
141
+ - Rakefile
142
+ - artifacts/.gitignore
143
+ - bin/console
144
+ - bin/setup
145
+ - exe/mull
146
+ - lib/mull.rb
147
+ - lib/mull/cli.rb
148
+ - lib/mull/file_util.rb
149
+ - lib/mull/request.rb
150
+ - lib/mull/response.rb
151
+ - lib/mull/version.rb
152
+ - mull.example.yml
153
+ - mull.gemspec
154
+ homepage: https://github.com/crowdrise/mull
155
+ licenses:
156
+ - BSD
157
+ metadata: {}
158
+ post_install_message:
159
+ rdoc_options: []
160
+ require_paths:
161
+ - lib
162
+ required_ruby_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '2.1'
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ requirements: []
173
+ rubyforge_project:
174
+ rubygems_version: 2.2.0
175
+ signing_key:
176
+ specification_version: 4
177
+ summary: Mull is a tool to mirror a live api for development
178
+ test_files: []