pact_broker 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +0 -1
  3. data/.rspec +1 -0
  4. data/CHANGELOG.md +47 -0
  5. data/README.md +4 -2
  6. data/config.ru +3 -5
  7. data/db/migrations/09_add_timestamps.rb +12 -0
  8. data/db/migrations/10_populate_timestamps.rb +15 -0
  9. data/db/migrations/11_made_timestamps_mandatory.rb +20 -0
  10. data/db/migrations/12_create_webhooks_table.rb +21 -0
  11. data/db/migrations/13_add_columns_to_webhooks.rb +8 -0
  12. data/lib/pact_broker/api.rb +14 -0
  13. data/lib/pact_broker/api/decorators.rb +2 -2
  14. data/lib/pact_broker/api/decorators/base_decorator.rb +2 -1
  15. data/lib/pact_broker/api/decorators/basic_pacticipant_decorator.rb +21 -0
  16. data/lib/pact_broker/api/decorators/decorator_context.rb +20 -0
  17. data/lib/pact_broker/api/decorators/latest_pact_decorator.rb +2 -2
  18. data/lib/pact_broker/api/decorators/pact_decorator.rb +12 -5
  19. data/lib/pact_broker/api/decorators/pact_details_decorator.rb +22 -0
  20. data/lib/pact_broker/api/decorators/pacticipant_decorator.rb +6 -4
  21. data/lib/pact_broker/api/decorators/relationships_csv_decorator.rb +25 -3
  22. data/lib/pact_broker/api/decorators/representable_pact.rb +3 -1
  23. data/lib/pact_broker/api/decorators/tag_decorator.rb +3 -0
  24. data/lib/pact_broker/api/decorators/webhook_decorator.rb +52 -0
  25. data/lib/pact_broker/api/decorators/webhook_execution_result_decorator.rb +58 -0
  26. data/lib/pact_broker/api/decorators/webhook_request_decorator.rb +18 -0
  27. data/lib/pact_broker/api/decorators/webhooks_decorator.rb +37 -0
  28. data/lib/pact_broker/api/pact_broker_urls.rb +16 -0
  29. data/lib/pact_broker/api/renderers/html_pact_renderer.rb +2 -1
  30. data/lib/pact_broker/api/resources/base_resource.rb +12 -1
  31. data/lib/pact_broker/api/resources/group.rb +38 -0
  32. data/lib/pact_broker/api/resources/index.rb +30 -21
  33. data/lib/pact_broker/api/resources/latest_pact.rb +1 -1
  34. data/lib/pact_broker/api/resources/latest_pacts.rb +1 -1
  35. data/lib/pact_broker/api/resources/pact.rb +18 -2
  36. data/lib/pact_broker/api/resources/pact_webhooks.rb +87 -0
  37. data/lib/pact_broker/api/resources/pacticipant.rb +15 -6
  38. data/lib/pact_broker/api/resources/pacticipants.rb +1 -1
  39. data/lib/pact_broker/api/resources/tag.rb +2 -2
  40. data/lib/pact_broker/api/resources/webhook.rb +44 -0
  41. data/lib/pact_broker/api/resources/webhook_execution.rb +43 -0
  42. data/lib/pact_broker/api/resources/webhooks.rb +29 -0
  43. data/lib/pact_broker/app.rb +46 -8
  44. data/lib/pact_broker/db.rb +10 -0
  45. data/lib/pact_broker/doc/controllers/app.rb +32 -0
  46. data/lib/pact_broker/doc/views/latest-pacts.markdown +3 -0
  47. data/lib/pact_broker/doc/views/layouts/main.haml +5 -0
  48. data/lib/pact_broker/doc/views/pacticipants.markdown +10 -0
  49. data/lib/pact_broker/doc/views/self.markdown +8 -0
  50. data/lib/pact_broker/doc/views/webhooks.markdown +48 -0
  51. data/lib/pact_broker/functions/groupify.rb +39 -0
  52. data/lib/pact_broker/jobs/after_pact_save.rb +13 -0
  53. data/lib/pact_broker/json.rb +4 -0
  54. data/lib/pact_broker/locale/en.yml +23 -0
  55. data/lib/pact_broker/messages.rb +18 -0
  56. data/lib/pact_broker/models/group.rb +21 -0
  57. data/lib/pact_broker/models/pact.rb +4 -2
  58. data/lib/pact_broker/models/pacticipant.rb +3 -1
  59. data/lib/pact_broker/models/relationship.rb +34 -0
  60. data/lib/pact_broker/models/tag.rb +3 -1
  61. data/lib/pact_broker/models/version.rb +3 -1
  62. data/lib/pact_broker/models/webhook.rb +53 -0
  63. data/lib/pact_broker/models/webhook_execution_result.rb +26 -0
  64. data/lib/pact_broker/models/webhook_request.rb +107 -0
  65. data/lib/pact_broker/models/webhook_request_header.rb +13 -0
  66. data/lib/pact_broker/repositories.rb +6 -0
  67. data/lib/pact_broker/repositories/pact_repository.rb +25 -7
  68. data/lib/pact_broker/repositories/pacticipant_repository.rb +4 -0
  69. data/lib/pact_broker/repositories/webhook_repository.rb +134 -0
  70. data/lib/pact_broker/services.rb +10 -0
  71. data/lib/pact_broker/services/group_service.rb +24 -0
  72. data/lib/pact_broker/services/pact_service.rb +37 -7
  73. data/lib/pact_broker/services/pacticipant_service.rb +12 -1
  74. data/lib/pact_broker/services/webhook_service.rb +63 -0
  75. data/lib/pact_broker/tasks.rb +0 -1
  76. data/lib/pact_broker/ui/controllers/base_controller.rb +1 -0
  77. data/lib/pact_broker/ui/controllers/groups.rb +25 -0
  78. data/lib/pact_broker/ui/controllers/relationships.rb +0 -2
  79. data/lib/pact_broker/ui/helpers/url_helper.rb +17 -0
  80. data/lib/pact_broker/ui/view_models/relationship.rb +13 -4
  81. data/lib/pact_broker/ui/view_models/relationships.rb +1 -1
  82. data/lib/pact_broker/ui/views/groups/show.html.erb +409 -0
  83. data/lib/pact_broker/ui/views/relationships/show.haml +4 -2
  84. data/lib/pact_broker/version.rb +1 -1
  85. data/pact_broker.gemspec +7 -6
  86. data/public/{d3.v3.js.pagespeed.ce.dFNRrGTALe.js → javascripts/d3.v3.js.pagespeed.ce.dFNRrGTALe.js} +0 -0
  87. data/public/stylesheets/relationships.css +4 -0
  88. data/spec/integration/endpoints/group.rb +22 -0
  89. data/spec/lib/pact_broker/api/decorators/pact_decorator_spec.rb +49 -0
  90. data/spec/lib/pact_broker/api/decorators/pacticipant_decorator_spec.rb +25 -0
  91. data/spec/lib/pact_broker/api/decorators/relationships_csv_decorator_spec.rb +7 -4
  92. data/spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb +121 -0
  93. data/spec/lib/pact_broker/api/decorators/webhook_execution_result_decorator_spec.rb +69 -0
  94. data/spec/lib/pact_broker/api/decorators/webhook_request_decorator_spec.rb +78 -0
  95. data/spec/lib/pact_broker/api/decorators/webhooks_decorator_spec.rb +46 -0
  96. data/spec/lib/pact_broker/api/resources/group_spec.rb +80 -0
  97. data/spec/lib/pact_broker/api/resources/pact_spec.rb +41 -0
  98. data/spec/lib/pact_broker/api/resources/pact_webhooks_spec.rb +184 -0
  99. data/spec/lib/pact_broker/api/resources/pacticipant_spec.rb +71 -0
  100. data/spec/lib/pact_broker/api/resources/webhook_execution_spec.rb +77 -0
  101. data/spec/lib/pact_broker/api/resources/webhook_spec.rb +60 -0
  102. data/spec/lib/pact_broker/api/resources/webhooks_spec.rb +44 -0
  103. data/spec/lib/pact_broker/doc/controllers/app_spec.rb +51 -0
  104. data/spec/lib/pact_broker/functions/groupify_spec.rb +50 -0
  105. data/spec/lib/pact_broker/models/group_spec.rb +26 -0
  106. data/spec/lib/pact_broker/models/webhook_request_spec.rb +175 -0
  107. data/spec/lib/pact_broker/models/webhook_spec.rb +59 -0
  108. data/spec/lib/pact_broker/repositories/pact_repository_spec.rb +40 -0
  109. data/spec/lib/pact_broker/repositories/webhook_repository_spec.rb +257 -0
  110. data/spec/lib/pact_broker/services/group_service_spec.rb +52 -0
  111. data/spec/lib/pact_broker/services/pact_service_spec.rb +49 -0
  112. data/spec/lib/pact_broker/services/pacticipant_service_spec.rb +50 -0
  113. data/spec/lib/pact_broker/services/webhook_service_spec.rb +51 -0
  114. data/spec/lib/pact_broker/ui/view_models/relationship_spec.rb +20 -6
  115. data/spec/lib/pact_broker/ui/view_models/relationships_spec.rb +33 -0
  116. data/spec/service_consumers/provider_states_for_pact_broker_client.rb +1 -1
  117. data/spec/spec_helper.rb +11 -4
  118. data/spec/support/provider_state_builder.rb +11 -0
  119. data/spec/support/shared_examples_for_responses.rb +25 -0
  120. data/vendor/hal-browser/js/hal/views/embedded_resource.js +3 -3
  121. data/vendor/hal-browser/js/hal/views/resource.js +3 -3
  122. metadata +174 -80
  123. data/assets/d3.v3.js +0 -9263
  124. data/assets/force.csv +0 -29
  125. data/assets/index.html +0 -186
  126. data/assets/index2.html +0 -224
  127. data/assets/relationships +0 -4
  128. data/assets/stylesheets/github.css +0 -387
  129. data/lib/pact_broker/tasks/delete.rake +0 -20
  130. data/public/Network Graph REA.html +0 -48
  131. data/public/rea.csv +0 -10
