class PactBroker::Api::Renderers::HtmlPactRenderer
Public Class Methods
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 18 def self.call pact, options = {} new(pact, options).call end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 22 def initialize pact, options = {} @json_content = pact.json_content @pact = pact @options = options end
Public Instance Methods
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 28 def call "<html> <head>#{head}</head> <body> #{breadcrumbs}#{pact_metadata}#{html} </body> </html>" end
Private Instance Methods
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 221 def add_dummy_html_request_response_to_asynchronous_message(interaction) if !interaction["request"] || !interaction["response"] logger.warn "Interaction '#{interaction['description']}' does not have a request or response, adding dummy request and response so that they can be parsed and appear on the UI." end interaction["request"] ||= { method: "FAKE_ASYNC_METHOD", path: interaction["description"] } unless interaction.key?("response") interaction["response"] = { status: "FAKE_ASYNC_METHOD", body: { contents: interaction.delete("contents"), metadata: interaction.delete("metadata") } } end end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 242 def add_dummy_html_request_response_to_synchronous_message(interaction) if interaction["type"] == "Synchronous/Messages" interaction["request"] = { method: "FAKE_SYNC_METHOD", path: interaction["description"], body: interaction.delete("request"), } interaction["response"] = { status: "FAKE_SYNC_METHOD", body: { contents: interaction.delete("response"), } } end end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 98 def badge_list_item "<li class='pact-badge'> <img src=\"#{badge_url}\"/> </li>" end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 110 def badge_markdown warning = if badges_protected? "If the broker is protected by authentication, set `enable_public_badge_access` to true in the configuration to enable badges to be embedded in a markdown file.\n" else "" end "#{warning}[](#{badge_target_url})" end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 104 def badge_markdown_item "<li class='pact-badge-markdown' style='display:none'> <textarea rows='3' cols='100'>#{badge_markdown}</textarea> </li>" end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 167 def badge_target_url base_url end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 171 def badge_url @options[:badge_url] end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 119 def badges_protected? !PactBroker.configuration.enable_public_badge_access end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 123 def base_url @options[:base_url] || "" end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 197 def consumer_contract pact_object = JSON.parse(@json_content, quirks_mode: true) convert_v3_messages_to_interactions(pact_object) pact_object["interactions"]&.each do |interaction| add_dummy_html_request_response_to_asynchronous_message(interaction) add_dummy_html_request_response_to_synchronous_message(interaction) end new_json_content = pact_object.to_json Pact::ConsumerContract.from_json(new_json_content) rescue => e logger.info "Could not parse the following content to a Pact due to #{e.class} #{e.message}, showing raw content instead: #{@json_content}" raise NotAPactError end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 135 def consumer_name h(@pact.consumer.name) end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 131 def consumer_version_number h(@pact.consumer_version_number) end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 214 def convert_v3_messages_to_interactions(pact_object) return unless pact_object.key?("messages") logger.warn "Detected a v3 Pact, converting 'messages' to 'interactions'." pact_object["interactions"] = pact_object.delete("messages") end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 258 def h string Rack::Utils.escape_html(string) end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 39 def head "<title>#{title}</title> <link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/github.css'> <link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/github-json.css'> <link rel='stylesheet' type='text/css' href='#{base_url}/css/bootstrap.min.css'> <link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/material-menu.css'> <link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/pact.css'> <link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/jquery-confirm.min.css'> <script type='text/javascript'> const BASE_URL = '#{base_url}'; </script> <script src='#{base_url}/javascripts/set-css-asset-base-url.js'></script> <script src='#{base_url}/javascripts/highlight.pack.js'></script> <script src='#{base_url}/javascripts/jquery-3.5.1.min.js'></script> <script src='#{base_url}/js/bootstrap.min.js'></script> <script src='#{base_url}/javascripts/material-menu.js'></script> <script src='#{base_url}/javascripts/pact.js'></script> <script src='#{base_url}/javascripts/jquery-confirm.min.js'></script> <script>hljs.initHighlightingOnLoad();</script>" end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 193 def html Redcarpet::Markdown.new(Redcarpet::Render::HTML, :fenced_code_blocks => true, :lax_spacing => true).render(markdown) end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 151 def json_url PactBroker::Api::PactBrokerUrls.hal_browser_url pact_url, base_url end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 163 def latest_pact_url PactBroker::Api::PactBrokerUrls.latest_pact_url base_url, @pact end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 184 def markdown Pact::Doc::Markdown::ConsumerContractRenderer.call consumer_contract rescue StandardError heading = "### A contract between #{@pact.consumer.name} and #{@pact.provider.name}" warning = "_Note: this contract could not be parsed to a v1 or v2 Pact, showing raw content instead._" pretty_json = JSON.pretty_generate(@pact.content_hash) "#{heading}\n#{warning}\n```json\n#{pretty_json}\n```\n" end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 159 def matrix_url PactBroker::Api::PactBrokerUrls.matrix_for_pact_url(@pact, base_url) end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 71 def pact_metadata "<div class='pact-metadata'> <ul> #{badge_list_item} #{badge_markdown_item} <li> <span class='name'>#{consumer_name} version:</span> <span class='value'>#{consumer_version_number}#{tags}</span> </li> <li> <span class='name' title='#{published_date}'>Date published:</span> <span class='value' title='#{published_date}'>#{published_date_in_words}</span> </li> <li> <span data-consumer-name=\"#{consumer_name}\" data-provider-name=\"#{provider_name}\" data-consumer-version-number=\"#{consumer_version_number}\" data-api-browser-url=\"#{json_url}\" data-matrix-url=\"#{matrix_url}\" data-pact-url=\"#{pact_url}\" class='more-options kebab-horizontal' aria-hidden='true'></span> </li> </ul> </div>" end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 155 def pact_url PactBroker::Api::PactBrokerUrls.pact_url base_url, @pact end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 139 def provider_name h(@pact.provider.name) end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 143 def published_date @pact.created_at.to_time.localtime.to_datetime.strftime("%a %d %b %Y, %l:%M%P %:z") end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 147 def published_date_in_words PactBroker::DateHelper.distance_of_time_in_words(@pact.created_at.to_time, DateTime.now) + " ago" end
Source
# File lib/pact_broker/api/renderers/html_pact_renderer.rb, line 127 def title "Pact between #{consumer_name} and #{provider_name}" end