Skip to content
Browse files

Get this stuff into Version control

  • Loading branch information...
1 parent cf1251b commit d850884ea2de3d1fa044a1678e71f78b259bcd79 drhenner committed Jul 22, 2012
View
11 Gemfile
@@ -14,4 +14,13 @@ gem "jquery-rails"
# your gem to rubygems.org.
# To use debugger
-# gem 'ruby-debug19', :require => 'ruby-debug'
+gem 'debugger'
+group :development do
+ #gem 'mysql2'#, '~> 0.3.7'
+ gem "nifty-generators", :git => 'git://github.com/drhenner/nifty-generators.git'
+end
+
+group :test do
+ gem 'factory_girl_rails', '~> 3.3.0'
+ gem 'mocha'
+end
View
28 Gemfile.lock
@@ -1,8 +1,14 @@
+GIT
+ remote: git://github.com/drhenner/nifty-generators.git
+ revision: dc518739e9734be8aaab74281c565a19fbbae458
+ specs:
+ nifty-generators (0.4.6)
+
PATH
remote: .
specs:
validation_issues (0.0.1)
- rails (~> 3.2.1)
+ rails (~> 3.2.6)
GEM
remote: http://rubygems.org/
@@ -36,7 +42,20 @@ GEM
multi_json (~> 1.0)
arel (3.0.2)
builder (3.0.0)
+ columnize (0.3.6)
+ debugger (1.2.0)
+ columnize (>= 0.3.1)
+ debugger-linecache (~> 1.1.1)
+ debugger-ruby_core_source (~> 1.1.3)
+ debugger-linecache (1.1.2)
+ debugger-ruby_core_source (>= 1.1.1)
+ debugger-ruby_core_source (1.1.3)
erubis (2.7.0)
+ factory_girl (3.3.0)
+ activesupport (>= 3.0.0)
+ factory_girl_rails (3.3.0)
+ factory_girl (~> 3.3.0)
+ railties (>= 3.0.0)
hike (1.2.1)
i18n (0.6.0)
journey (1.0.4)
@@ -48,7 +67,10 @@ GEM
i18n (>= 0.4.0)
mime-types (~> 1.16)
treetop (~> 1.4.8)
+ metaclass (0.0.1)
mime-types (1.19)
+ mocha (0.10.5)
+ metaclass (~> 0.0.1)
multi_json (1.3.6)
polyglot (0.3.3)
rack (1.4.1)
@@ -92,6 +114,10 @@ PLATFORMS
ruby
DEPENDENCIES
+ debugger
+ factory_girl_rails (~> 3.3.0)
jquery-rails
+ mocha
+ nifty-generators!
sqlite3
validation_issues!
View
10 README.rdoc
@@ -1,3 +1,11 @@
= ValidationIssues
-This project rocks and uses MIT-LICENSE.
+This project rocks and uses MIT-LICENSE.
+
+In your application_controller add this protected method:
+
+ def has_validation_issues_admin_privileges
+ # logic you want to make this true
+ # Typically this will work
+ current_user && current_user.admin?
+ end
View
2 app/assets/javascripts/validation_issues.js
@@ -0,0 +1,2 @@
+// Place all the behaviors and hooks related to the matching controller here.
+// All this logic will automatically be available in application.js.
View
56 app/assets/stylesheets/scaffold.css
@@ -0,0 +1,56 @@
+body { background-color: #fff; color: #333; }
+
+body, p, ol, ul, td {
+ font-family: verdana, arial, helvetica, sans-serif;
+ font-size: 13px;
+ line-height: 18px;
+}
+
+pre {
+ background-color: #eee;
+ padding: 10px;
+ font-size: 11px;
+}
+
+a { color: #000; }
+a:visited { color: #666; }
+a:hover { color: #fff; background-color:#000; }
+
+div.field, div.actions {
+ margin-bottom: 10px;
+}
+
+#notice {
+ color: green;
+}
+
+.field_with_errors {
+ padding: 2px;
+ background-color: red;
+ display: table;
+}
+
+#error_explanation {
+ width: 450px;
+ border: 2px solid red;
+ padding: 7px;
+ padding-bottom: 0;
+ margin-bottom: 20px;
+ background-color: #f0f0f0;
+}
+
+#error_explanation h2 {
+ text-align: left;
+ font-weight: bold;
+ padding: 5px 5px 5px 15px;
+ font-size: 12px;
+ margin: -7px;
+ margin-bottom: 0px;
+ background-color: #c00;
+ color: #fff;
+}
+
+#error_explanation ul li {
+ font-size: 12px;
+ list-style: square;
+}
View
5 app/assets/stylesheets/validation_issues.css
@@ -0,0 +1,5 @@
+/*
+ Place all the styles related to the matching controller here.
+ They will automatically be included in application.css.
+*/
+//= require_tree ./validation_issues
View
77 app/assets/stylesheets/validation_issues/buttons.css
@@ -0,0 +1,77 @@
+.button {
+ display: inline-block;
+ zoom: 1; /* zoom and *display = ie7 hack for display:inline-block */
+ *display: inline;
+ vertical-align: baseline;
+ margin: 0 2px;
+ outline: none;
+ cursor: pointer;
+ text-align: center;
+ text-decoration: none;
+ font: 14px/100% Arial, Helvetica, sans-serif;
+ padding: .5em 2em .55em;
+ text-shadow: 0 1px 1px rgba(0,0,0,.3);
+ -webkit-border-radius: .25em;
+ -moz-border-radius: .25em;
+ border-radius: .25em;
+ -webkit-box-shadow: 0 1px 1px rgba(0,0,0,.2);
+ -moz-box-shadow: 0 1px 1px rgba(0,0,0,.2);
+ box-shadow: 0 1px 1px rgba(0,0,0,.2);
+}
+
+input[type="submit"].button {border: 0;background-color: transparent;color: #888;}
+input[type="submit"].button.dark-orange-button {color:#FFF;}
+input[type="submit"].button.small-dark-orange-button {color:#FFF;}
+
+.dark-orange-button {
+ color: #fef4e9;
+ border: solid 1px #db3909;
+ background: #c6481a;
+ background: -webkit-gradient(linear, left top, left bottom, from(#c8581a), to(#c5441F));
+ background: -moz-linear-gradient(top, #c8581a, #c5441F);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#c8581a', endColorstr='#c5441F');
+}
+.dark-orange-button:hover {
+ background: #c4421F;
+ background: -webkit-gradient(linear, left top, left bottom, from(#c75114), to(#c23415));
+ background: -moz-linear-gradient(top, #c75114, #c23415);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#c75114', endColorstr='#c23415');
+}
+.dark-orange-button:active {
+ background: #c4421F;
+ background: -webkit-gradient(linear, left top, left bottom, from(#c75114), to(#c23415));
+ background: -moz-linear-gradient(top, #c75114, #c23415);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#c75114', endColorstr='#c23415');
+}
+
+.small-dark-orange-button {
+ font-family:'Century Schoolbook Italic', 'Century Schoolbook', Georgia;
+ color: #fef4e9 !important;
+ border: solid 1px #db3909;
+ background: #c6481a;
+ background: -webkit-gradient(linear, left top, left bottom, from(#c9681a), to(#c6451F));
+ background: -moz-linear-gradient(top, #c9681a, #c6451F);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#c9681a', endColorstr='#c6451F');
+ font-size: 14px;
+ font-weight: normal;
+ padding: 0.2em 0.7em;
+ &.myriad {
+ font-family: "MyriadPro","Lucida Sans Unicode", "Lucida Grande", sans-serif;
+ padding: 0.7em;
+ padding-top: 0.3em;
+ padding-bottom: 0.1em;
+ }
+}
+.small-dark-orange-button:hover {
+ color: #fff7ef;
+ background: #c4421F;
+ background: -webkit-gradient(linear, left top, left bottom, from(#c65114), to(#c23415));
+ background: -moz-linear-gradient(top, #c65114, #c23415);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#c65114', endColorstr='#c23415');
+}
+.small-dark-orange-button:active {
+ background: #c4421F;
+ background: -webkit-gradient(linear, left top, left bottom, from(#c65114), to(#c23415));
+ background: -moz-linear-gradient(top, #c65114, #c23415);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#c65114', endColorstr='#c23415');
+}
View
44 app/controllers/validation_admin/validation_issues_controller.rb
@@ -0,0 +1,44 @@
+class ValidationAdmin::ValidationIssuesController < ApplicationController
+ before_filter :redirect_if_no_privileges
+ # has_validation_issues_admin_privileges
+
+ # GET /validation_issues
+ # GET /validation_issues.json
+ def index
+ @validation_issues = ValidationIssue.all
+
+ respond_to do |format|
+ format.html # index.html.erb
+ format.json { render json: @validation_issues }
+ end
+ end
+
+ # GET /validation_issues/1
+ # GET /validation_issues/1.json
+ def show
+ @validation_issue = ValidationIssue.find(params[:id])
+
+ respond_to do |format|
+ format.html # show.html.erb
+ format.json { render json: @validation_issue }
+ end
+ end
+
+ # DELETE /validation_issues/1
+ # DELETE /validation_issues/1.json
+ def destroy
+ @validation_issue = ValidationIssue.find(params[:id])
+ @validation_issue.clear_data!
+
+ respond_to do |format|
+ format.html { redirect_to validation_admin_validation_issues_url }
+ format.json { head :no_content }
+ end
+ end
+
+ protected
+
+ def redirect_if_no_privileges
+ redirect_to root_url and return unless has_validation_issues_admin_privileges
+ end
+end
View
26 app/models/validation_issue.rb
@@ -0,0 +1,26 @@
+class ValidationIssue < ActiveRecord::Base
+ attr_accessible :form_name, :issue_count, :issue_hash, :issue_type, :notes
+ serialize :issue_hash, Hash
+
+ validates :form_name, :presence => true, :uniqueness => true
+
+ def clear_data!
+ self.issue_count = 0
+ self.issue_hash = {}
+ self.notes = ''
+ self.save!
+ end
+
+ def increment_issue_count!
+ increment_with_sql!('issue_count')
+ end
+
+ protected
+
+ def increment_with_sql!(attribute, by = 1)
+ raise ArgumentError("Invalid attribute: #{attribute}") unless attribute_names.include?(attribute.to_s)
+ original_value_sql = "CASE WHEN `#{attribute}` IS NULL THEN 0 ELSE `#{attribute}` END"
+ self.class.update_all("`#{attribute}` = #{original_value_sql} + #{by.to_i}", "id = #{id}")
+ reload
+ end
+end
View
25 app/views/validation_admin/validation_issues/index.html.erb
@@ -0,0 +1,25 @@
+<p id="notice"><%= notice %></p>
+
+<h1> Validation Issues </h1>
+
+<table>
+ <tr>
+ <th>Type</th>
+ <th>Form Name</th>
+ <th>Count</th>
+ <th></th>
+ <th></th>
+ </tr>
+
+<% @validation_issues.each do |validation_issue| %>
+ <tr>
+ <td><%= validation_issue.issue_type %></td>
+ <td><%= validation_issue.form_name %></td>
+ <td><%= validation_issue.issue_count %></td>
+ <td><%= link_to 'Show', validation_admin_validation_issue_path(validation_issue) %></td>
+ <td><%= link_to 'Reset!',
+ validation_admin_validation_issue_path(validation_issue),
+ method: :delete, data: { confirm: 'Are you sure?' } %></td>
+ </tr>
+<% end %>
+</table>
View
22 app/views/validation_admin/validation_issues/show.html.erb
@@ -0,0 +1,22 @@
+<p id="notice"><%= notice %></p>
+
+<h2> <%= @validation_issue.issue_type %>: <%= @validation_issue.form_name %> </h2>
+
+<p>
+ <b>Issues (<%= @validation_issue.issue_count %>):</b>
+ <ul>
+ <% @validation_issue.issue_hash.each do |k, v| %>
+ <li><label> <%= k %>: </label> <%= v %></li>
+ <% end %>
+ </ul>
+
+</p>
+
+<% unless @validation_issue.notes.blank? %>
+ <p>
+ <b>Notes:</b>
+ <%= @validation_issue.notes %>
+ </p>
+<% end %>
+
+<%= link_to 'Back', validation_admin_validation_issues_path, :class => 'button small-dark-orange-button' %>
View
3 config/routes.rb
@@ -1,2 +1,5 @@
Rails.application.routes.draw do
+ namespace :validation_admin do
+ resources :validation_issues
+ end
end
View
16 db/migrate/20120722204204_create_validation_issues.rb
@@ -0,0 +1,16 @@
+class CreateValidationIssues < ActiveRecord::Migration
+ def change
+ create_table :validation_issues do |t|
+ t.string :issue_type
+ t.string :form_name, :null => false
+ t.text :issue_hash, :null => false
+ t.text :notes, :default => ''
+ t.integer :issue_count
+
+ t.timestamps
+ end
+ add_index :validation_issues, :form_name# , :length => 10
+ add_index :validation_issues, :issue_type
+ add_index :validation_issues, [:form_name, :issue_type], :unique => true
+ end
+end
View
22 lib/generators/valid_issues/templates/migration.rb
@@ -0,0 +1,22 @@
+class CreateValidationIssues < ActiveRecord::Migration
+ def self.up
+ create_table :validation_issues do |t|
+
+ t.string :issue_type, :null => false
+ t.string :form_name, :null => false
+ t.text :issue_hash, :null => false
+ #t.text :issued_by_ids
+ t.text :notes
+ t.integer :issue_count
+
+ t.timestamps
+ end
+ add_index :validation_issues, :form_name
+ add_index :validation_issues, :issue_type
+
+ end
+
+ def self.down
+ drop_table :versions
+ end
+end
View
23 lib/generators/valid_issues/valid_issues_generator.rb
@@ -0,0 +1,23 @@
+# CURRENT FILE :: lib/generators/valid_issues/valid_issues_generator.rb
+# Requires
+require 'rails/generators'
+require 'rails/generators/migration'
+
+class ValidIssuesGenerator < Rails::Generators::Base
+ include Rails::Generators::Migration
+ def self.source_root
+ @source_root ||= File.join(File.dirname(__FILE__), 'templates')
+ end
+
+ def self.next_migration_number(dirname)
+ if ActiveRecord::Base.timestamped_migrations
+ Time.new.utc.strftime("%Y%m%d%H%M%S")
+ else
+ "%.3d" % (current_migration_number(dirname) + 1)
+ end
+ end
+
+ def create_migration_file
+ migration_template 'migration.rb', 'db/migrate/create_validation_issues_table.rb'
+ end
+end
View
3 lib/validation_issues.rb
@@ -1,4 +1,7 @@
require "validation_issues/engine"
+require "validation_issues/core_ext"
+require 'validation_issues/acts_as_validation_issues'
+
module ValidationIssues
end
View
37 lib/validation_issues/acts_as_validation_issues.rb
@@ -0,0 +1,37 @@
+module ValidationIssues
+ module ActsAsValidationIssues
+ extend ActiveSupport::Concern
+
+ included do
+ end
+
+ module ClassMethods
+ def acts_as_validation_issues(options = {})
+ # your code will go here
+ end
+ end
+
+ # Instance Methods
+ def log_validation_issue!(form_name, options = {})
+ if self.errors
+ vi = ValidationIssue.find_by_form_name_and_issue_type(form_name, self.class.to_s)
+ vi ||= ValidationIssue.new(:form_name => form_name, :issue_type => self.class.to_s)
+
+ self.errors.map {|k,v| k }.uniq.each do |error_field|
+ vi.issue_hash[error_field] ||= 0
+ vi.issue_hash[error_field] = vi.issue_hash[error_field] + 1
+ end
+
+ vi.notes ||= ''
+ if options[:notes]
+ vi.notes = vi.notes + ' \n ' + options[:notes]
+ end
+ vi.issue_count ||= 0
+ vi.save
+ vi.increment_issue_count!
+ end
+ end
+ end
+end
+
+ActiveRecord::Base.send :include, ValidationIssues::ActsAsValidationIssues
View
0 lib/validation_issues/core_ext.rb
No changes.
View
21 test/acts_as_validation_issues_test.rb
@@ -0,0 +1,21 @@
+require 'test_helper'
+
+class ActsAsValidationIssuesTest < Test::Unit::TestCase
+
+ def test_log_validation_issue_should_create_a_log
+ vi_count_object = ValidationIssue.where(:form_name => 'user_form').last
+ vi_count = vi_count_object.try(:issue_count) || 0
+ user = User.new(:first_name => '', :last_name => 'Good Last Name')
+ user.save
+ user.log_validation_issue!('user_form')
+ vi = ValidationIssue.where(:form_name => 'user_form').last
+ assert_equal "User", vi.issue_type
+ # assert_equal { "first_name" => 1 } , vi.issue_hash
+ assert_equal (vi_count + 1), vi.issue_count
+ end
+
+ #def test_log_file_should_increment_a_log
+ # assert_equal "last_tweet", ValidationIssue.log_validation_issue!
+ #end
+
+end
View
10 test/dummy/app/models/user.rb
@@ -0,0 +1,10 @@
+class User < ActiveRecord::Base
+ attr_accessible :first_name, :last_name, :nick_name
+ acts_as_validation_issues
+
+ validates :first_name, :presence => true
+ validates :last_name, :presence => true
+ validates :nick_name, :presence => false,
+ :format => { :with => /w+/ },
+ :allow_blank => true
+end
View
11 test/dummy/db/migrate/20120722183345_create_users.rb
@@ -0,0 +1,11 @@
+class CreateUsers < ActiveRecord::Migration
+ def change
+ create_table :users do |t|
+ t.string :first_name
+ t.string :last_name
+ t.string :nick_name
+
+ t.timestamps
+ end
+ end
+end
View
38 test/dummy/db/schema.rb
@@ -0,0 +1,38 @@
+# encoding: UTF-8
+# This file is auto-generated from the current state of the database. Instead
+# of editing this file, please use the migrations feature of Active Record to
+# incrementally modify your database, and then regenerate this schema definition.
+#
+# Note that this schema.rb definition is the authoritative source for your
+# database schema. If you need to create the application database on another
+# system, you should be using db:schema:load, not running all the migrations
+# from scratch. The latter is a flawed and unsustainable approach (the more migrations
+# you'll amass, the slower it'll run and the greater likelihood for issues).
+#
+# It's strongly recommended to check this file into your version control system.
+
+ActiveRecord::Schema.define(:version => 20120722204204) do
+
+ create_table "users", :force => true do |t|
+ t.string "first_name"
+ t.string "last_name"
+ t.string "nick_name"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "validation_issues", :force => true do |t|
+ t.string "issue_type"
+ t.string "form_name", :null => false
+ t.text "issue_hash", :null => false
+ t.text "notes", :default => ""
+ t.integer "issue_count"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "validation_issues", ["form_name", "issue_type"], :name => "index_validation_issues_on_form_name_and_issue_type", :unique => true
+ add_index "validation_issues", ["form_name"], :name => "index_validation_issues_on_form_name"
+ add_index "validation_issues", ["issue_type"], :name => "index_validation_issues_on_issue_type"
+
+end
View
11 test/dummy/test/fixtures/users.yml
@@ -0,0 +1,11 @@
+# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html
+
+one:
+ first_name: MyString
+ last_name: MyString
+ nick_name: MyString
+
+two:
+ first_name: MyString
+ last_name: MyString
+ nick_name: MyString
View
7 test/dummy/test/unit/user_test.rb
@@ -0,0 +1,7 @@
+require 'test_helper'
+
+class UserTest < ActiveSupport::TestCase
+ # test "the truth" do
+ # assert true
+ # end
+end
View
9 test/factories/validation_issues.rb
@@ -0,0 +1,9 @@
+FactoryGirl.define do
+ factory :validation_issue do
+ issue_type "User"
+ form_name "user_form"
+ issue_hash { ":first_name=>8, :nick_name=>8" }
+ notes ""
+ issue_count 7
+ end
+end
View
42 test/functional/validation_issues_controller_test.rb
@@ -0,0 +1,42 @@
+require 'test_helper'
+
+class ValidationAdmin::ValidationIssuesControllerTest < ActionController::TestCase
+
+ setup do
+ validation_issue = FactoryGirl.build(:validation_issue) #validation_issues(:one)
+ vi = ValidationIssue.find_by_form_name_and_issue_type(validation_issue.form_name, 'User')
+ if vi
+ @validation_issue = vi
+ else
+ validation_issue.save
+ @validation_issue = validation_issue
+ end
+ @controller.stubs(:has_validation_issues_admin_privileges).returns(true)
+ end
+
+ test "should get index" do
+ get :index
+ assert_response :success
+ assert_not_nil assigns(:validation_issues)
+ end
+
+ test "should show validation_issue" do
+ get :show, id: @validation_issue
+ assert_response :success
+ end
+
+ test "should destroy validation_issue" do
+ @validation_issue.issue_hash = {:first_name => 3}
+ @validation_issue.save
+ #assert_difference('ValidationIssue.count', -1) do
+ delete :destroy, id: @validation_issue
+ #end
+ @validation_issue.reload
+ assert_equal @validation_issue.issue_count, 0
+ # puts @validation_issue.issue_hash.size
+ @validation_issue.issue_hash.each do |key, num|
+ assert_equal 0, num
+ end
+ assert_redirected_to validation_admin_validation_issues_path
+ end
+end
View
7 test/test_helper.rb
@@ -3,8 +3,15 @@
require File.expand_path("../dummy/config/environment.rb", __FILE__)
require "rails/test_help"
+require 'factory_girl'
+require 'mocha'
Rails.backtrace_cleaner.remove_silencers!
# Load support files
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
+
+FactoryGirl.find_definitions
+#class ActiveSupport::TestCase
+# fixtures :all
+#end
View
4 test/unit/helpers/validation_issues_helper_test.rb
@@ -0,0 +1,4 @@
+require 'test_helper'
+
+class ValidationIssuesHelperTest < ActionView::TestCase
+end
View
23 test/unit/validation_issue_test.rb
@@ -0,0 +1,23 @@
+require 'test_helper'
+
+class ValidationIssueTest < ActiveSupport::TestCase
+ test ".clear_data!" do
+ # assert true
+ validation_issue = FactoryGirl.build(:validation_issue, :form_name => 'my_super_form',
+ :issue_count => 5,
+ :issue_hash => {'name' => 2,
+ 'password' => 3})
+ vi = ValidationIssue.find_by_form_name_and_issue_type(validation_issue.form_name, 'User')
+ if vi
+ validation_issue = vi
+ else
+ validation_issue.save
+ end
+ validation_issue.clear_data!
+ assert_equal validation_issue.issue_count, 0
+ # puts @validation_issue.issue_hash.size
+ validation_issue.issue_hash.each do |key, num|
+ assert_equal 0, num
+ end
+ end
+end
View
16 validation_issues.gemspec
@@ -7,16 +7,16 @@ require "validation_issues/version"
Gem::Specification.new do |s|
s.name = "validation_issues"
s.version = ValidationIssues::VERSION
- s.authors = ["TODO: Your name"]
- s.email = ["TODO: Your email"]
- s.homepage = "TODO"
- s.summary = "TODO: Summary of ValidationIssues."
- s.description = "TODO: Description of ValidationIssues."
+ s.authors = ["David Henner"]
+ s.email = ["drhenner@gmail.com"]
+ s.homepage = "http://www.ror-e.com"
+ s.summary = "To ensure Validations that continue to have issues are addressed by developers."
+ s.description = "To ensure Validations that continue to have issues are addressed by developers. This is done by logging the failure. When a specific failure continues to be an issue, a developer can look into the problem."
- s.files = Dir["{app,config,db,lib}/**/*"] + ["MIT-LICENSE", "Rakefile", "README.rdoc"]
- s.test_files = Dir["test/**/*"]
+ s.files = Dir["{app,config,db,lib}/**/*"] + ["MIT-LICENSE", "Rakefile", "README.rdoc"]
+ s.test_files = Dir["test/**/*"]
- s.add_dependency "rails", "~> 3.2.1"
+ s.add_dependency "rails", "~> 3.2.6"
# s.add_dependency "jquery-rails"
s.add_development_dependency "sqlite3"

0 comments on commit d850884

Please sign in to comment.
Something went wrong with that request. Please try again.