@@ -9,6 +9,10 @@ module PactBroker
9
9
  PactBroker::Models::Pacticipant.where(name: name).single_record
10
10
  end
11
11
 
12
+ def find_by_id id
13
+ PactBroker::Models::Pacticipant.where(id: id).single_record
14
+ end
15
+
12
16
  def find_all
13
17
  PactBroker::Models::Pacticipant.order(:name).all
14
18
  end
@@ -0,0 +1,134 @@
1
+ require 'sequel'
2
+ require 'pact_broker/models/webhook'
3
+ require 'pact_broker/models/pacticipant'
4
+ require 'pact_broker/db'
5
+ require 'base64'
6
+
7
+ module PactBroker
8
+ module Repositories
9
+
10
+ class WebhookRepository
11
+
12
+ # Experimenting with decoupling the model from the database representation.
13
+ # Sure makes it messier for saving/retrieving.
14
+
15
+ include Repositories
16
+
17
+ def create webhook, consumer, provider
18
+ db_webhook = Webhook.from_model webhook, consumer, provider
19
+ db_webhook.uuid = SecureRandom.urlsafe_base64
20
+ db_webhook.save
21
+ webhook.request.headers.each_pair do | name, value |
22
+ db_webhook.add_header WebhookHeader.from_model(name, value, db_webhook.id)
23
+ end
24
+
25
+ find_by_uuid db_webhook.uuid
26
+ end
27
+
28
+ def find_by_uuid uuid
29
+ db_webhook = Webhook.where(uuid: uuid).single_record
30
+ return nil if db_webhook.nil?
31
+ db_webhook.to_model
32
+ end
33
+
34
+ def delete_by_uuid uuid
35
+ Webhook.where(uuid: uuid).destroy
36
+ end
37
+
38
+ def delete_by_pacticipant pacticipant
39
+ Webhook.where(consumer_id: pacticipant.id).destroy
40
+ Webhook.where(provider_id: pacticipant.id).destroy
41
+ end
42
+
43
+ def find_all
44
+ Webhook.all.collect { | db_webhook| db_webhook.to_model }
45
+ end
46
+
47
+ def find_by_consumer_and_provider consumer, provider
48
+ Webhook.where(consumer_id: consumer.id, provider_id: provider.id).collect { | db_webhook| db_webhook.to_model }
49
+ end
50
+
51
+ end
52
+
53
+ class Webhook < Sequel::Model
54
+
55
+ set_primary_key :id
56
+ associate(:many_to_one, :provider, :class => "PactBroker::Models::Pacticipant", :key => :provider_id, :primary_key => :id)
57
+ associate(:many_to_one, :consumer, :class => "PactBroker::Models::Pacticipant", :key => :consumer_id, :primary_key => :id)
58
+ one_to_many :headers, :class => "PactBroker::Repositories::WebhookHeader", :reciprocal => :webhook
59
+
60
+ def before_destroy
61
+ WebhookHeader.where(webhook_id: id).destroy
62
+ end
63
+
64
+ def self.from_model webhook, consumer, provider
65
+ is_json_request_body = !(String === webhook.request.body || webhook.request.body.nil?) # Can't rely on people to set content type
66
+ new(
67
+ uuid: webhook.uuid,
68
+ method: webhook.request.method,
69
+ url: webhook.request.url,
70
+ username: webhook.request.username,
71
+ password: not_plain_text_password(webhook.request.password),
72
+ body: (is_json_request_body ? webhook.request.body.to_json : webhook.request.body),
73
+ is_json_request_body: is_json_request_body
74
+ ).tap do | db_webhook |
75
+ db_webhook.consumer_id = consumer.id
76
+ db_webhook.provider_id = provider.id
77
+ end
78
+ end
79
+
80
+ def self.not_plain_text_password password
81
+ password.nil? ? nil : Base64.strict_encode64(password)
82
+ end
83
+
84
+ def to_model
85
+ Models::Webhook.new(
86
+ uuid: uuid,
87
+ consumer: consumer,
88
+ provider: provider,
89
+ request: Models::WebhookRequest.new(request_attributes),
90
+ created_at: created_at,
91
+ updated_at: updated_at)
92
+ end
93
+
94
+ def request_attributes
95
+ values.merge(headers: parsed_headers, body: parsed_body, password: plain_text_password)
96
+ end
97
+
98
+ def plain_text_password
99
+ password.nil? ? nil : Base64.strict_decode64(password)
100
+ end
101
+
102
+ def parsed_headers
103
+ WebhookHeader.where(webhook_id: id).all.each_with_object({}) do | header, hash |
104
+ hash[header[:name]] = header[:value]
105
+ end
106
+ end
107
+
108
+ def parsed_body
109
+ if body && is_json_request_body
110
+ JSON.parse(body)
111
+ else
112
+ body
113
+ end
114
+ end
115
+
116
+ end
117
+
118
+ Webhook.plugin :timestamps, :update_on_create=>true
119
+
120
+ class WebhookHeader < Sequel::Model
121
+
122
+ associate(:many_to_one, :webhook, :class => "PactBroker::Repositories::Webhook", :key => :webhook_id, :primary_key => :id)
123
+
124
+ def self.from_model name, value, webhook_id
125
+ db_header = new
126
+ db_header.name = name
127
+ db_header.value = value
128
+ db_header.webhook_id = webhook_id
129
+ db_header
130
+ end
131
+
132
+ end
133
+ end
134
+ end
@@ -1,6 +1,8 @@
1
1
  require 'pact_broker/services/pact_service'
