danger-wcc 0.0.2
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/.circleci/config.yml +46 -0
- data/.gitignore +6 -0
- data/.rubocop.yml +219 -0
- data/.ruby-version +1 -0
- data/.travis.yml +12 -0
- data/Dangerfile +5 -0
- data/Gemfile +6 -0
- data/Guardfile +35 -0
- data/LICENSE +201 -0
- data/README.md +2 -0
- data/Rakefile +25 -0
- data/danger-wcc.gemspec +58 -0
- data/lib/danger_plugin.rb +3 -0
- data/lib/version.rb +5 -0
- data/lib/wcc/commit_lint.rb +158 -0
- data/lib/wcc/commit_lint/README.md +3 -0
- data/lib/wcc/commit_lint/commit_check.rb +19 -0
- data/lib/wcc/commit_lint/empty_line_check.rb +22 -0
- data/lib/wcc/commit_lint/subject_cap_check.rb +22 -0
- data/lib/wcc/commit_lint/subject_length_check.rb +28 -0
- data/lib/wcc/commit_lint/subject_period_check.rb +22 -0
- data/lib/wcc/commit_lint/subject_words_check.rb +22 -0
- data/lib/wcc/default.jshintrc +5 -0
- data/lib/wcc/defaults.reek +131 -0
- data/lib/wcc/github.rb +24 -0
- data/lib/wcc/jshint.rb +63 -0
- data/lib/wcc/plugin.rb +128 -0
- data/lib/wcc/reek.rb +56 -0
- data/lib/wcc/rubocop_exceptions.rb +99 -0
- data/lib/wcc/todos.rb +78 -0
- data/lib/wcc/utils.rb +136 -0
- data/spec/fixtures/brakeman/a.tmp +13 -0
- data/spec/fixtures/brakeman/b.tmp +14 -0
- data/spec/fixtures/brakeman/brakeman.diff +20 -0
- data/spec/fixtures/brakeman/brakeman.out +14 -0
- data/spec/fixtures/exception_context.diff +15 -0
- data/spec/fixtures/exception_insert_context.diff +14 -0
- data/spec/fixtures/exception_misspelled.diff +14 -0
- data/spec/fixtures/exception_multiline_context.diff +20 -0
- data/spec/fixtures/exception_reenabled.diff +13 -0
- data/spec/fixtures/find_in_diff.rb +21 -0
- data/spec/fixtures/find_in_diff_2_chunks.diff +24 -0
- data/spec/fixtures/flay.diff +17 -0
- data/spec/fixtures/flay.txt +18 -0
- data/spec/fixtures/github/labels.json +72 -0
- data/spec/fixtures/github_pr.json +325 -0
- data/spec/fixtures/jshint/a.tmp +5 -0
- data/spec/fixtures/jshint/b.tmp +7 -0
- data/spec/fixtures/jshint/jshint.diff +13 -0
- data/spec/fixtures/jshint/out.jshint +7 -0
- data/spec/fixtures/no_exception.diff +10 -0
- data/spec/fixtures/no_todo.diff +13 -0
- data/spec/fixtures/reek/line_numbers.reek +121 -0
- data/spec/fixtures/reek/reek.diff +50 -0
- data/spec/fixtures/rubocop_exception.rb +39 -0
- data/spec/fixtures/todo.rb +21 -0
- data/spec/fixtures/todo_link_next_line.diff +14 -0
- data/spec/fixtures/todo_link_same_line.diff +13 -0
- data/spec/fixtures/todo_no_link.diff +13 -0
- data/spec/fixtures/todo_removed.diff +13 -0
- data/spec/fixtures_helper.rb +19 -0
- data/spec/spec_helper.rb +73 -0
- data/spec/wcc/commit_lint_spec.rb +392 -0
- data/spec/wcc/github_spec.rb +67 -0
- data/spec/wcc/jshint_spec.rb +68 -0
- data/spec/wcc/plugin_spec.rb +134 -0
- data/spec/wcc/reek_spec.rb +71 -0
- data/spec/wcc/rubocop_exceptions_spec.rb +136 -0
- data/spec/wcc/todos_spec.rb +96 -0
- data/spec/wcc/utils_spec.rb +134 -0
- data/spec/wcc_spec.rb +21 -0
- metadata +393 -0
    
        data/lib/wcc/utils.rb
    ADDED
    
    | @@ -0,0 +1,136 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            # frozen_string_literal: true
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            require 'git_diff'
         | 
| 5 | 
            +
            require 'logger'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module Utils
         | 
| 8 | 
            +
              def plugin
         | 
| 9 | 
            +
                # individual check classes usually set the '@plugin' variable,
         | 
| 10 | 
            +
                # otherwise this mixin was included on the plugin itself.
         | 
| 11 | 
            +
                @plugin || self
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              def logger
         | 
