umts-microservices-engine 0.0.2

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: 75e14e03e11207896af79f0e5a102ff8a139e7cd
4
+ data.tar.gz: 37a40ed242523be25d32c9cb1369c57f1a73c546
5
+ SHA512:
6
+ metadata.gz: 9d6eb44c86793bf4345185fe4919dc11b6c99dfd7c601d3b6ccae09f112e56242e318b186e8b22928d20cd6b10f4cebbfdecaae7c80c9cca5eade528705a9cf8
7
+ data.tar.gz: 227bb25ff5044144774e1211f177963f15b8006032fa48b4f6497d8ee3411991c0e9ec207367a7ab489448a2bb36f09247a8b8ff21841529b70deee493b15133
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2016 UMass Transportation Services
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 all
13
+ 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 THE
21
+ SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+
8
+ APP_RAKEFILE = File.expand_path('../test/dummy/Rakefile', __FILE__)
9
+ load 'rails/tasks/engine.rake'
10
+ load 'rails/tasks/statistics.rake'
11
+
12
+ Bundler::GemHelper.install_tasks
13
+
14
+ require 'rake/testtask'
15
+
16
+ Rake::TestTask.new(:test) do |t|
17
+ t.libs << 'lib'
18
+ t.libs << 'test'
19
+ t.pattern = 'test/**/*_test.rb'
20
+ t.verbose = false
21
+ end
22
+
23
+ task default: :test
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ module MicroservicesEngine
3
+ class ApplicationController < ActionController::Base
4
+ end
5
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+ require_dependency 'microservices_engine/application_controller'
3
+
4
+ module MicroservicesEngine
5
+ module V1
6
+ class DataController < ApplicationController
7
+ def register
8
+ # TO-DO
9
+ # . . .
10
+
11
+ # Current assumption of example request format
12
+ #
13
+ # {
14
+ # 'build': 1.0.0,
15
+ # 'token': 'a72!j*^bQ34dE%SS$#haBd%67#cD',
16
+ # 'content': {
17
+ # {
18
+ # 'name': 'Endpoint 1'
19
+ # 'object': 'FieldTrip'
20
+ # 'url': 'http://example.com/microservices_engine/v1/data'
21
+ # },
22
+ # {
23
+ # 'name': 'Endpoint 2'
24
+ # 'object': 'Survey'
25
+ # 'url': 'http://potatoes.com/microservices_engine/v1/data'
26
+ # }
27
+ # }
28
+ # }
29
+ #
30
+
31
+ data = params['content']
32
+ data_objects = data.map { |d| d['object'] }
33
+
34
+ verify_token(params['token'])
35
+ verify_build(params['build'])
36
+
37
+ existing = Connection.all
38
+ in_request = existing.dup.to_a.keep_if { |c| data_objects.include? c.object }
39
+ not_in_request = existing - in_request
40
+
41
+ # Remove all objects not included in the request
42
+ not_in_request.each do |unwanted|
43
+ Connection.destroy(unwanted.id)
44
+ end
45
+
46
+ # 'Find and update' or 'Create' all remaining models
47
+ data.each do |endpoint|
48
+ desired = Connection.find_by object: endpoint['object']
49
+ if desired.present?
50
+ desired.update_attributes(
51
+ name: endpoint.require(:name),
52
+ url: endpoint.require(:url)
53
+ )
54
+ else
55
+ Connection.create(
56
+ name: endpoint.require(:name),
57
+ url: endpoint.require(:url),
58
+ object: endpoint.require(:object)
59
+ )
60
+ end
61
+ end
62
+ render json: { 'response': 200 }, status: :ok
63
+ end
64
+
65
+ private
66
+
67
+ def verify_token(token)
68
+ raise SecurityError, '(Stub) Invalid Token' unless MicroservicesEngine.valid_token?(token)
69
+ end
70
+
71
+ def verify_build(build)
72
+ # The build= method already has verification built-in
73
+ MicroservicesEngine.build = build
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ require 'net/http'
3
+
4
+ module MicroservicesEngine
5
+ class Connection < ActiveRecord::Base
6
+ validates :name, :url, :object, presence: true
7
+
8
+ def self.get(resource, path, params = {})
9
+ conn = Connection.find_by(object: resource.to_s) # Does :abc match "abc"?
10
+ conn.get(path, params) if conn.present?
11
+ end
12
+
13
+ def get(path, params = {})
14
+ # Example use:
15
+ # (connection object for FieldTrip).get([123223, public_trip_stops], {active_only: true})
16
+ # => queries endpoint: uri/123223/public_trip_stops
17
+ # => endpoint finds all FieldTrip objects that are active (param flag)
18
+ # => returns the response if the request was a success
19
+
20
+ # Assumption: url is followed by a `/`
21
+ uri = URI.parse(url + path.join('/'))
22
+ uri.query = URI.encode_www_form(params)
23
+
24
+ res = Net::HTTP.get_response(uri)
25
+ return res.body if res.is_a?(Net::HTTPSuccess)
26
+ end
27
+ end
28
+ end
data/config/routes.rb ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+ MicroservicesEngine::Engine.routes.draw do
3
+ namespace :v1 do
4
+ match '/data' => 'data#register', :via => :post
5
+ end
6
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+ class CreateMicroservicesEngineConnections < ActiveRecord::Migration
3
+ def change
4
+ create_table :microservices_engine_connections do |t|
5
+ t.string :name
6
+ t.string :object
7
+ t.string :url
8
+
9
+ t.timestamps null: false
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate install Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+ class InstallGenerator < Rails::Generators::Base
3
+ source_root File.expand_path('../templates', __FILE__)
4
+
5
+ def setup_initializer
6
+ template 'mse_router_info.yml', 'config/mse_router_info.yml'
7
+ copy_file 'microservices_engine.rb',
8
+ 'config/initializers/microservices_engine.rb'
9
+ end
10
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+ require 'net/http'
3
+ config_file = 'config/mse_router_info.yml'
4
+
5
+ unless File.file?(config_file)
6
+ raise IOError, '[MSE] > No router configuration YAML file found'
7
+ end
8
+
9
+ config_data = YAML.load_file(config_file)
10
+
11
+ if [config_data['name'], config_data['uri'], config_data['security_token']].any?(&:blank?)
12
+ raise '[MSE] > Please fill out config/mse_router_info.yml'
13
+ end
14
+
15
+ # Make sure the URI ends with a / character
16
+ router_uri = config['router_uri']
17
+
18
+ uri = config_data['uri']
19
+ uri += '/' if uri[-1] != '/'
20
+
21
+ res = Net::HTTP.post_form(
22
+ URI(router_uri),
23
+ 'name': config_data['name'],
24
+ 'url': uri,
25
+ 'models': config_data['accessible_models'],
26
+ 'security_token': config_data['security_token']
27
+ )
28
+
29
+ raise '[MSE] > The router API response was invalid' if res.code != '200'
@@ -0,0 +1,23 @@
1
+ # UMass Transit Microservices Engine
2
+ # Router API Data Endpoint Configuration
3
+
4
+ # REQUIRED field
5
+ # The name of the microservice
6
+ name: ''
7
+
8
+ # REQUIRED field
9
+ # The URI for the site hosting the microservice
10
+ # NOTE: Do not attach the /v1/data to this.
11
+ uri: ''
12
+
13
+ # REQUIRED field
14
+ # Verification token
15
+ security_token: ''
16
+
17
+ # REQUIRED Field
18
+ # Endpoint of Microservices router
19
+ router_uri: ''
20
+
21
+ # OPTIONAL field (leave blank if not applicable)
22
+ # The models that the service can give info on
23
+ accessible_models: []
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+ require 'net/http'
3
+ require 'net/https'
4
+ require 'microservices_engine/engine' if defined? Rails
5
+
6
+ module MicroservicesEngine
7
+ class << self
8
+ # Setter method for the `build` portion of the engine, includes various validations
9
+ def build=(b)
10
+ @build = b if Rails.env.test? && b == '1.1.1'
11
+
12
+ # ---------------- Semantic Versioning ---------------- #
13
+ # 1. All version INCREASES are VALID #
14
+ # 2. Version DECREASES are INVALID IF AND ONLY IF none #
15
+ # of the more importantversion numbers increase. #
16
+ # 3. That is to say... #
17
+ # a. A major decrease is never valid #
18
+ # b. A minor decrease is only valid when the major #
19
+ # version increases. #
20
+ # c. A revision decrease is only valid when either #
21
+ # the major or minor version increases. #
22
+ # ----------------------------------------------------- #
23
+
24
+ major, minor, rev = b.split('.').map(&:to_i)
25
+ cmajor, cminor, crev = build.split('.').map(&:to_i)
26
+
27
+ # ---------------------- Examples ---------------------- #
28
+ # 2.3.2 -> 1.3.2 1.2.3 -> 1.1.3 1.2.3 -> 0.2.3 #
29
+ # 1.2.3 -> 1.2.2 1.2.3 -> 1.1.2 1.2.3 -> 0.2.3 #
30
+ # ------------------------------------------------------ #
31
+ invalid_changes = [
32
+ cmajor > major,
33
+ cminor > minor && cmajor <= major,
34
+ crev > rev && cminor <= minor && cmajor <= major
35
+ ]
36
+
37
+ if invalid_changes.any?
38
+ raise 'Received version is older than existing. Now: #{build}. Given: #{b}'
39
+ end
40
+
41
+ @build = b
42
+ end
43
+
44
+ # Returns the engine's current build
45
+ def build
46
+ @build ||= '0.0.0'
47
+ end
48
+
49
+ # Reloads and returns the engine's current YML configuration
50
+ def reload_config
51
+ @config = YAML.load_file('config/mse_router_info.yml')
52
+ end
53
+
54
+ # Returns the engine's YML configuration, alias for `reload_config`
55
+ alias config reload_config
56
+
57
+ # Takes in a token and verifies against the engine's YML configuration files
58
+ # Params:
59
+ # +token+:: The token to test validity of
60
+ def valid_token?(token)
61
+ return token == 'TEST_ENV_VALID_TOKEN' if Rails.env.test?
62
+
63
+ valid_token = config['security_token']
64
+ raise 'Security token is not set! Please set it as soon as possible!' if valid_token.blank?
65
+
66
+ token == valid_token
67
+ end
68
+
69
+ # Redirects an engine `get` call to the appropriate resource
70
+ def get(resource, path, params = {})
71
+ MicroservicesEngine::Connection.get(resource, path, params)
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+ module MicroservicesEngine
3
+ class Engine < ::Rails::Engine
4
+ isolate_namespace MicroservicesEngine
5
+
6
+ config.generators do |g|
7
+ g.test_framework :rspec
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ module MicroservicesEngine
3
+ VERSION = '0.0.2'
4
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ # desc "Explaining what the task does"
3
+ # task :microservices_engine do
4
+ # # Task goes here
5
+ # end
@@ -0,0 +1,183 @@
1
+ # frozen_string_literal: true
2
+ require 'rails_helper'
3
+
4
+ # PLANNED FOR MOVE TO OTHER FILE
5
+ def change_build(v, b)
6
+ b['build'] = v
7
+ end
8
+
9
+ def relative_build(ma, mi, r)
10
+ [ma, mi, r].map { |ver| 1 + ver }.join('.')
11
+ end
12
+ # PLANNED FOR MOVE TO OTHER FILE
13
+
14
+ describe MicroservicesEngine::V1::DataController, type: :controller do
15
+ routes { MicroservicesEngine::Engine.routes }
16
+ def setup
17
+ @routes = MicroservicesEngine::Engine.routes
18
+ end
19
+
20
+ before(:each) do
21
+ MicroservicesEngine.build = '1.1.1'
22
+ @data = {
23
+ 'build': '1.1.2',
24
+ 'token': 'TEST_ENV_VALID_TOKEN',
25
+ 'content': [
26
+ {
27
+ 'name': 'Endpoint 1',
28
+ 'object': 'FieldTrip',
29
+ 'url': 'http://example.com/microservices_engine/v1/data'
30
+ },
31
+ {
32
+ 'name': 'Endpoint 2',
33
+ 'object': 'Survey',
34
+ 'url': 'http://potatoes.com/microservices_engine/v1/data'
35
+ }
36
+ ]
37
+ }
38
+ @changed_data = @data.deep_dup # A version of data that is changed for tests
39
+ end
40
+
41
+ describe 'POST #register' do
42
+ it 'responds' do
43
+ post :register, @data
44
+ expect(response.status).to be(200)
45
+ end
46
+
47
+ # Validating tokens
48
+ describe 'validating token' do
49
+ it 'accepts valid token' do
50
+ # 1. Expect submitting the data to not cause any issues
51
+
52
+ expect { post :register, @data }.not_to raise_error
53
+ end
54
+
55
+ it 'denies invalid token' do
56
+ # 1. Change base data to be an invalid token
57
+ # 2. Expect the request to cause an error.
58
+
59
+ @changed_data['token'] = 'mayonnaise_is_not_an_instrument_patrick'
60
+ expect { post :register, @changed_data }.to raise_error(SecurityError)
61
+ end
62
+ end
63
+
64
+ # The request updates the build version properly
65
+ describe 'updating MicroservicesEngine.build' do
66
+ context 'failing builds' do
67
+ failing_builds = [0, -1].repeated_permutation(3).to_a.map { |bld| relative_build(*bld) }
68
+ failing_builds -= ['1.1.1'] # this is a result of above but is a valid build
69
+
70
+ failing_builds.each do |failing_build|
71
+ it 'fails with older version #{failing_build}' do
72
+ change_build(failing_build, @changed_data)
73
+ expect { post :register, @changed_data }.to raise_error(RuntimeError)
74
+ end
75
+ end
76
+ end
77
+
78
+ context 'passing builds' do
79
+ passing_builds = [0, 1].repeated_permutation(3).to_a.map { |bld| relative_build(*bld) }
80
+
81
+ passing_builds.each do |passing_build|
82
+ it 'passes with newer version #{passing_build}' do
83
+ change_build(passing_build, @changed_data)
84
+ expect(MicroservicesEngine.build).to eq('1.1.1')
85
+ post :register, @changed_data
86
+ expect(MicroservicesEngine.build).to eq(passing_build)
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ # The request generates, modifies, and removes Connection
93
+ # objects as expected
94
+ describe 'resulting Connection models' do
95
+ before(:each) do
96
+ @extract = ->(d, key) { d[:content].collect { |c| c[key.to_sym] } }
97
+ @connection = MicroservicesEngine::Connection
98
+ end
99
+
100
+ context 'before the request' do
101
+ it 'has no objects' do
102
+ expect(@connection.count).to be(0)
103
+ end
104
+ end
105
+
106
+ describe 'new' do
107
+ before(:each) do
108
+ post :register, @data
109
+ end
110
+
111
+ it 'generates the models' do
112
+ expect(@connection.count).to be(2)
113
+ end
114
+
115
+ it 'generated the names' do
116
+ expect(@connection.all.map(&:name)).to eq(@extract.call(@data, :name))
117
+ end
118
+
119
+ it 'generated the urls' do
120
+ expect(@connection.all.map(&:url)).to eq(@extract.call(@data, :url))
121
+ end
122
+
123
+ it 'generated the objects' do
124
+ expect(@connection.all.map(&:object)).to eq(@extract.call(@data, :object))
125
+ end
126
+
127
+ it 'adds model when new data appears' do
128
+ new_data = {
129
+ 'name': 'Endpoint 2',
130
+ 'object': 'Potatoes',
131
+ 'url': 'pota://toe.sareawes.ome'
132
+ }
133
+ @changed_data[:content].append(new_data)
134
+
135
+ expect { post :register, @changed_data }
136
+ .to change { @connection.count }
137
+ .by(1)
138
+ end
139
+ end
140
+
141
+ describe 'editing' do
142
+ before(:each) do
143
+ post :register, @data
144
+ end
145
+
146
+ it 'updates the name' do
147
+ @changed_data[:content][0][:name] = 'Potatoes'
148
+ expect { post :register, @changed_data }
149
+ .to change { @connection.all.map(&:name) }
150
+ .from(@extract.call(@data, :name))
151
+ .to(@extract.call(@changed_data, :name))
152
+ end
153
+
154
+ it 'updates the url' do
155
+ @changed_data[:content][0][:url] = 'pota://toe.s/'
156
+ expect { post :register, @changed_data }
157
+ .to change { @connection.all.map(&:url) }
158
+ .from(@extract.call(@data, :url))
159
+ .to(@extract.call(@changed_data, :url))
160
+ end
161
+
162
+ it 'swaps information to other model' do
163
+ @changed_data[:content][0][:object] = 'SomeOtherObject'
164
+ expect { post :register, @changed_data }
165
+ .not_to change { @connection.count }
166
+ end
167
+ end
168
+
169
+ describe 'removing' do
170
+ before(:each) do
171
+ post :register, @data
172
+ end
173
+
174
+ it 'removes the model' do
175
+ @changed_data[:content].delete_at(0)
176
+ expect { post :register, @changed_data }
177
+ .to change { @connection.count }
178
+ .by(-1)
179
+ end
180
+ end
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require 'generators/install/install_generator'
4
+
5
+ module MicroservicesEngine
6
+ class InstallGeneratorTest < Rails::Generators::TestCase
7
+ tests InstallGenerator
8
+ destination Rails.root.join('tmp/generators')
9
+ setup :prepare_destination
10
+
11
+ # test "generator runs without errors" do
12
+ # assert_nothing_raised do
13
+ # run_generator ["arguments"]
14
+ # end
15
+ # end
16
+ end
17
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ class MicroservicesEngineTest < ActiveSupport::TestCase
5
+ test 'truth' do
6
+ assert_kind_of Module, MicroservicesEngine
7
+ end
8
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ require 'rails_helper'
3
+
4
+ describe MicroservicesEngine::Connection do
5
+ before(:each) do
6
+ @conn = MicroservicesEngine::Connection.create(
7
+ name: 'Connection 1',
8
+ url: 'http://example.com/',
9
+ object: 'ExampleModel'
10
+ )
11
+ @path = %w(test tset)
12
+ stub_request(:get, @conn.url + @path.join('/'))
13
+ .with(headers: {
14
+ 'Accept' => '*/*',
15
+ 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
16
+ 'Host' => 'example.com',
17
+ 'User-Agent' => 'Ruby'
18
+ })
19
+ .to_return(status: 200, body: '', headers: {})
20
+ end
21
+
22
+ describe 'self.get' do
23
+ # it 'implies params' do
24
+ # expect(@conn).to receive(:get).with(@path, {})
25
+ # resp = MicroservicesEngine::Connection.get('ExampleModel', @path)
26
+ # end
27
+ end
28
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
3
+ ENV['RAILS_ENV'] ||= 'test'
4
+ require File.expand_path('../../test/dummy/config/environment', __FILE__)
5
+ # Prevent database truncation if the environment is production
6
+ abort('The Rails environment is running in production mode!') if Rails.env.production?
7
+ require 'spec_helper'
8
+ require 'rspec/rails'
9
+ require 'webmock/rspec'
10
+ # Add additional requires below this line. Rails is not loaded until this point!
11
+
12
+ # Requires supporting ruby files with custom matchers and macros, etc, in
13
+ # spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
14
+ # run as spec files by default. This means that files in spec/support that end
15
+ # in _spec.rb will both be required and run as specs, causing the specs to be
16
+ # run twice. It is recommended that you do not name files matching this glob to
17
+ # end with _spec.rb. You can configure this pattern with the --pattern
18
+ # option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
19
+ #
20
+ # The following line is provided for convenience purposes. It has the downside
21
+ # of increasing the boot-up time by auto-requiring all files in the support
22
+ # directory. Alternatively, in the individual `*_spec.rb` files, manually
23
+ # require only the support files necessary.
24
+ #
25
+ # Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
26
+
27
+ # Checks for pending migration and applies them before tests are run.
28
+ # If you are not using ActiveRecord, you can remove this line.
29
+ ActiveRecord::Migration.maintain_test_schema!
30
+
31
+ RSpec.configure do |config|
32
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
33
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
34
+
35
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
36
+ # examples within a transaction, remove the following line or assign false
37
+ # instead of true.
38
+ config.use_transactional_fixtures = true
39
+
40
+ # RSpec Rails can automatically mix in different behaviours to your tests
41
+ # based on their file location, for example enabling you to call `get` and
42
+ # `post` in specs under `spec/controllers`.
43
+ #
44
+ # You can disable this behaviour by removing the line below, and instead
45
+ # explicitly tag your specs with their type, e.g.:
46
+ #
47
+ # RSpec.describe UsersController, :type => :controller do
48
+ # # ...
49
+ # end
50
+ #
51
+ # The different available types are documented in the features, such as in
52
+ # https://relishapp.com/rspec/rspec-rails/docs
53
+ config.infer_spec_type_from_file_location!
54
+
55
+ # Filter lines from Rails gems in backtraces.
56
+ config.filter_rails_from_backtrace!
57
+ # arbitrary gems may also be filtered via:
58
+ # config.filter_gems_from_backtrace("gem name")
59
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+ # This file was generated by the `rails generate rspec:install` command. Conventionally, all
3
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
4
+ # The generated `.rspec` file contains `--require spec_helper` which will cause
5
+ # this file to always be loaded, without a need to explicitly require it in any
6
+ # files.
7
+ #
8
+ # Given that it is always loaded, you are encouraged to keep this file as
9
+ # light-weight as possible. Requiring heavyweight dependencies from this file
10
+ # will add to the boot time of your test suite on EVERY test run, even for an
11
+ # individual file that may not need all of that loaded. Instead, consider making
12
+ # a separate helper file that requires the additional dependencies and performs
13
+ # the additional setup, and require it from the spec files that actually need
14
+ # it.
15
+ #
16
+ # The `.rspec` file also contains a few flags that are not defaults but that
17
+ # users commonly want.
18
+ #
19
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
20
+ RSpec.configure do |config|
21
+ # rspec-expectations config goes here. You can use an alternate
22
+ # assertion/expectation library such as wrong or the stdlib/minitest
23
+ # assertions if you prefer.
24
+ config.expect_with :rspec do |expectations|
25
+ # This option will default to `true` in RSpec 4. It makes the `description`
26
+ # and `failure_message` of custom matchers include text for helper methods
27
+ # defined using `chain`, e.g.:
28
+ # be_bigger_than(2).and_smaller_than(4).description
29
+ # # => "be bigger than 2 and smaller than 4"
30
+ # ...rather than:
31
+ # # => "be bigger than 2"
32
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
33
+ end
34
+
35
+ # rspec-mocks config goes here. You can use an alternate test double
36
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
37
+ config.mock_with :rspec do |mocks|
38
+ # Prevents you from mocking or stubbing a method that does not exist on
39
+ # a real object. This is generally recommended, and will default to
40
+ # `true` in RSpec 4.
41
+ mocks.verify_partial_doubles = true
42
+ end
43
+
44
+ # The settings below are suggested to provide a good initial experience
45
+ # with RSpec, but feel free to customize to your heart's content.
46
+ # # These two settings work together to allow you to limit a spec run
47
+ # # to individual examples or groups you care about by tagging them with
48
+ # # `:focus` metadata. When nothing is tagged with `:focus`, all examples
49
+ # # get run.
50
+ # config.filter_run :focus
51
+ # config.run_all_when_everything_filtered = true
52
+ #
53
+ # # Allows RSpec to persist some state between runs in order to support
54
+ # # the `--only-failures` and `--next-failure` CLI options. We recommend
55
+ # # you configure your source control system to ignore this file.
56
+ # config.example_status_persistence_file_path = "spec/examples.txt"
57
+ #
58
+ # # Limits the available syntax to the non-monkey patched syntax that is
59
+ # # recommended. For more details, see:
60
+ # # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
61
+ # # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
62
+ # # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
63
+ # config.disable_monkey_patching!
64
+ #
65
+ # # Many RSpec users commonly either run the entire suite or an individual
66
+ # # file, and it's useful to allow more verbose output when running an
67
+ # # individual spec file.
68
+ # if config.files_to_run.one?
69
+ # # Use the documentation formatter for detailed output,
70
+ # # unless a formatter has already been configured
71
+ # # (e.g. via a command-line flag).
72
+ # config.default_formatter = 'doc'
73
+ # end
74
+ #
75
+ # # Print the 10 slowest examples and example groups at the
76
+ # # end of the spec run, to help surface which specs are running
77
+ # # particularly slow.
78
+ # config.profile_examples = 10
79
+ #
80
+ # # Run specs in random order to surface order dependencies. If you find an
81
+ # # order dependency and want to debug it, you can fix the order by providing
82
+ # # the seed, which is printed after each run.
83
+ # # --seed 1234
84
+ # config.order = :random
85
+ #
86
+ # # Seed global randomization in this process using the `--seed` CLI option.
87
+ # # Setting this allows you to use `--seed` to deterministically reproduce
88
+ # # test failures related to randomization by passing the same `--seed` value
89
+ # # as the one that triggered the failure.
90
+ # Kernel.srand config.seed
91
+ end
metadata ADDED
@@ -0,0 +1,211 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: umts-microservices-engine
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - UMass Transportation Services
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-11-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec-rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 4.2.7.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 4.2.7.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-rails
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: simplecov
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: sqlite3
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: Simple UMTS inter-service communication network
154
+ email:
155
+ - transit-it@admin.umass.edu
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - LICENSE
161
+ - Rakefile
162
+ - app/controllers/microservices_engine/application_controller.rb
163
+ - app/controllers/microservices_engine/v1/data_controller.rb
164
+ - app/models/microservices_engine/connection.rb
165
+ - config/routes.rb
166
+ - db/migrate/20160914202818_create_microservices_engine_connections.rb
167
+ - lib/generators/install/USAGE
168
+ - lib/generators/install/install_generator.rb
169
+ - lib/generators/install/templates/microservices_engine.rb
170
+ - lib/generators/install/templates/mse_router_info.yml
171
+ - lib/microservices_engine.rb
172
+ - lib/microservices_engine/engine.rb
173
+ - lib/microservices_engine/version.rb
174
+ - lib/tasks/microservices_engine_tasks.rake
175
+ - spec/controllers/data_controller_spec.rb
176
+ - spec/microservices_engine/install_generator_spec.rb.old
177
+ - spec/microservices_engine_spec.rb
178
+ - spec/models/connection_spec.rb
179
+ - spec/rails_helper.rb
180
+ - spec/spec_helper.rb
181
+ homepage: https://github.com/umts/microservices-engine
182
+ licenses:
183
+ - MIT
184
+ metadata: {}
185
+ post_install_message:
186
+ rdoc_options: []
187
+ require_paths:
188
+ - lib
189
+ required_ruby_version: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ required_rubygems_version: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - ">="
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ requirements: []
200
+ rubyforge_project:
201
+ rubygems_version: 2.5.1
202
+ signing_key:
203
+ specification_version: 4
204
+ summary: Simple UMTS inter-service communication network
205
+ test_files:
206
+ - spec/controllers/data_controller_spec.rb
207
+ - spec/microservices_engine/install_generator_spec.rb.old
208
+ - spec/microservices_engine_spec.rb
209
+ - spec/models/connection_spec.rb
210
+ - spec/rails_helper.rb
211
+ - spec/spec_helper.rb