2
2
  require 'pact_broker/services/pacticipant_service'
3
3
  require 'pact_broker/services/tag_service'
4
+ require 'pact_broker/services/group_service'
5
+ require 'pact_broker/services/webhook_service'
4
6
 
5
7
  module PactBroker
6
8
  module Services
@@ -15,5 +17,13 @@ module PactBroker
15
17
  def tag_service
16
18
  TagService
17
19
  end
20
+
21
+ def group_service
22
+ GroupService
23
+ end
24
+
25
+ def webhook_service
26
+ WebhookService
27
+ end
18
28
  end
19
29
  end
@@ -0,0 +1,24 @@
1
+ require 'pact_broker/repositories'
2
+ require 'pact_broker/functions/groupify'
3
+
4
+ module PactBroker
5
+
6
+ module Services
7
+ module GroupService
8
+
9
+ extend self
10
+
11
+ extend PactBroker::Repositories
12
+ extend PactBroker::Services
13
+
14
+ def find_group_containing pacticipant
15
+ groups.find { | group | group.include_pacticipant? pacticipant }
16
+ end
17
+
18
+ def groups
19
+ Functions::Groupify.call pacticipant_service.find_relationships
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -7,7 +7,8 @@ module PactBroker
7
7
 
8
8
  extend self
9
9
 