| 15 | 
            +
                return @logger if @logger
         | 
| 16 | 
            +
                @logger = Logger.new(STDERR)
         | 
| 17 | 
            +
                @logger.level = ENV['DANGER_LOG_LEVEL'] ||
         | 
| 18 | 
            +
                  (plugin.verbose ? Logger::INFO : Logger::ERROR)
         | 
| 19 | 
            +
                @logger
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              # All the diffs in the PR parsed into GitDiff objects
         | 
| 23 | 
            +
              def parsed_diffs
         | 
| 24 | 
            +
                @parsed_diffs ||=
         | 
| 25 | 
            +
                  plugin.git.diff.map do |d|
         | 
| 26 | 
            +
                    begin
         | 
| 27 | 
            +
                      GitDiff.from_string(d.patch)
         | 
| 28 | 
            +
                    rescue StandardError
         | 
| 29 | 
            +
                      logger.fatal "Error parsing patch:\n#{d.patch}"
         | 
| 30 | 
            +
                      raise
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              # Finds lines in the overall diff matching the given regex, and
         | 
| 36 | 
            +
              # executes a block for each matched line.
         | 
| 37 | 
            +
              # The results of the yield block are returned as an array.
         | 
| 38 | 
            +
              def find_in_diff(regex)
         | 
| 39 | 
            +
                each_file_in_diff do |file, diff|
         | 
| 40 | 
            +
                  file.hunks.flat_map do |hunk|
         | 
| 41 | 
            +
                    lines = hunk.lines.select { |l| l.addition? && l.content =~ regex }
         | 
| 42 | 
            +
                    if block_given?
         | 
| 43 | 
            +
                      lines =
         | 
| 44 | 
            +
                        lines.map do |l|
         | 
| 45 | 
            +
                          yield(l.content.match(regex), l, hunk, file, diff)
         | 
| 46 | 
            +
                        end
         | 
| 47 | 
            +
                    end
         | 
| 48 | 
            +
                    lines
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              def each_file_in_diff(passed_diff = nil)
         | 
| 54 | 
            +
                diffs = passed_diff ? [passed_diff] : parsed_diffs
         | 
| 55 | 
            +
                diffs.flat_map do |diff|
         | 
| 56 | 
            +
                  diff.files.flat_map do |file|
         | 
| 57 | 
            +
                    yield(file, diff)
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              def each_addition_in_diff(passed_diff = nil)
         | 
| 63 | 
            +
                each_file_in_diff(passed_diff) do |file, diff|
         | 
| 64 | 
            +
                  file.hunks.flat_map do |hunk|
         | 
| 65 | 
            +
                    lines = hunk.lines.select(&:addition?)
         | 
| 66 | 
            +
                    lines = lines.map { |l| yield(l, hunk, file, diff) } if block_given?
         | 
| 67 | 
            +
                    lines
         | 
| 68 | 
            +
                  end
         | 
| 69 | 
            +
                end
         | 
| 70 | 
            +
              end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              def run(command)
         | 
| 73 | 
            +
                logger.info "Executing command '#{command}'"
         | 
| 74 | 
            +
                result = `#{command}`
         | 
| 75 | 
            +
                logger.debug result
         | 
| 76 | 
            +
                result
         | 
| 77 | 
            +
              end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
              # Runs a command twice - once on the merge base, and once on the current
         | 
| 80 | 
            +
              # working directory.  Then, returns the git diff of the printed results.
         | 
| 81 | 
            +
              def run_and_diff(command = nil)
         | 
| 82 | 
            +
                unless command || block_given?
         | 
| 83 | 
            +
                  raise ArgumentError('Must give command or block')
         | 
| 84 | 
            +
                end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                logger.info "Executing diff: '#{command}'"
         | 
| 87 | 
            +
                with_revision(plugin.github.base_commit) do |dir|
         | 
| 88 | 
            +
                  initial = nil
         | 
| 89 | 
            +
                  Dir.chdir(dir) do
         | 
| 90 | 
            +
                    initial = command ? `#{command}` : yield
         | 
| 91 | 
            +
                  end
         | 
| 92 | 
            +
                  final = command ? `#{command}` : yield
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                  diff = diff_strings(initial, final)
         | 
| 95 | 
            +
                  logger.debug diff
         | 
| 96 | 
            +
                  diff
         | 
| 97 | 
            +
                end
         | 
| 98 | 
            +
              end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
              # Executes a block after checking out the specified revision into a temp
         | 
| 101 | 
            +
              # directory.
         | 
| 102 | 
            +
              def with_revision(revision)
         | 
| 103 | 
            +
                Dir.mktmpdir do |dir|
         | 
| 104 | 
            +
                  logger.debug "Checking out revision #{revision} into #{dir}"
         | 
| 105 | 
            +
                  system "git --work-tree=#{dir} checkout #{revision.strip} -- ."
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                  yield(dir)
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
              end
         | 
