polyspec 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e84e9acc653e4a15a32bb41214af7d421b044134
4
+ data.tar.gz: 30b61200eef1c8a7a43a91c0ad89cfa96202066f
5
+ SHA512:
6
+ metadata.gz: 2a7c2abfb06f20757267d8766be11c2270a59a017c405662cc04e53a2e90fad2af46cdecbb6363a2c28ad55066159f329f5cc3097c99699d2e3421ae34e060ae
7
+ data.tar.gz: c971c47615644df505dbca7cefc52f63d166919714d7b0aacaa463cd0fdc916b16523f5d5fd1accf282947eb0035a5bec284fd8bc3aea70d323b2efaaf076381
data/.gitignore ADDED
@@ -0,0 +1,16 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ *.pyc
15
+ *.sqlite3
16
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in polyspec.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 TJ Taylor
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.
data/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # Polyspec
2
+
3
+ Test all your web-apps with Ruby and RSpec.
4
+
5
+ The motivation for this was two-fold. I wanted a) a way to write
6
+ clear, understandable tests for Golang HTTP APIs, and b) to write
7
+ capybara tests for Django apps. This provides both in a nice,
8
+ neat little package.
9
+
10
+ So far, there are default configurations for the
11
+ following languages/frameworks:
12
+
13
+ * Golang
14
+ * Django
15
+
16
+ ## Installation
17
+
18
+ Add this line to your application's Gemfile:
19
+
20
+ ```ruby
21
+ gem 'polyspec'
22
+ ```
23
+
24
+ And then execute:
25
+
26
+ $ bundle
27
+
28
+ Or install it yourself as:
29
+
30
+ $ gem install polyspec
31
+
32
+ ## Usage
33
+
34
+ In it's simplest incarnation, all you need to do is run the binary:
35
+
36
+ $ polyspec
37
+
38
+ If you have one of the configured app types, polyspec will just look
39
+ in your APP_ROOT/spec directory and run all the files matching the pattern
40
+ `spec/**/*_spec.rb`.
41
+
42
+ If you stray from the the default configuration, you need to specify some
43
+ cli arguments. From the CLI help:
44
+
45
+ Usage: /Users/ttaylor/.rbenv/versions/2.1.4/bin/polyspec [options]
46
+ -e, --start-command COMMAND The command used to start the app
47
+ -p, --port PORT The port the app will be running on
48
+ Defaults to 3000
49
+ -s, --stop-command COMMAND The command used to stop the app
50
+ If this is empty, the pid will be used to kill it
51
+ -b, --build-command COMMAND The command used to build/setup the app
52
+ -c, --check-path COMMAND The command used to check that the app is running
53
+ This assumes that it can perform a GET
54
+ to 'http://localhost:$PORT/$CHECK_PATH'
55
+ -t, --wait-tries NUM The number of times to try hitting the check-url before it gives up
56
+
57
+ Probably the most interesting one is the check-path. The CLI expects
58
+ to be able to hit your app on the port you give (or 3000) at this path.
59
+
60
+ The rest of the options are run verbatim by the runner, with only a
61
+ few notable things:
62
+
63
+ * The build command is run once, you can use this to specify a build step
64
+ (like `make` or `go build`) or maybe even DB migrations
65
+ (`rake db:migrate` anyone?)
66
+
67
+ * The start and stop commands are run before and after each test (respectively).
68
+ This ensures you have clean state in your app.
69
+
70
+ ## Contributing
71
+
72
+ 1. Fork it ( https://github.com/dugancathal/polyspec/fork )
73
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
74
+ 3. Write some tests
75
+ 4. Write some code
76
+ 5. Commit your changes (`git commit -am 'Add some feature'`)
77
+ 6. Push to the branch (`git push origin my-new-feature`)
78
+ 7. Create a new Pull Request
79
+
80
+ ### Testing
81
+
82
+ The full test suite requires both golang and python to be installed.
83
+ On a Mac, you can just do (presuming you have homebrew installed):
84
+
85
+ brew install go
86
+ brew install python
87
+ pip install django # (or whichever installer you choose to use)
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
data/bin/polyspec ADDED
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'polyspec'
4
+ require 'optparse'
5
+ require 'rspec'
6
+
7
+ options = Polyspec::CliOptionParser.new(ARGV).parse
8
+
9
+ runner = if options[:start_command]
10
+ Polyspec::TestSetupRunner.from_args(options)
11
+ else
12
+ Polyspec::RunnerFactory.new(ARGV[0] || Dir.pwd).get.new
13
+ end
14
+
15
+ runner.port = options[:port] || 3000
16
+ runner.check_url = options[:check_url] || '/'
17
+
18
+ runner.build
19
+ RSpec.configure do |c|
20
+ c.around(:each) do |e|
21
+ runner.start
22
+ e.run
23
+ runner.stop
24
+ end
25
+ end
26
+
27
+ require 'shellwords'
28
+ spec_opts = ENV['SPEC_OPTS'] || '-P spec/**/*_spec.rb'
29
+ RSpec::Core::Runner.run(Shellwords.split(spec_opts))
30
+
31
+ runner.cleanup
data/lib/polyspec.rb ADDED
@@ -0,0 +1,9 @@
1
+ require "polyspec/version"
2
+ require "polyspec/cli_option_parser"
3
+ require "polyspec/test_setup_runner"
4
+ require "polyspec/golang_project_runner"
5
+ require "polyspec/django_project_runner"
6
+ require "polyspec/runner_factory"
7
+
8
+ module Polyspec
9
+ end
@@ -0,0 +1,40 @@
1
+ module Polyspec
2
+ class CliOptionParser
3
+ attr_reader :args
4
+ def initialize(args_array)
5
+ @args = args_array.dup
6
+ end
7
+
8
+ def parse
9
+ options = {}
10
+ OptionParser.new(args) do |opts|
11
+ opts.banner = "Usage: #$0 [options]"
12
+
13
+ opts.on("-e", "--start-command COMMAND", "The command used to start the app") do |e|
14
+ options[:start_command] = e
15
+ end
16
+
17
+ opts.on("-p", "--port PORT", Integer, "The port the app will be running on", "Defaults to 3000") do |p|
18
+ options[:port] = p
19
+ end
20
+
21
+ opts.on("-s", "--stop-command COMMAND", "The command used to stop the app", "If this is empty, the pid will be used to kill it") do |s|
22
+ options[:stop_command] = s
23
+ end
24
+
25
+ opts.on("-b", "--build-command COMMAND", "The command used to build/setup the app") do |b|
26
+ options[:build_command] = b
27
+ end
28
+
29
+ opts.on("-c", "--check-path COMMAND", "The command used to check that the app is running", "This assumes that it can perform a GET", "to 'http://localhost:$PORT/$CHECK_PATH'") do |b|
30
+ options[:build_command] = b
31
+ end
32
+
33
+ opts.on("-t", "--wait-tries NUM", Integer, "The number of times to try hitting the check-url before it gives up") do |t|
34
+ options[:wait_tries] = t
35
+ end
36
+ end.parse!
37
+ options
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,12 @@
1
+ module Polyspec
2
+ class DjangoProjectRunner < TestSetupRunner
3
+ def build
4
+ # NOOP
5
+ end
6
+
7
+ def start_command
8
+ puts "Starting on #{port}"
9
+ "python manage.py runserver #{port}"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,32 @@
1
+ require 'fileutils'
2
+
3
+ module Polyspec
4
+ class GolangProjectRunner < TestSetupRunner
5
+ TMP_FILE_PATTERN = "/tmp/polyspec-app-%s"
6
+ def build_command
7
+ "go build -o #{binary_file} #{package_name}"
8
+ end
9
+
10
+ def start_command
11
+ binary_file
12
+ end
13
+
14
+ def cleanup
15
+ FileUtils.rm(binary_file)
16
+ end
17
+
18
+ private
19
+
20
+ def runtime_hash
21
+ @runtime_hash ||= Time.now.to_i
22
+ end
23
+
24
+ def package_name
25
+ Dir.pwd.split('src/').last
26
+ end
27
+
28
+ def binary_file
29
+ TMP_FILE_PATTERN % runtime_hash
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,20 @@
1
+ require 'find'
2
+
3
+ module Polyspec
4
+ class RunnerFactory
5
+ attr_reader :project_path
6
+ def initialize(project_path)
7
+ @project_path = project_path
8
+ end
9
+
10
+ PROJECT_TYPE_MATCHERS = {
11
+ DjangoProjectRunner => ->(project_files) { project_files.any? {|f| next if File.extname(f) == '.pyc'; File.read(f).match(/django/i) } },
12
+ GolangProjectRunner => ->(project_files) { project_files.any? {|f| File.extname(f) == '.go' } },
13
+ }
14
+
15
+ def get
16
+ project_files = Find.find(project_path).select {|f| File.file?(f) }
17
+ PROJECT_TYPE_MATCHERS.find {|runner, matcher| matcher.call(project_files) }.first
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,66 @@
1
+ require 'httparty'
2
+
3
+ module Polyspec
4
+ class TestSetupRunner
5
+ attr_accessor :build_command, :start_command, :stop_command, :wait_check, :wait_tries, :pid, :port, :check_url
6
+ DEFAULT_WAIT_TRIES = 3
7
+ DEFAULT_WAIT_CHECK = ->(port, check_url) {
8
+ begin
9
+ HTTParty.get("http://localhost:#{port}#{check_url}")
10
+ rescue
11
+ end
12
+ }
13
+
14
+ def self.from_args(args)
15
+ runner = new
16
+
17
+ runner.build_command = options[:build_command]
18
+ runner.start_command = options[:start_command]
19
+ runner.stop_command = options[:stop_command]
20
+ runner.wait_tries = options[:wait_tries]
21
+ runner.port = options[:port]
22
+ runner.check_url = options[:check_url]
23
+ runner
24
+ end
25
+
26
+ def build
27
+ `#{build_command}`
28
+ end
29
+
30
+ def start
31
+ self.pid = Process.spawn(start_command, pgroup: true)
32
+ wait_for_app_to_boot
33
+ pid
34
+ end
35
+
36
+ def stop
37
+ if stop_command
38
+ `#{stop_command}`
39
+ else
40
+ Process.kill(-9, pid)
41
+ end
42
+ end
43
+
44
+ def cleanup
45
+ # NOOP
46
+ end
47
+
48
+ def wait_tries
49
+ @wait_tries || DEFAULT_WAIT_TRIES
50
+ end
51
+
52
+ def wait_check
53
+ @wait_check || DEFAULT_WAIT_CHECK
54
+ end
55
+
56
+ private
57
+
58
+ def wait_for_app_to_boot
59
+ 1.upto(wait_tries) do
60
+ return if wait_check.call(port, check_url)
61
+ sleep 0.5
62
+ end
63
+ raise 'Unable to start the app'
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,3 @@
1
+ module Polyspec
2
+ VERSION = "0.0.1"
3
+ end
data/polyspec.gemspec ADDED
@@ -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 'polyspec/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "polyspec"
8
+ spec.version = Polyspec::VERSION
9
+ spec.authors = ["TJ Taylor"]
10
+ spec.email = ["dugancathal@gmail.com"]
11
+ spec.summary = %q{Write specs in ruby for ALL the languages}
12
+ spec.description = <<-DESC
13
+ RSpec's DSL for writing tests for your app is fantastic. This gem
14
+ brings that DSL to all your apps.
15
+ DESC
16
+ spec.homepage = ""
17
+ spec.license = "MIT"
18
+
19
+ spec.files = `git ls-files -z`.split("\x0")
20
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
21
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.7"
25
+ spec.add_development_dependency "rake", "~> 10.0"
26
+
27
+ spec.add_dependency "httparty", "~> 0.13"
28
+ spec.add_dependency "rspec", "~> 3.0"
29
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Testing a Django app' do
4
+ let(:django_root) { APP_ROOT.join('spec', 'fixtures', 'django-app') }
5
+
6
+ let(:port) { 3001 }
7
+ describe 'running an app' do
8
+ it 'runs the given command' do
9
+ Dir.chdir(django_root) do
10
+ output = polyspec p: port
11
+ expect(output).to match /1 example, 0 failures/
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ require 'httparty'
3
+ require 'pathname'
4
+
5
+ describe 'Testing a Golang app' do
6
+ let(:gopath) { APP_ROOT.join('spec', 'fixtures', 'go-app') }
7
+ let(:test_goapp) { gopath.join('src', 'stuffs') }
8
+
9
+ let(:port) { 3000 }
10
+ describe 'running an app' do
11
+ it 'runs the given command' do
12
+ Dir.chdir(test_goapp) do
13
+ output = polyspec p: port
14
+ expect(output).to match /1 example, 0 failures/
15
+ end
16
+ end
17
+
18
+ def environment_variables
19
+ "GOPATH=#{gopath} PORT=#{port}"
20
+ end
21
+ end
22
+ end
File without changes
@@ -0,0 +1,83 @@
1
+ """
2
+ Django settings for app project.
3
+
4
+ For more information on this file, see
5
+ https://docs.djangoproject.com/en/1.7/topics/settings/
6
+
7
+ For the full list of settings and their values, see
8
+ https://docs.djangoproject.com/en/1.7/ref/settings/
9
+ """
10
+
11
+ # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
12
+ import os
13
+ BASE_DIR = os.path.dirname(os.path.dirname(__file__))
14
+
15
+
16
+ # Quick-start development settings - unsuitable for production
17
+ # See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/
18
+
19
+ # SECURITY WARNING: keep the secret key used in production secret!
20
+ SECRET_KEY = 'wg(%7#oiqyddi08fum-3ken3@02&j)-0j)j+_-_v50&&^7i#k0'
21
+
22
+ # SECURITY WARNING: don't run with debug turned on in production!
23
+ DEBUG = True
24
+
25
+ TEMPLATE_DEBUG = True
26
+
27
+ ALLOWED_HOSTS = []
28
+
29
+
30
+ # Application definition
31
+
32
+ INSTALLED_APPS = (
33
+ 'django.contrib.admin',
34
+ 'django.contrib.auth',
35
+ 'django.contrib.contenttypes',
36
+ 'django.contrib.sessions',
37
+ 'django.contrib.messages',
38
+ 'django.contrib.staticfiles',
39
+ )
40
+
41
+ MIDDLEWARE_CLASSES = (
42
+ 'django.contrib.sessions.middleware.SessionMiddleware',
43
+ 'django.middleware.common.CommonMiddleware',
44
+ 'django.middleware.csrf.CsrfViewMiddleware',
45
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
46
+ 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
47
+ 'django.contrib.messages.middleware.MessageMiddleware',
48
+ 'django.middleware.clickjacking.XFrameOptionsMiddleware',
49
+ )
50
+
51
+ ROOT_URLCONF = 'app.urls'
52
+
53
+ WSGI_APPLICATION = 'app.wsgi.application'
54
+
55
+
56
+ # Database
57
+ # https://docs.djangoproject.com/en/1.7/ref/settings/#databases
58
+
59
+ DATABASES = {
60
+ 'default': {
61
+ 'ENGINE': 'django.db.backends.sqlite3',
62
+ 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
63
+ }
64
+ }
65
+
66
+ # Internationalization
67
+ # https://docs.djangoproject.com/en/1.7/topics/i18n/
68
+
69
+ LANGUAGE_CODE = 'en-us'
70
+
71
+ TIME_ZONE = 'UTC'
72
+
73
+ USE_I18N = True
74
+
75
+ USE_L10N = True
76
+
77
+ USE_TZ = True
78
+
79
+
80
+ # Static files (CSS, JavaScript, Images)
81
+ # https://docs.djangoproject.com/en/1.7/howto/static-files/
82
+
83
+ STATIC_URL = '/static/'
@@ -0,0 +1,10 @@
1
+ from django.conf.urls import patterns, include, url
2
+ from django.contrib import admin
3
+
4
+ urlpatterns = patterns('',
5
+ # Examples:
6
+ # url(r'^$', 'app.views.home', name='home'),
7
+ # url(r'^blog/', include('blog.urls')),
8
+
9
+ url(r'^admin/', include(admin.site.urls)),
10
+ )
@@ -0,0 +1,14 @@
1
+ """
2
+ WSGI config for app project.
3
+
4
+ It exposes the WSGI callable as a module-level variable named ``application``.
5
+
6
+ For more information on this file, see
7
+ https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/
8
+ """
9
+
10
+ import os
11
+ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings")
12
+
13
+ from django.core.wsgi import get_wsgi_application
14
+ application = get_wsgi_application()
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env python
2
+ import os
3
+ import sys
4
+
5
+ if __name__ == "__main__":
6
+ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings")
7
+
8
+ from django.core.management import execute_from_command_line
9
+
10
+ execute_from_command_line(sys.argv)
@@ -0,0 +1,7 @@
1
+ require 'rspec'
2
+
3
+ RSpec.describe 'Main' do
4
+ it 'works' do
5
+ expect(true).to eq true
6
+ end
7
+ end
@@ -0,0 +1,17 @@
1
+ package main
2
+
3
+ import (
4
+ "fmt"
5
+ "net/http"
6
+ "os"
7
+ )
8
+
9
+ func main() {
10
+ port := os.Getenv("PORT")
11
+ http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
12
+ w.Header().Set("Content-Type", "application/json")
13
+ w.Write([]byte(`{"foo": "bar"}`))
14
+ })
15
+
16
+ http.ListenAndServe(fmt.Sprintf(":%s", port), nil)
17
+ }
@@ -0,0 +1,9 @@
1
+ require 'rspec'
2
+ require 'httparty'
3
+
4
+ describe 'Main' do
5
+ it 'works' do
6
+ response = HTTParty.get('http://localhost:3000/')
7
+ expect(response['foo']).to eq 'bar'
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ require 'pathname'
2
+ require 'rspec'
3
+
4
+ APP_ROOT = Pathname(File.expand_path('../../', __FILE__))
5
+
6
+ Dir[APP_ROOT.join('spec/support/**/*.rb')].each {|f| require f }
7
+
8
+ RSpec.configure do |config|
9
+ config.expect_with :rspec do |expectations|
10
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
11
+ end
12
+
13
+ config.mock_with :rspec do |mocks|
14
+ mocks.verify_partial_doubles = true
15
+ end
16
+
17
+ config.include(CliHelpers)
18
+ end
@@ -0,0 +1,17 @@
1
+
2
+ module CliHelpers
3
+ def polyspec(args={})
4
+ binary_location = APP_ROOT.join('bin', 'polyspec')
5
+ full_arg_list = convert_keys_to_switches(args)
6
+ `#{environment_variables} ruby -Ilib #{binary_location} #{full_arg_list} 2>&1`
7
+ end
8
+
9
+ def convert_keys_to_switches(args)
10
+ switched_args = args.map {|k, v| ["-#{k}", v] }
11
+ switched_args.flatten.join(' ')
12
+ end
13
+
14
+ def environment_variables
15
+ # Define me if you need to (e.g. GOPATH)
16
+ end
17
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: polyspec
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - TJ Taylor
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: httparty
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.13'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.13'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ description: |2
70
+ RSpec's DSL for writing tests for your app is fantastic. This gem
71
+ brings that DSL to all your apps.
72
+ email:
73
+ - dugancathal@gmail.com
74
+ executables:
75
+ - polyspec
76
+ extensions: []
77
+ extra_rdoc_files: []
78
+ files:
79
+ - ".gitignore"
80
+ - ".rspec"
81
+ - Gemfile
82
+ - LICENSE.txt
83
+ - README.md
84
+ - Rakefile
85
+ - bin/polyspec
86
+ - lib/polyspec.rb
87
+ - lib/polyspec/cli_option_parser.rb
88
+ - lib/polyspec/django_project_runner.rb
89
+ - lib/polyspec/golang_project_runner.rb
90
+ - lib/polyspec/runner_factory.rb
91
+ - lib/polyspec/test_setup_runner.rb
92
+ - lib/polyspec/version.rb
93
+ - polyspec.gemspec
94
+ - spec/features/django_spec.rb
95
+ - spec/features/goapp_spec.rb
96
+ - spec/fixtures/django-app/app/__init__.py
97
+ - spec/fixtures/django-app/app/settings.py
98
+ - spec/fixtures/django-app/app/urls.py
99
+ - spec/fixtures/django-app/app/wsgi.py
100
+ - spec/fixtures/django-app/manage.py
101
+ - spec/fixtures/django-app/spec/sanity_spec.rb
102
+ - spec/fixtures/go-app/src/stuffs/main.go
103
+ - spec/fixtures/go-app/src/stuffs/spec/main_spec.rb
104
+ - spec/spec_helper.rb
105
+ - spec/support/cli_helpers.rb
106
+ homepage: ''
107
+ licenses:
108
+ - MIT
109
+ metadata: {}
110
+ post_install_message:
111
+ rdoc_options: []
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ requirements: []
125
+ rubyforge_project:
126
+ rubygems_version: 2.2.2
127
+ signing_key:
128
+ specification_version: 4
129
+ summary: Write specs in ruby for ALL the languages
130
+ test_files:
131
+ - spec/features/django_spec.rb
132
+ - spec/features/goapp_spec.rb
133
+ - spec/fixtures/django-app/app/__init__.py
134
+ - spec/fixtures/django-app/app/settings.py
135
+ - spec/fixtures/django-app/app/urls.py
136
+ - spec/fixtures/django-app/app/wsgi.py
137
+ - spec/fixtures/django-app/manage.py
138
+ - spec/fixtures/django-app/spec/sanity_spec.rb
139
+ - spec/fixtures/go-app/src/stuffs/main.go
140
+ - spec/fixtures/go-app/src/stuffs/spec/main_spec.rb
141
+ - spec/spec_helper.rb
142
+ - spec/support/cli_helpers.rb