10
- extend PactBroker::Repositories
10
+ extend Repositories
11
+ extend Services
11
12
 
12
13
  def find_latest_pact params
13
14
  pact_repository.find_latest_pact(params[:consumer_name], params[:provider_name], params[:tag])
@@ -24,18 +25,47 @@ module PactBroker
24
25
  def create_or_update_pact params
25
26
  provider = pacticipant_repository.find_by_name_or_create params[:provider_name]
26
27
  consumer = pacticipant_repository.find_by_name_or_create params[:consumer_name]
27
- version = version_repository.find_by_pacticipant_id_and_number_or_create consumer.id, params[:consumer_version_number]
28
+ consumer_version = version_repository.find_by_pacticipant_id_and_number_or_create consumer.id, params[:consumer_version_number]
29
+ pact = pact_repository.find_by_version_and_provider(consumer_version.id, provider.id)
28
30
 
29
- if pact = pact_repository.find_by_version_and_provider(version.id, provider.id)
30
- pact.update(json_content: params[:json_content])
31
- return pact, false
31
+ if pact
32
+ return update_pact params, pact
32
33
  else
33
- pact = pact_repository.create json_content: params[:json_content], version_id: version.id, provider_id: provider.id
34
- return pact, true
34
+ return create_pact params, consumer_version, provider
35
35
  end