| 110 | 
            +
             | 
| 111 | 
            +
              # Creates a git-format diff of the two strings by writing them to temp files
         | 
| 112 | 
            +
              def diff_strings(a, b)
         | 
| 113 | 
            +
                File.write('a.tmp', a)
         | 
| 114 | 
            +
                File.write('b.tmp', b)
         | 
| 115 | 
            +
                diff = `git diff --no-index a.tmp b.tmp`
         | 
| 116 | 
            +
                File.delete('a.tmp', 'b.tmp')
         | 
| 117 | 
            +
                diff
         | 
| 118 | 
            +
              end
         | 
| 119 | 
            +
             | 
| 120 | 
            +
              def format_links_as_markdown(line)
         | 
| 121 | 
            +
                line.gsub(/\[?(https?\:\/\/[^\s\]]+)\]?/i, '[\1](\1)')
         | 
| 122 | 
            +
              end
         | 
| 123 | 
            +
             | 
| 124 | 
            +
              # Adds a message to the Danger report
         | 
| 125 | 
            +
              # with the given serverity - 'message', 'warn', or 'fail
         | 
| 126 | 
            +
              def issue(message, severity: 'message', file: nil, line: nil)
         | 
| 127 | 
            +
                case severity
         | 
| 128 | 
            +
                when 'message'
         | 
| 129 | 
            +
                  plugin.message(message, file: file, line: line)
         | 
| 130 | 
            +
                when 'warn'
         | 
| 131 | 
            +
                  plugin.warn(message, file: file, line: line)
         | 
| 132 | 
            +
                else
         | 
| 133 | 
            +
                  plugin.fail(message, file: file, line: line)
         | 
| 134 | 
            +
                end
         | 
| 135 | 
            +
              end
         | 
| 136 | 
            +
            end
         | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            app/controllers/wmoauth_controller.rb		Redirect	General	Possible unprotected redirect near line : redirect_to(Wmoauth.get_client.auth_code.authorize_url(:redirect_uri => ENV["REDIRECT_URI"]))	High
         | 
| 2 | 
            +
            app/controllers/webhooks_controller.rb		Cross Site Request Forgery	Controller	'protect_from_forgery' should be called in WebhooksController near line 	High
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            app/views/calendar/show.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Calendar.format_calendar_data(Entry.find_by_date((params[:id] + "--"), (params[:id] + "--"), )).to_s	Medium
         | 
| 5 | 
            +
            app/views/sections/_central_truth.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["central_truth"]["journey_central_truth"]	High
         | 
| 6 | 
            +
            app/views/sections/_introduction.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["introduction"]["journey_introduction"]	High
         | 
| 7 | 
            +
            app/views/sections/_introduction.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["introduction"]["journey_introduction"]	High
         | 
| 8 | 
            +
            app/views/sections/_introduction.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["introduction"]["journey_introduction"]	High
         | 
| 9 | 
            +
            app/views/sections/_key_verse.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["key_verse"]["journey_key_verse_html"]	High
         | 
| 10 | 
            +
            app/views/sections/_scripture_memory.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["scripture_memory"]["journey_scripture_memory_html"]	High
         | 
| 11 | 
            +
            app/views/sections/_tweetable_truth.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["tweetable_truth"]["journey_tweetable_truth"]	High
         | 
| 12 | 
            +
            app/views/sections/_writer.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["writer"]["journey_writer_bio"]	High
         | 
| 13 | 
            +
            app/views/sections/comments/_group_comments.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : { post["post_number"] => ({ :raw => post["cooked"], :name => post["name"], :reply_count => post["reply_count"], :created_at => post["created_at"], :reply_to_post_number => post["reply_to_post_number"], :post_number => post["post_number"] }) }[(Unresolved Model).new.post_no][:raw]	Weak
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            app/controllers/wmoauth_controller.rb		Redirect	General	Possible unprotected redirect near line : redirect_to(Wmoauth.get_client.auth_code.authorize_url(:redirect_uri => ENV["REDIRECT_URI"]))	High
         | 
| 2 | 
            +
            app/controllers/wmoauth_controller.rb		SSL Verification Bypass	General	SSL certificate verification was bypassed near line : Net::HTTP.new(URI.parse(URI.escape("https://jointhejourney.us.list-manage.com/subscribe/post?u=#{ENV["MAILCHIMP_ORG_ID"]}&id=#{ENV["MAILCHIMP_LIST_ID"]}&FNAME=#{user["first_name"]}&LNAME=#{user["last_name"]}&EMAIL=#{user["email"]}")).host, URI.parse(URI.escape("https://jointhejourney.us.list-manage.com/subscribe/post?u=#{ENV["MAILCHIMP_ORG_ID"]}&id=#{ENV["MAILCHIMP_LIST_ID"]}&FNAME=#{user["first_name"]}&LNAME=#{user["last_name"]}&EMAIL=#{user["email"]}")).port).verify_mode = OpenSSL::SSL::VERIFY_NONE	High
         | 
