softwear 2.0.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 +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: []
|