36
36
 
37
37
  end
38
38
 
39
+ def pact_has_changed_since_previous_version? pact
40
+ previous_pact = pact_repository.find_previous_pact pact
41
+ previous_pact && pact.json_content != previous_pact.json_content
42
+ end
43
+
44
+ private
45
+
46
+ def update_pact params, pact
47
+ previous_json_content = pact.json_content
48
+ pact.update(json_content: params[:json_content])
49
+ if previous_json_content != params[:json_content]
50
+ webhook_service.execute_webhooks pact
51
+ end
52
+ return pact, false
53
+ end
54
+
55
+ def create_pact params, version, provider
56
+ pact = pact_repository.create json_content: params[:json_content], version_id: version.id, provider_id: provider.id
57
+ execute_webhooks pact
58
+ return pact, true
59
+ end
60
+
61
+
62
+
63
+ def execute_webhooks pact
64
+ if pact_has_changed_since_previous_version? pact
65
+ webhook_service.execute_webhooks pact
66
+ end
67
+ end
68
+
39
69
  end
40
70
  end
41
71
  end
@@ -7,7 +7,7 @@ module PactBroker
7
7
  class PacticipantService
8
8
 
9
9
  extend PactBroker::Repositories
10
- extend PactBroker::Repositories
10
+ extend PactBroker::Services
11
11
 
12
12
  def self.find_all_pacticipants
13
13
  pacticipant_repository.find_all
@@ -40,6 +40,17 @@ module PactBroker
40
40
  pacticipant_repository.create(params)
41
41
  end
42
42
 
43
+ def self.delete name
44
+ pacticipant = find_pacticipant_by_name name
45
+ connection = PactBroker::Models::Pacticipant.new.db
46
+ connection.run("delete from tags where version_id IN (select id from versions where pacticipant_id IN (select id from pacticipants where name = '#{name}'))")
47
+ connection.run("delete from pacts where version_id IN (select id from versions where pacticipant_id IN (select id from pacticipants where name = '#{name}'))")
48
+ connection.run("delete from pacts where provider_id IN (select id from pacticipants where name = '#{name}')")
49
+ connection.run("delete from versions where pacticipant_id IN (select id from pacticipants where name = '#{name}')")
50
+ webhook_service.delete_by_pacticipant pacticipant
51
+ connection.run("delete from pacticipants where name = '#{name}'")
52
+ end
53
+
43
54
  end
44
55
  end
45
56
  end