| 3 | 
            +
            app/controllers/webhooks_controller.rb		Cross Site Request Forgery	Controller	'protect_from_forgery' should be called in WebhooksController near line 	High
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            app/views/calendar/show.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Calendar.format_calendar_data(Entry.find_by_date((params[:id] + "--"), (params[:id] + "--"), )).to_s	Medium
         | 
| 6 | 
            +
            app/views/sections/_central_truth.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["central_truth"]["journey_central_truth"]	High
         | 
| 7 | 
            +
            app/views/sections/_discussion_questions.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["discussion_questions"]["journey_discussion_questions"]	High
         | 
| 8 | 
            +
            app/views/sections/_introduction.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["introduction"]["journey_introduction"]	High
         | 
| 9 | 
            +
            app/views/sections/_introduction.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["introduction"]["journey_introduction"]	High
         | 
| 10 | 
            +
            app/views/sections/_introduction.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["introduction"]["journey_introduction"]	High
         | 
| 11 | 
            +
            app/views/sections/_key_verse.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["key_verse"]["journey_key_verse_html"]	High
         | 
| 12 | 
            +
            app/views/sections/_scripture_memory.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["scripture_memory"]["journey_scripture_memory_html"]	High
         | 
| 13 | 
            +
            app/views/sections/_tweetable_truth.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["tweetable_truth"]["journey_tweetable_truth"]	High
         | 
| 14 | 
            +
            app/views/sections/_writer.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["writer"]["journey_writer_bio"]	High
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            diff --git a/a.tmp b/b.tmp
         | 
| 2 | 
            +
            index 1652641..f6e16b1 100644
         | 
| 3 | 
            +
            --- a/a.tmp
         | 
| 4 | 
            +
            +++ b/b.tmp
         | 
| 5 | 
            +
            @@ -1,8 +1,10 @@
         | 
| 6 | 
            +
             app/controllers/wmoauth_controller.rb		Redirect	General	Possible unprotected redirect near line : redirect_to(Wmoauth.get_client.auth_code.authorize_url(:redirect_uri => ENV["REDIRECT_URI"]))	High
         | 
| 7 | 
            +
            +app/controllers/wmoauth_controller.rb		SSL Verification Bypass	General	SSL certificate verification was bypassed near line : Net::HTTP.new(URI.parse(URI.escape("https://jointhejourney.us.list-manage.com/subscribe/post?u=#{ENV["MAILCHIMP_ORG_ID"]}&id=#{ENV["MAILCHIMP_LIST_ID"]}&FNAME=#{user["first_name"]}&LNAME=#{user["last_name"]}&EMAIL=#{user["email"]}")).host, URI.parse(URI.escape("https://jointhejourney.us.list-manage.com/subscribe/post?u=#{ENV["MAILCHIMP_ORG_ID"]}&id=#{ENV["MAILCHIMP_LIST_ID"]}&FNAME=#{user["first_name"]}&LNAME=#{user["last_name"]}&EMAIL=#{user["email"]}")).port).verify_mode = OpenSSL::SSL::VERIFY_NONE	High
         | 
| 8 | 
            +
             app/controllers/webhooks_controller.rb		Cross Site Request Forgery	Controller	'protect_from_forgery' should be called in WebhooksController near line 	High
         | 
| 9 | 
            +
             
         | 
| 10 | 
            +
             app/views/calendar/show.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Calendar.format_calendar_data(Entry.find_by_date((params[:id] + "--"), (params[:id] + "--"), )).to_s	Medium
         | 
| 11 | 
            +
             app/views/sections/_central_truth.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["central_truth"]["journey_central_truth"]	High
         | 
| 12 | 
            +
            +app/views/sections/_discussion_questions.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["discussion_questions"]["journey_discussion_questions"]	High
         | 
| 13 | 
            +
             app/views/sections/_introduction.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["introduction"]["journey_introduction"]	High
         | 
| 14 | 
            +
             app/views/sections/_introduction.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["introduction"]["journey_introduction"]	High
         | 
| 15 | 
            +
             app/views/sections/_introduction.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["introduction"]["journey_introduction"]	High
         | 
| 16 | 
            +
            @@ -10,4 +12,3 @@ app/views/sections/_key_verse.html.erb		Cross Site Scripting	Template	Unescaped
         | 
| 17 | 
            +
             app/views/sections/_scripture_memory.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["scripture_memory"]["journey_scripture_memory_html"]	High
         | 
| 18 | 
            +
             app/views/sections/_tweetable_truth.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["tweetable_truth"]["journey_tweetable_truth"]	High
         | 
