softwear 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +37 -0
- data/app/assets/javascripts/softwear/application.js +13 -0
- data/app/assets/javascripts/softwear/error_utils.js.coffee +82 -0
- data/app/assets/javascripts/softwear/modals.js.coffee +171 -0
- data/app/assets/stylesheets/softwear/application.css +33 -0
- data/app/controllers/softwear/application_controller.rb +4 -0
- data/app/controllers/softwear/error_reports_controller.rb +37 -0
- data/app/helpers/softwear/application_helper.rb +4 -0
- data/app/helpers/softwear/emails_helper.rb +9 -0
- data/app/mailers/error_report_mailer.rb +53 -0
- data/app/views/error_report_mailer/send_report.html.erb +30 -0
- data/app/views/layouts/softwear/application.html.erb +14 -0
- data/app/views/softwear/errors/_error.html.erb +35 -0
- data/app/views/softwear/errors/internal_server_error.html.erb +6 -0
- data/app/views/softwear/errors/internal_server_error.js.erb +10 -0
- data/bin/rails +12 -0
- data/config/routes.rb +3 -0
- data/lib/softwear/auth/belongs_to_user.rb +43 -0
- data/lib/softwear/auth/controller.rb +43 -0
- data/lib/softwear/auth/helper.rb +35 -0
- data/lib/softwear/auth/model.rb +16 -0
- data/lib/softwear/auth/spec.rb +62 -0
- data/lib/softwear/auth/standard_model.rb +498 -0
- data/lib/softwear/auth/stubbed_model.rb +130 -0
- data/lib/softwear/auth/token_authentication.rb +72 -0
- data/lib/softwear/engine.rb +5 -0
- data/lib/softwear/error_catcher.rb +65 -0
- data/lib/softwear/library/api_controller.rb +169 -0
- data/lib/softwear/library/capistrano.rb +94 -0
- data/lib/softwear/library/controller_authentication.rb +145 -0
- data/lib/softwear/library/enqueue.rb +87 -0
- data/lib/softwear/library/spec.rb +127 -0
- data/lib/softwear/library/tcp_server.rb +107 -0
- data/lib/softwear/version.rb +3 -0
- data/lib/softwear.rb +107 -0
- metadata +172 -0
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'sidekiq'
|
2
|
+
|
3
|
+
module Softwear
|
4
|
+
module Library
|
5
|
+
module Enqueue
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
class Worker
|
9
|
+
include ::Sidekiq::Worker
|
10
|
+
|
11
|
+
def perform(model_name, id, method, *args)
|
12
|
+
model_name.constantize.find(id).send(method, *args)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module ClassMethods
|
17
|
+
def enqueue(*method_names)
|
18
|
+
if method_names.last.is_a?(Hash)
|
19
|
+
options = method_names.pop
|
20
|
+
else
|
21
|
+
options = {}
|
22
|
+
end
|
23
|
+
raise "enqueue what?" if method_names.empty?
|
24
|
+
|
25
|
+
# We will extend the class mod and include the instance mod.
|
26
|
+
# This allows us to override the generated enqueue methods and
|
27
|
+
# call `super`.
|
28
|
+
#
|
29
|
+
enqueue_class_mod = Module.new
|
30
|
+
enqueue_instance_mod = Module.new
|
31
|
+
|
32
|
+
method_names.each do |method_name|
|
33
|
+
enqueue_class_mod.module_eval <<-RUBY, __FILE__, __LINE__ + 1
|
34
|
+
def #{method_name}(id, *args)
|
35
|
+
find(id).#{method_name}(*args)
|
36
|
+
end
|
37
|
+
RUBY
|
38
|
+
|
39
|
+
if Rails.env.production?
|
40
|
+
enqueue_class_mod.module_eval <<-RUBY, __FILE__, __LINE__ + 1
|
41
|
+
def enqueue_#{method_name}(id, *args)
|
42
|
+
::Sidekiq::Client.push(
|
43
|
+
'class' => ::Softwear::Lib::Enqueue::Worker,
|
44
|
+
'args' => [name, id, #{method_name.inspect}] + args,
|
45
|
+
'queue' => #{options[:queue].inspect}
|
46
|
+
)
|
47
|
+
end
|
48
|
+
RUBY
|
49
|
+
|
50
|
+
enqueue_instance_mod.module_eval <<-RUBY, __FILE__, __LINE__ + 1
|
51
|
+
def enqueue_#{method_name}(*args)
|
52
|
+
self.class.enqueue_#{method_name}(id, *args)
|
53
|
+
end
|
54
|
+
RUBY
|
55
|
+
else
|
56
|
+
enqueue_class_mod.module_eval <<-RUBY, __FILE__, __LINE__ + 1
|
57
|
+
def enqueue_#{method_name}(id, *args)
|
58
|
+
self.#{method_name}(id, *args)
|
59
|
+
end
|
60
|
+
RUBY
|
61
|
+
|
62
|
+
enqueue_instance_mod.module_eval <<-RUBY, __FILE__, __LINE__ + 1
|
63
|
+
def enqueue_#{method_name}(*args)
|
64
|
+
self.#{method_name}(*args)
|
65
|
+
end
|
66
|
+
RUBY
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
send :extend, enqueue_class_mod
|
71
|
+
send :include, enqueue_instance_mod
|
72
|
+
|
73
|
+
r = method_names.map { |m| "enqueue_#{m}".to_sym }
|
74
|
+
r.size == 1 ? r.first : r
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
included do
|
79
|
+
extend ClassMethods
|
80
|
+
|
81
|
+
def enqueue(method_name, *args)
|
82
|
+
send("enqueue_#{method_name}", *args)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module Softwear::Library
|
4
|
+
module Spec
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
module CapybaraHelpers
|
8
|
+
def wait_for_ajax
|
9
|
+
begin
|
10
|
+
Timeout.timeout(Capybara.default_wait_time) do
|
11
|
+
wait_for_jquery
|
12
|
+
loop until finished_all_ajax_requests?
|
13
|
+
end
|
14
|
+
rescue
|
15
|
+
sleep 0.1
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def finished_all_ajax_requests?
|
20
|
+
page.evaluate_script('jQuery.active').zero?
|
21
|
+
end
|
22
|
+
|
23
|
+
def wait_for_redirect
|
24
|
+
original_url = current_path
|
25
|
+
until current_path != original_url
|
26
|
+
sleep(0.1)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def wait_for_jquery
|
31
|
+
until page.evaluate_script('jQuery.active') == 0
|
32
|
+
sleep(0.1)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def accept_alert
|
37
|
+
page.evaluate_script('window.confirm = function() { return true; }')
|
38
|
+
yield
|
39
|
+
end
|
40
|
+
|
41
|
+
def dismiss_alert
|
42
|
+
page.evaluate_script('window.confirm = function() { return false; }')
|
43
|
+
yield
|
44
|
+
# Restore existing default
|
45
|
+
page.evaluate_script('window.confirm = function() { return true; }')
|
46
|
+
end
|
47
|
+
|
48
|
+
def eventually_fill_in(field, options={})
|
49
|
+
page.should have_css('#' + field)
|
50
|
+
fill_in field, options
|
51
|
+
end
|
52
|
+
|
53
|
+
def within_row(num, &block)
|
54
|
+
if RSpec.current_example.metadata[:js]
|
55
|
+
within("table.index tbody tr:nth-child(#{num})", &block)
|
56
|
+
else
|
57
|
+
within(:xpath, all('table.index tbody tr')[num-1].path, &block)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def column_text(num)
|
62
|
+
if RSpec.current_example.metadata[:js]
|
63
|
+
find("td:nth-child(#{num})").text
|
64
|
+
else
|
65
|
+
all('td')[num-1].text
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def find_label_by_text(text, options = {})
|
70
|
+
label = find_label(text)
|
71
|
+
|
72
|
+
if !options[:try] && label.nil?
|
73
|
+
raise "Could not find label by text #{text}"
|
74
|
+
end
|
75
|
+
|
76
|
+
label
|
77
|
+
end
|
78
|
+
|
79
|
+
def find_label(text)
|
80
|
+
first(:xpath, "//label[text()[contains(.,'#{text}')]]")
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
module Select2
|
86
|
+
def select2(text, options)
|
87
|
+
label = find_label_by_text(options[:from], try: true)
|
88
|
+
if label
|
89
|
+
selector = "select[name='#{label['for']}']+span,select[id='#{label['for']}']+span"
|
90
|
+
else
|
91
|
+
selector = "#{options[:from]}+span"
|
92
|
+
end
|
93
|
+
|
94
|
+
if options[:last]
|
95
|
+
all(selector).last.click
|
96
|
+
else
|
97
|
+
find(selector).click
|
98
|
+
end
|
99
|
+
|
100
|
+
old_scopes = page.instance_variable_get(:@scopes)
|
101
|
+
page.instance_variable_set(:@scopes, [nil])
|
102
|
+
|
103
|
+
find('input.select2-search__field').set(text)
|
104
|
+
sleep options[:wait_before_click] if options[:wait_before_click]
|
105
|
+
result = first('li.select2-results__option')
|
106
|
+
if result.nil? || result.text == "No results found"
|
107
|
+
raise %(No results matching "#{text}" found during select2)
|
108
|
+
else
|
109
|
+
result.click
|
110
|
+
end
|
111
|
+
|
112
|
+
ensure
|
113
|
+
page.instance_variable_set(:@scopes, old_scopes) if old_scopes
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
included do
|
118
|
+
include Warden::Test::Helpers
|
119
|
+
Warden.test_mode!
|
120
|
+
|
121
|
+
RSpec.configure do |config|
|
122
|
+
config.include CapybaraHelpers, type: :feature
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
def split(string, limit = nil)
|
2
|
+
string.split(/\s+/, limit)
|
3
|
+
end
|
4
|
+
|
5
|
+
def report_error(client, whole_command, error)
|
6
|
+
$stderr.puts "=== ERROR WHILE PROCESSING THE COMMAND \"#{whole_command}\" ===\n"\
|
7
|
+
"#{error.class.name}: #{error.message}\n#{error.backtrace.join("\n")}"
|
8
|
+
client.puts "sorry"
|
9
|
+
end
|
10
|
+
|
11
|
+
def dev_log(*a)
|
12
|
+
$stdout.puts(*a) if Rails.env.development?
|
13
|
+
end
|
14
|
+
|
15
|
+
def log(*a)
|
16
|
+
$stdout.puts(*a) unless Rails.env.test?
|
17
|
+
end
|
18
|
+
|
19
|
+
# TODO for production, we want to use the SSL server instead of straight up TCP.
|
20
|
+
|
21
|
+
# ==== Send Format: =======
|
22
|
+
# One line strings: "#{command} #{arg1} #{arg2} #{etc}"
|
23
|
+
# The last argument, depending on the command, may contain spaces (but usually does not need to)
|
24
|
+
# =========================
|
25
|
+
# === Receive Format: =====
|
26
|
+
# Usually one string, like "yes", or "no".
|
27
|
+
# Returns "denied" if an unauthorized command was attempted.
|
28
|
+
# Returns "invalid" if an invalid command was attempted.
|
29
|
+
# Returns "sorry" if an error was raised while processing the command.
|
30
|
+
# Can be a json argument, often following "yes ".
|
31
|
+
# =========================
|
32
|
+
def address_of(socket)
|
33
|
+
_family, port, name, host = socket.addr
|
34
|
+
if host == name
|
35
|
+
"#{host}:#{port}"
|
36
|
+
else
|
37
|
+
"#{name}(#{host}):#{port}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def start_server!(*args)
|
42
|
+
log "Connecting...!"
|
43
|
+
|
44
|
+
if args.size > 1
|
45
|
+
port = args.first
|
46
|
+
else
|
47
|
+
port = ENV['port'] || ENV['PORT'] || 2900
|
48
|
+
end
|
49
|
+
|
50
|
+
server = TCPServer.new port
|
51
|
+
log "Ready! Using \"#{ActiveRecord::Base.connection.current_database}\" database"
|
52
|
+
|
53
|
+
client_count = 0
|
54
|
+
commands = args.last
|
55
|
+
|
56
|
+
loop do
|
57
|
+
Thread.start(server.accept) do |client|
|
58
|
+
client_count += 1
|
59
|
+
dev_log "New client! ##{client_count} #{address_of client}"
|
60
|
+
|
61
|
+
if Rails.env.development?
|
62
|
+
response_logger = Module.new do
|
63
|
+
def puts(s)
|
64
|
+
$stdout.puts "==> #{s}"
|
65
|
+
super
|
66
|
+
end
|
67
|
+
end
|
68
|
+
client.singleton_class.send :include, response_logger
|
69
|
+
end
|
70
|
+
|
71
|
+
while line_in = client.gets.chomp
|
72
|
+
log "Processing \"#{line_in}\"" if Rails.env.test?
|
73
|
+
|
74
|
+
command, rest_of_command = split(line_in, 2)
|
75
|
+
|
76
|
+
before = Time.now
|
77
|
+
begin
|
78
|
+
command = commands[command.downcase.to_sym]
|
79
|
+
|
80
|
+
if command.nil?
|
81
|
+
log "SOMEONE attempted invalid command: \"#{line_in}\""
|
82
|
+
else
|
83
|
+
dev_log "<== #{line_in}"
|
84
|
+
ActiveRecord::Base.connection_pool.with_connection do
|
85
|
+
command.call(client, rest_of_command)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
rescue StandardError => e
|
90
|
+
report_error(client, line_in, e)
|
91
|
+
rescue Exception => e
|
92
|
+
report_error(client, line_in, e)
|
93
|
+
break
|
94
|
+
end
|
95
|
+
after = Time.now
|
96
|
+
|
97
|
+
ms = (after - before) * 1000
|
98
|
+
dev_log %((#{'%.2f' % ms}ms) from #{address_of(client)})
|
99
|
+
dev_log ""
|
100
|
+
end
|
101
|
+
|
102
|
+
client_count -= 1
|
103
|
+
client.close rescue nil
|
104
|
+
dev_log "Client disconnected. #{address_of client}"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
data/lib/softwear.rb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'softwear/engine'
|
2
|
+
require 'softwear/version'
|
3
|
+
require 'softwear/error_catcher'
|
4
|
+
|
5
|
+
require "softwear/library/spec"
|
6
|
+
require "softwear/library/api_controller"
|
7
|
+
begin
|
8
|
+
require "softwear/library/enqueue"
|
9
|
+
rescue LoadError
|
10
|
+
end
|
11
|
+
|
12
|
+
require "softwear/library/controller_authentication"
|
13
|
+
require "softwear/auth/helper"
|
14
|
+
require "softwear/auth/model"
|
15
|
+
require "softwear/auth/belongs_to_user"
|
16
|
+
require "softwear/auth/spec"
|
17
|
+
require "softwear/auth/token_authentication"
|
18
|
+
|
19
|
+
module Softwear
|
20
|
+
GEMFILE_OPENER = "# === BEGIN SOFTWEAR LIB GEMS === #"
|
21
|
+
GEMFILE_CLOSER = "# === END SOFTWEAR LIB GEMS === #"
|
22
|
+
|
23
|
+
COMMON_GEMS = %(
|
24
|
+
gem 'rails', '~> 4.2.3'
|
25
|
+
|
26
|
+
gem 'mysql2'
|
27
|
+
gem 'sass-rails'
|
28
|
+
gem 'uglifier', '>= 1.3.0'
|
29
|
+
gem 'coffee-rails', '~> 4.0.0'
|
30
|
+
gem 'bootstrap-sass', '~> 3.2.0'
|
31
|
+
gem 'activeresource'
|
32
|
+
gem 'jquery-rails'
|
33
|
+
gem 'jquery-ui-rails'
|
34
|
+
gem 'hirb'
|
35
|
+
gem 'momentjs-rails', '~> 2.9.0'
|
36
|
+
gem 'bootstrap3-datetimepicker-rails', '4.7.14'
|
37
|
+
gem 'js-routes'
|
38
|
+
gem 'inherited_resources'
|
39
|
+
gem 'devise'
|
40
|
+
gem 'figaro'
|
41
|
+
gem 'paranoia', '~> 2.0'
|
42
|
+
gem 'paperclip'
|
43
|
+
gem 'kaminari'
|
44
|
+
gem 'whenever'
|
45
|
+
gem 'dumpsync', git: 'git://github.com/AnnArborTees/dumpsync.git'
|
46
|
+
gem 'bootstrap_form'
|
47
|
+
gem 'acts_as_warnable', git: 'git://github.com/AnnArborTees/acts_as_warnable.git'
|
48
|
+
|
49
|
+
group :development do
|
50
|
+
gem 'capistrano', '~> 3.2.0'
|
51
|
+
gem 'capistrano-rails'
|
52
|
+
gem 'capistrano-rvm', github: 'AnnArborTees/rvm'
|
53
|
+
gem 'capistrano-bundler', github: 'AnnArborTees/bundler'
|
54
|
+
gem 'better_errors', '>= 0.3.2'
|
55
|
+
gem 'binding_of_caller'
|
56
|
+
end
|
57
|
+
|
58
|
+
group :development, :test do
|
59
|
+
gem 'byebug', platforms: :mri
|
60
|
+
gem 'rubinius-debugger', platforms: :rbx
|
61
|
+
end
|
62
|
+
|
63
|
+
group :test do
|
64
|
+
gem "rspec-rails", "~> 3.2.0"
|
65
|
+
gem 'factory_girl_rails', '>= 4.2.0', require: true
|
66
|
+
gem 'capybara', '~> 2.4'
|
67
|
+
gem 'capybara-webkit'
|
68
|
+
gem 'webmock', require: false
|
69
|
+
gem 'rspec-mocks'
|
70
|
+
gem 'rspec-retry'
|
71
|
+
gem 'email_spec'
|
72
|
+
gem 'selenium-webdriver'
|
73
|
+
gem 'shoulda-matchers'
|
74
|
+
end
|
75
|
+
)
|
76
|
+
|
77
|
+
def self.fix_sort_argument_error_on_rubinius
|
78
|
+
# Rubinius calls Enumerator#sort! within Enumerator#sort_by,
|
79
|
+
# # and Mail::PartsList calls sort_by within sort!... See the
|
80
|
+
# problem?
|
81
|
+
|
82
|
+
if RUBY_ENGINE == 'rbx'
|
83
|
+
require 'mail'
|
84
|
+
|
85
|
+
Mail::PartsList.class_eval do
|
86
|
+
def map!(&block)
|
87
|
+
Mail::PartsList.new(collect(&block))
|
88
|
+
end
|
89
|
+
|
90
|
+
def sort!(order = nil)
|
91
|
+
return super() if order.nil?
|
92
|
+
|
93
|
+
i = 0
|
94
|
+
sorted = self.sort_by do |a|
|
95
|
+
[get_order_value(a, order), i += 1]
|
96
|
+
end
|
97
|
+
self.clear
|
98
|
+
sorted.each(&self.method(:<<))
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.fix_state_machine_around_validation
|
105
|
+
StateMachine::Integrations::ActiveModel.instance_eval { public :around_validation }
|
106
|
+
end
|
107
|
+
end
|
metadata
ADDED
@@ -0,0 +1,172 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: softwear
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Nigel Baillie
|
8
|
+
- Stefan Gale
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2016-11-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rails
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '4.2'
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 4.2.7.1
|
24
|
+
type: :runtime
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
requirements:
|
28
|
+
- - "~>"
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '4.2'
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 4.2.7.1
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: activesupport
|
36
|
+
requirement: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 4.2.5
|
41
|
+
type: :runtime
|
42
|
+
prerelease: false
|
43
|
+
version_requirements: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 4.2.5
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: sqlite3
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: bundler
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.7'
|
69
|
+
type: :development
|
70
|
+
prerelease: false
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.7'
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: rake
|
78
|
+
requirement: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '10.0'
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '10.0'
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
name: rspec
|
92
|
+
requirement: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 3.2.0
|
97
|
+
type: :development
|
98
|
+
prerelease: false
|
99
|
+
version_requirements: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 3.2.0
|
104
|
+
description: Re-worked softwear-lib gem.
|
105
|
+
email:
|
106
|
+
- nigel@annarbortees.com
|
107
|
+
- stefan@annarbortees.com
|
108
|
+
executables: []
|
109
|
+
extensions: []
|
110
|
+
extra_rdoc_files: []
|
111
|
+
files:
|
112
|
+
- MIT-LICENSE
|
113
|
+
- Rakefile
|
114
|
+
- app/assets/javascripts/softwear/application.js
|
115
|
+
- app/assets/javascripts/softwear/error_utils.js.coffee
|
116
|
+
- app/assets/javascripts/softwear/modals.js.coffee
|
117
|
+
- app/assets/stylesheets/softwear/application.css
|
118
|
+
- app/controllers/softwear/application_controller.rb
|
119
|
+
- app/controllers/softwear/error_reports_controller.rb
|
120
|
+
- app/helpers/softwear/application_helper.rb
|
121
|
+
- app/helpers/softwear/emails_helper.rb
|
122
|
+
- app/mailers/error_report_mailer.rb
|
123
|
+
- app/views/error_report_mailer/send_report.html.erb
|
124
|
+
- app/views/layouts/softwear/application.html.erb
|
125
|
+
- app/views/softwear/errors/_error.html.erb
|
126
|
+
- app/views/softwear/errors/internal_server_error.html.erb
|
127
|
+
- app/views/softwear/errors/internal_server_error.js.erb
|
128
|
+
- bin/rails
|
129
|
+
- config/routes.rb
|
130
|
+
- lib/softwear.rb
|
131
|
+
- lib/softwear/auth/belongs_to_user.rb
|
132
|
+
- lib/softwear/auth/controller.rb
|
133
|
+
- lib/softwear/auth/helper.rb
|
134
|
+
- lib/softwear/auth/model.rb
|
135
|
+
- lib/softwear/auth/spec.rb
|
136
|
+
- lib/softwear/auth/standard_model.rb
|
137
|
+
- lib/softwear/auth/stubbed_model.rb
|
138
|
+
- lib/softwear/auth/token_authentication.rb
|
139
|
+
- lib/softwear/engine.rb
|
140
|
+
- lib/softwear/error_catcher.rb
|
141
|
+
- lib/softwear/library/api_controller.rb
|
142
|
+
- lib/softwear/library/capistrano.rb
|
143
|
+
- lib/softwear/library/controller_authentication.rb
|
144
|
+
- lib/softwear/library/enqueue.rb
|
145
|
+
- lib/softwear/library/spec.rb
|
146
|
+
- lib/softwear/library/tcp_server.rb
|
147
|
+
- lib/softwear/version.rb
|
148
|
+
homepage: http://annarbortees.com/
|
149
|
+
licenses:
|
150
|
+
- MIT
|
151
|
+
metadata: {}
|
152
|
+
post_install_message:
|
153
|
+
rdoc_options: []
|
154
|
+
require_paths:
|
155
|
+
- softwear
|
156
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - ">="
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
requirements: []
|
167
|
+
rubyforge_project:
|
168
|
+
rubygems_version: 2.4.8
|
169
|
+
signing_key:
|
170
|
+
specification_version: 4
|
171
|
+
summary: Common gems and logic for all softwear apps.
|
172
|
+
test_files: []
|