@@ -0,0 +1,63 @@
1
+ require 'pact_broker/repositories'
2
+ require 'pact_broker/logging'
3
+
4
+ module PactBroker
5
+
6
+ module Services
7
+ class WebhookService
8
+
9
+ extend Repositories
10
+ include Logging
11
+
12
+ def self.create webhook, consumer, provider
13
+ webhook_repository.create webhook, consumer, provider
14
+ end
15
+
16
+ def self.find_by_uuid uuid
17
+ webhook_repository.find_by_uuid uuid
18
+ end
19
+
20
+ def self.delete_by_uuid uuid
21
+ webhook_repository.delete_by_uuid uuid
22
+ end
23
+
24
+ def self.delete_by_pacticipant pacticipant
25
+ webhook_repository.delete_by_pacticipant pacticipant
26
+ end
27
+
28
+ def self.find_all
29
+ webhook_repository.find_all
30
+ end
31
+
32
+ def self.execute_webhook_now webhook
33
+ webhook.execute
34
+ end
35
+
36
+ def self.find_by_consumer_and_provider consumer, provider
37
+ webhook_repository.find_by_consumer_and_provider consumer, provider
38
+ end
39
+
40
+ def self.execute_webhooks pact
41
+ webhooks = webhook_repository.find_by_consumer_and_provider pact.consumer, pact.provider
42
+ if webhooks.any?
43
+ run_later(webhooks)
44
+ else
45
+ logger.debug "No webhook found for consumer \"#{pact.consumer.name}\" and provider \"#{pact.provider.name}\""
46
+ end
47
+ end
48
+
49
+ # TODO background job?
50
+ def self.run_later webhooks
51
+ Thread.new do
52
+ webhooks.each do | webhook |
53
+ begin
54
+ webhook.execute
55
+ rescue StandardError => e
56
+ # Exceptions are already logged, no need to log again.
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -1,2 +1 @@
1
1
  require 'pact_broker/tasks/migration_task'
2
- load File.dirname(__FILE__) + '/tasks/delete.rake'
@@ -8,6 +8,7 @@ module PactBroker
8
8
  class Base < Padrino::Application
9
9
 
10
10
  set :root, File.join(File.dirname(__FILE__), '..')
11
+ set :show_exceptions, true
11
12
 
12
13
  end
13
14
  end
@@ -0,0 +1,25 @@
1
+ require 'pact_broker/ui/controllers/base_controller'
2
+ require 'pact_broker/ui/view_models/relationships'
3
+ require 'haml'
4
+
5
+ module PactBroker
6
+ module UI
7
+ module Controllers
8
+ class Groups < Base
9
+
10
+ include PactBroker::Services
11
+
12
+ get ":name" do
13
+ erb :'groups/show.html', {
14
+ locals: {
15
+ csv_path: "/groups/#{params[:name]}/csv",
16
+ pacticipant_name: params[:name]}
17
+ }, {
18
+ layout: 'layouts/main'
19
+ }
20
+ end
21
+
22
+ end
23
+ end
24
+ end
25
+ end
@@ -9,8 +9,6 @@ module PactBroker
9
9
 
10
10
  include PactBroker::Services
11
11
 
12
- set :root, File.join(File.dirname(__FILE__), '..')
13
-
14
12
  get "/" do
15
13
  view_model = ViewModels::Relationships.new(pacticipant_service.find_relationships)
16
14
 
@@ -0,0 +1,17 @@
1
+ require 'erb'
2
+
3
+ module PactBroker
4
+ module UI
5
+ module Helpers
6
+ module URLHelper
7
+
8
+ extend self
9
+
10
+ def group_url pacticipant_name
11
+ "/groups/#{ERB::Util.url_encode(pacticipant_name)}"
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,4 +1,5 @@
1
1
  require 'pact_broker/api/pact_broker_urls'
2
+ require 'pact_broker/ui/helpers/url_helper'
2
3
 
3
4
  module PactBroker
4
5
  module UI
@@ -12,11 +13,19 @@ module PactBroker
12
13
  end
13
14
 
14
15
  def consumer_name
15
- @relationship.consumer.name
16
+ @relationship.consumer_name
16
17
  end
17
18
 
18
19
  def provider_name
19
- @relationship.provider.name
20
+ @relationship.provider_name
21
+ end
22
+
23
+ def consumer_group_url
24
+ Helpers::URLHelper.group_url consumer_name
25
+ end
26
+
27
+ def provider_group_url
28
+ Helpers::URLHelper.group_url provider_name
20
29
  end
21
30
 
22
31
  def latest_pact_url
@@ -24,9 +33,9 @@ module PactBroker
24
33
  end
25
34
 
26
35
  def <=> other
27
- comp = consumer_name <=> other.consumer_name
36
+ comp = consumer_name.downcase <=> other.consumer_name.downcase
28
37
  return comp unless comp == 0
29
- provider_name <=> other.provider_name
38
+ provider_name.downcase <=> other.provider_name.downcase
30
39
  end
31
40
 
32
41
  end