| 19 | 
            +
             app/views/sections/_writer.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : Entry.find(params[:id], params[:preview_code])["writer"]["journey_writer_bio"]	High
         | 
| 20 | 
            +
            -app/views/sections/comments/_group_comments.html.erb		Cross Site Scripting	Template	Unescaped model attribute near line : { post["post_number"] => ({ :raw => post["cooked"], :name => post["name"], :reply_count => post["reply_count"], :created_at => post["created_at"], :reply_to_post_number => post["reply_to_post_number"], :post_number => post["post_number"] }) }[(Unresolved Model).new.post_no][:raw]	Weak
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            app/controllers/wmoauth_controller.rb	11	Redirect	General	Possible unprotected redirect near line 11: redirect_to(Wmoauth.get_client.auth_code.authorize_url(:redirect_uri => ENV["REDIRECT_URI"]))	High
         | 
| 2 | 
            +
            app/controllers/wmoauth_controller.rb	78	SSL Verification Bypass	General	SSL certificate verification was bypassed near line 78: Net::HTTP.new(URI.parse(URI.escape("https://jointhejourney.us3.list-manage.com/subscribe/post?u=#{ENV["MAILCHIMP_ORG_ID"]}&id=#{ENV["MAILCHIMP_LIST_ID"]}&FNAME=#{user["first_name"]}&LNAME=#{user["last_name"]}&EMAIL=#{user["email"]}")).host, URI.parse(URI.escape("https://jointhejourney.us3.list-manage.com/subscribe/post?u=#{ENV["MAILCHIMP_ORG_ID"]}&id=#{ENV["MAILCHIMP_LIST_ID"]}&FNAME=#{user["first_name"]}&LNAME=#{user["last_name"]}&EMAIL=#{user["email"]}")).port).verify_mode = OpenSSL::SSL::VERIFY_NONE	High
         | 
| 3 | 
            +
            app/controllers/webhooks_controller.rb	2	Cross Site Request Forgery	Controller	'protect_from_forgery' should be called in WebhooksController near line 2	High
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            app/views/calendar/show.html.erb	76	Cross Site Scripting	Template	Unescaped model attribute near line 76: Calendar.format_calendar_data(Entry.find_by_date((params[:id] + "-1-1"), (params[:id] + "-12-31"), 300)).to_s	Medium
         | 
| 6 | 
            +
            app/views/sections/_central_truth.html.erb	4	Cross Site Scripting	Template	Unescaped model attribute near line 4: Entry.find(params[:id], params[:preview_code])["central_truth"]["journey_central_truth"]	High
         | 
| 7 | 
            +
            app/views/sections/_discussion_questions.html.erb	4	Cross Site Scripting	Template	Unescaped model attribute near line 4: Entry.find(params[:id], params[:preview_code])["discussion_questions"]["journey_discussion_questions"]	High
         | 
| 8 | 
            +
            app/views/sections/_introduction.html.erb	31	Cross Site Scripting	Template	Unescaped model attribute near line 31: Entry.find(params[:id], params[:preview_code])["introduction"]["journey_introduction"]	High
         | 
| 9 | 
            +
            app/views/sections/_introduction.html.erb	41	Cross Site Scripting	Template	Unescaped model attribute near line 41: Entry.find(params[:id], params[:preview_code])["introduction"]["journey_introduction"]	High
         | 
| 10 | 
            +
            app/views/sections/_introduction.html.erb	57	Cross Site Scripting	Template	Unescaped model attribute near line 57: Entry.find(params[:id], params[:preview_code])["introduction"]["journey_introduction"]	High
         | 
| 11 | 
            +
            app/views/sections/_key_verse.html.erb	6	Cross Site Scripting	Template	Unescaped model attribute near line 6: Entry.find(params[:id], params[:preview_code])["key_verse"]["journey_key_verse_html"]	High
         | 
| 12 | 
            +
            app/views/sections/_scripture_memory.html.erb	12	Cross Site Scripting	Template	Unescaped model attribute near line 12: Entry.find(params[:id], params[:preview_code])["scripture_memory"]["journey_scripture_memory_html"]	High
         | 
| 13 | 
            +
            app/views/sections/_tweetable_truth.html.erb	10	Cross Site Scripting	Template	Unescaped model attribute near line 10: Entry.find(params[:id], params[:preview_code])["tweetable_truth"]["journey_tweetable_truth"]	High
         | 
| 14 | 
            +
            app/views/sections/_writer.html.erb	31	Cross Site Scripting	Template	Unescaped model attribute near line 31: Entry.find(params[:id], params[:preview_code])["writer"]["journey_writer_bio"]	High
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            diff --git a/spec/fixtures/rubocop_exception.rb b/spec/fixtures/rubocop_exception.rb
         | 
| 2 | 
            +
            index 2122f05..1d51ff5 100644
         | 
| 3 | 
            +
            --- a/spec/fixtures/rubocop_exception.rb
         | 
| 4 | 
            +
            +++ b/spec/fixtures/rubocop_exception.rb
         | 
| 5 | 
            +
            @@ -11,4 +11,10 @@ module RubocopException
         | 
| 6 | 
            +
               def some_method_misspelled_reenable
         | 
| 7 | 
            +
               end
         | 
| 8 | 
            +
               # rubocop:enable Lint/SomLint
         | 
| 9 | 
            +
            +
         | 
| 10 | 
            +
            +  # rubocop:disable Metrics/LineLength
         | 
| 11 | 
            +
            +  # Disabling because I want to.
         | 
| 12 | 
            +
            +  def some_method_with_context
         | 
| 13 | 
            +
            +  end
         | 
| 14 | 
            +
            +  # rubocop:enable Metrics/LineLength
         | 
| 15 | 
            +
             end
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            diff --git a/spec/fixtures/rubocop_exception.rb b/spec/fixtures/rubocop_exception.rb
         | 
| 2 | 
            +
            index c97cbfc..0406593 100644
         | 
| 3 | 
            +
            --- a/spec/fixtures/rubocop_exception.rb
         | 
| 4 | 
            +
            +++ b/spec/fixtures/rubocop_exception.rb
         | 
| 5 | 
            +
            @@ -20,6 +20,9 @@ module RubocopException
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            +  # rubocop:disable Metrics/ABC
         | 
| 8 | 
            +
            +  # here is my comment why we are disabling ABC
         | 
| 9 | 
            +
               # Some existing comments
         | 
| 10 | 
            +
               # Made by another person
         | 
| 11 | 
            +
               def some_method_with_existing_comments
         | 
| 12 | 
            +
               end
         | 
| 13 | 
            +
            +  # rubocop:enable Metrics/ABC
         | 
| 14 | 
            +
             end
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            diff --git a/spec/fixtures/rubocop_exception.rb b/spec/fixtures/rubocop_exception.rb
         | 
| 2 | 
            +
            index 7f63af5..2122f05 100644
         | 
| 3 | 
            +
            --- a/spec/fixtures/rubocop_exception.rb
         | 
| 4 | 
            +
            +++ b/spec/fixtures/rubocop_exception.rb
         | 
| 5 | 
            +
            @@ -6,4 +6,9 @@ module RubocopException
         | 
| 6 | 
            +
               def some_method_with_disabled_rule
         | 
| 7 | 
            +
               end
         | 
| 8 | 
            +
               # rubocop:enable Rails/SomeRule
         | 
| 9 | 
            +
            +
         | 
| 10 | 
            +
            +  # rubocop:disable Lint/SomeLint
         | 
| 11 | 
            +
            +  def some_method_misspelled_reenable
         | 
| 12 | 
            +
            +  end
         | 
| 13 | 
            +
            +  # rubocop:enable Lint/SomLint
         | 
| 14 | 
            +
             end
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            diff --git a/spec/fixtures/rubocop_exception.rb b/spec/fixtures/rubocop_exception.rb
         | 
| 2 | 
            +
            index 0406593..c59d48e 100644
         | 
| 3 | 
            +
            --- a/spec/fixtures/rubocop_exception.rb
         | 
| 4 | 
            +
            +++ b/spec/fixtures/rubocop_exception.rb
         | 
| 5 | 
            +
            @@ -25,4 +25,15 @@ module RubocopException
         | 
| 6 | 
            +
               def some_method_with_existing_comments
         | 
| 7 | 
            +
               end
         | 
| 8 | 
            +
               # rubocop:enable Metrics/ABC
         | 
| 9 | 
            +
            +
         | 
| 10 | 
            +
            +  def some_method_with_multiline_context
         | 
| 11 | 
            +
            +    # rubocop:disable Layout/AlignHash
         | 
| 12 | 
            +
            +    # I want to disable this because..
         | 
| 13 | 
            +
            +    # I forgot the reasons.
         | 
| 14 | 
            +
            +    {
         | 
| 15 | 
            +
            +      a: 'a',
         | 
| 16 | 
            +
            +        b: 'b'
         | 
| 17 | 
            +
            +    }
         | 
| 18 | 
            +
            +    # rubocop:enable Layout/AlignHash
         | 
| 19 | 
            +
            +  end
         | 
| 20 | 
            +
             end
         | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            diff --git a/spec/fixtures/rubocop_exception.rb b/spec/fixtures/rubocop_exception.rb
         | 
| 2 | 
            +
            index 663661c..7f63af5 100644
         | 
| 3 | 
            +
            --- a/spec/fixtures/rubocop_exception.rb
         | 
| 4 | 
            +
            +++ b/spec/fixtures/rubocop_exception.rb
         | 
| 5 | 
            +
            @@ -2,4 +2,8 @@
         | 
| 6 | 
            +
             # frozen_string_literal: true
         | 
| 7 | 
            +
             
         | 
| 8 | 
            +
             module RubocopException
         | 
| 9 | 
            +
            +  # rubocop:disable Rails/SomeRule
         | 
| 10 | 
            +
            +  def some_method_with_disabled_rule
         | 
| 11 | 
            +
            +  end
         | 
| 12 | 
            +
            +  # rubocop:enable Rails/SomeRule
         | 
| 13 | 
            +
             end
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module FindInDiff
         | 
| 4 | 
            +
              def added_hunk_1
         | 
| 5 | 
            +
                # This should appear in hunk 1
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              def method_in_the_middle
         | 
| 9 | 
            +
                # Something something...
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                # This is several rows wide
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                # So that it has to end up in multiple hunks
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                # la dee da...
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              def added_hunk_2
         | 
| 19 | 
            +
                # This should appear in hunk 2
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
            end
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            diff --git a/spec/fixtures/find_in_diff.rb b/spec/fixtures/find_in_diff.rb
         | 
| 2 | 
            +
            index ea14920..bef5732 100644
         | 
| 3 | 
            +
            --- a/spec/fixtures/find_in_diff.rb
         | 
| 4 | 
            +
            +++ b/spec/fixtures/find_in_diff.rb
         | 
| 5 | 
            +
            @@ -1,6 +1,10 @@
         | 
| 6 | 
            +
             # frozen_string_literal: true
         | 
| 7 | 
            +
             
         | 
| 8 | 
            +
             module FindInDiff
         | 
| 9 | 
            +
            +  def added_hunk_1
         | 
| 10 | 
            +
            +    # This should appear in hunk 1
         | 
| 11 | 
            +
            +  end
         | 
| 12 | 
            +
            +
         | 
| 13 | 
            +
               def method_in_the_middle
         | 
| 14 | 
            +
                 # Something something...
         | 
| 15 | 
            +
             
         | 
| 16 | 
            +
            @@ -10,4 +14,8 @@ module FindInDiff
         | 
| 17 | 
            +
             
         | 
| 18 | 
            +
                 # la dee da...
         | 
| 19 | 
            +
               end
         | 
| 20 | 
            +
            +
         | 
| 21 | 
            +
            +  def added_hunk_2
         | 
| 22 | 
            +
            +    # This should appear in hunk 2
         | 
| 23 | 
            +
            +  end
         | 
| 24 | 
            +
             end
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            diff --git a/app/models/discourse.rb b/app/models/discourse.rb
         | 
| 2 | 
            +
            index 5451817..93b5fdf 100644
         | 
| 3 | 
            +
            --- a/app/models/discourse.rb
         | 
| 4 | 
            +
            +++ b/app/models/discourse.rb
         | 
| 5 | 
            +
            @@ -121,6 +121,12 @@ class Discourse
         | 
| 6 | 
            +
                     prefix_var = ENV['DISCOURSE_TOPIC_PREFIX']
         | 
| 7 | 
            +
                     prefix = '-' + prefix_var unless prefix_var.blank?
         | 
| 8 | 
            +
             
         | 
| 9 | 
            +
            +        if entry['title'].nil?
         | 
| 10 | 
            +
            +          title= "JTJ#{prefix.to_s}-#{Date.parse(entry['date']).strftime("%Y/%m/%d")}"
         | 
| 11 | 
            +
            +        else
         | 
| 12 | 
            +
            +          title= "JTJ#{prefix.to_s}-#{Date.parse(entry['date']).strftime("%Y/%m/%d")}-#{entry['title']}"
         | 
| 13 | 
            +
            +        end
         | 
| 14 | 
            +
            +
         | 
| 15 | 
            +
                     topic = Topic.find_by(entry_id: entry['id'])
         | 
| 16 | 
            +
                     unless topic.present?
         | 
| 17 | 
            +
                       Rails.logger.info "[Discourse](create_discourse_topic) Creating new topic for entry #{entry} with title #{title}"
         | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            Total score (lower is better) = 502
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            1) IDENTICAL code found in :iter (mass*2 = 232)
         | 
| 4 | 
            +
              app/controllers/pages_controller.rb:41
         | 
| 5 | 
            +
              app/controllers/pages_controller.rb:96
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            2) IDENTICAL code found in :if (mass*2 = 152)
         | 
| 8 | 
            +
              app/models/discourse.rb:124
         | 
| 9 | 
            +
              app/models/discourse.rb:177
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            3) IDENTICAL code found in :lasgn (mass*2 = 64)
         | 
| 12 | 
            +
              app/helpers/application_helper.rb:3
         | 
| 13 | 
            +
              app/mailers/jtj_mailer.rb:39
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            4) Similar code found in :defn (mass = 54)
         | 
| 16 | 
            +
              app/controllers/pages_controller.rb:127
         | 
| 17 | 
            +
              app/controllers/pages_controller.rb:134
         | 
| 18 | 
            +
              app/controllers/pages_controller.rb:141
         | 
| @@ -0,0 +1,72 @@ | |
| 1 | 
            +
            [
         | 
| 2 | 
            +
              {
         | 
| 3 | 
            +
                "id": 662033598,
         | 
| 4 | 
            +
                "url": "https://api.github.com/repos/watermarkchurch/jtj-cms/labels/backlog",
         | 
| 5 | 
            +
                "name": "backlog",
         | 
| 6 | 
            +
                "color": "ededed",
         | 
| 7 | 
            +
                "default": false
         | 
| 8 | 
            +
              },
         | 
| 9 | 
            +
              {
         | 
| 10 | 
            +
                "id": 592468992,
         | 
| 11 | 
            +
                "url": "https://api.github.com/repos/watermarkchurch/jtj-cms/labels/bug",
         | 
| 12 | 
            +
                "name": "bug",
         | 
| 13 | 
            +
                "color": "ee0701",
         | 
| 14 | 
            +
                "default": true
         | 
| 15 | 
            +
              },
         | 
| 16 | 
            +
              {
         | 
| 17 | 
            +
                "id": 592468993,
         | 
| 18 | 
            +
                "url": "https://api.github.com/repos/watermarkchurch/jtj-cms/labels/duplicate",
         | 
| 19 | 
            +
                "name": "duplicate",
         | 
| 20 | 
            +
                "color": "cccccc",
         | 
| 21 | 
            +
                "default": true
         | 
| 22 | 
            +
              },
         | 
| 23 | 
            +
              {
         | 
| 24 | 
            +
                "id": 592468994,
         | 
| 25 | 
            +
                "url": "https://api.github.com/repos/watermarkchurch/jtj-cms/labels/enhancement",
         | 
| 26 | 
            +
                "name": "enhancement",
         | 
| 27 | 
            +
                "color": "84b6eb",
         | 
| 28 | 
            +
                "default": true
         | 
| 29 | 
            +
              },
         | 
| 30 | 
            +
              {
         | 
| 31 | 
            +
                "id": 592468995,
         | 
| 32 | 
            +
                "url": "https://api.github.com/repos/watermarkchurch/jtj-cms/labels/help%20wanted",
         | 
| 33 | 
            +
                "name": "help wanted",
         | 
| 34 | 
            +
                "color": "128A0C",
         | 
| 35 | 
            +
                "default": true
         | 
| 36 | 
            +
              },
         | 
| 37 | 
            +
              {
         | 
| 38 | 
            +
                "id": 592468996,
         | 
| 39 | 
            +
                "url": "https://api.github.com/repos/watermarkchurch/jtj-cms/labels/invalid",
         | 
| 40 | 
            +
                "name": "invalid",
         | 
| 41 | 
            +
                "color": "e6e6e6",
         | 
| 42 | 
            +
                "default": true
         | 
| 43 | 
            +
              },
         | 
| 44 | 
            +
              {
         | 
| 45 | 
            +
                "id": 765977835,
         | 
| 46 | 
            +
                "url": "https://api.github.com/repos/watermarkchurch/jtj-cms/labels/Ops",
         | 
| 47 | 
            +
                "name": "Ops",
         | 
| 48 | 
            +
                "color": "000000",
         | 
| 49 | 
            +
                "default": false
         | 
| 50 | 
            +
              },
         | 
| 51 | 
            +
              {
         | 
| 52 | 
            +
                "id": 592468997,
         | 
| 53 | 
            +
                "url": "https://api.github.com/repos/watermarkchurch/jtj-cms/labels/question",
         | 
| 54 | 
            +
                "name": "question",
         | 
| 55 | 
            +
                "color": "cc317c",
         | 
| 56 | 
            +
                "default": true
         | 
| 57 | 
            +
              },
         | 
| 58 | 
            +
              {
         | 
| 59 | 
            +
                "id": 782232325,
         | 
| 60 | 
            +
                "url": "https://api.github.com/repos/watermarkchurch/jtj-cms/labels/schema%20changes",
         | 
| 61 | 
            +
                "name": "schema changes",
         | 
| 62 | 
            +
                "color": "82e5c7",
         | 
| 63 | 
            +
                "default": false
         | 
| 64 | 
            +
              },
         | 
| 65 | 
            +
              {
         | 
| 66 | 
            +
                "id": 592468999,
         | 
| 67 | 
            +
                "url": "https://api.github.com/repos/watermarkchurch/jtj-cms/labels/wontfix",
         | 
| 68 | 
            +
                "name": "wontfix",
         | 
| 69 | 
            +
                "color": "ffffff",
         | 
| 70 | 
            +
                "default": true
         | 
| 71 | 
            +
              }
         | 
| 72 | 
            +
            ]
         |