pact_broker 2.9.0 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -1
  3. data/config.ru +2 -2
  4. data/lib/pact_broker/api/decorators/relationships_csv_decorator.rb +6 -6
  5. data/lib/pact_broker/domain/group.rb +3 -3
  6. data/lib/pact_broker/domain/{relationship.rb → index_item.rb} +27 -7
  7. data/lib/pact_broker/groups/service.rb +2 -3
  8. data/lib/pact_broker/index/service.rb +56 -0
  9. data/lib/pact_broker/pacticipants/service.rb +0 -12
  10. data/lib/pact_broker/pacts/pact_publication.rb +4 -0
  11. data/lib/pact_broker/pacts/repository.rb +1 -1
  12. data/lib/pact_broker/relationships/groupify.rb +8 -8
  13. data/lib/pact_broker/services.rb +5 -0
  14. data/lib/pact_broker/tags/repository.rb +11 -1
  15. data/lib/pact_broker/tags/service.rb +3 -1
  16. data/lib/pact_broker/ui/app.rb +3 -3
  17. data/lib/pact_broker/ui/controllers/clusters.rb +1 -1
  18. data/lib/pact_broker/ui/controllers/groups.rb +1 -1
  19. data/lib/pact_broker/ui/controllers/index.rb +22 -0
  20. data/lib/pact_broker/ui/view_models/{relationship.rb → index_item.rb} +32 -5
  21. data/lib/pact_broker/ui/view_models/index_items.rb +30 -0
  22. data/lib/pact_broker/ui/views/index/show-with-tags.haml +83 -0
  23. data/lib/pact_broker/ui/views/{relationships → index}/show.haml +18 -18
  24. data/lib/pact_broker/ui/views/matrix/show.haml +1 -1
  25. data/lib/pact_broker/verifications/repository.rb +3 -0
  26. data/lib/pact_broker/version.rb +1 -1
  27. data/public/stylesheets/{relationships.css → index.css} +0 -0
  28. data/script/seed.rb +55 -39
  29. data/spec/integration/app_spec.rb +1 -1
  30. data/spec/integration/endpoints/{group.rb → group_spec.rb} +0 -3
  31. data/spec/integration/ui/index_spec.rb +36 -0
  32. data/spec/lib/pact_broker/domain/group_spec.rb +3 -3
  33. data/spec/lib/pact_broker/domain/{relationship_spec.rb → index_items_spec.rb} +3 -3
  34. data/spec/lib/pact_broker/groups/service_spec.rb +5 -4
  35. data/spec/lib/pact_broker/index/service_spec.rb +131 -0
  36. data/spec/lib/pact_broker/pacticipants/service_spec.rb +2 -35
  37. data/spec/lib/pact_broker/pacts/pact_publication_spec.rb +35 -0
  38. data/spec/lib/pact_broker/pacts/repository_spec.rb +16 -14
  39. data/spec/lib/pact_broker/relationships/groupify_spec.rb +7 -7
  40. data/spec/lib/pact_broker/tags/repository_spec.rb +23 -1
  41. data/spec/lib/pact_broker/tags/service_spec.rb +0 -1
  42. data/spec/lib/pact_broker/ui/controllers/index_spec.rb +71 -0
  43. data/spec/lib/pact_broker/ui/view_models/{relationship_spec.rb → index_item_spec.rb} +38 -18
  44. data/spec/lib/pact_broker/ui/view_models/{relationships_spec.rb → index_items_spec.rb} +10 -10
  45. metadata +26 -18
  46. data/lib/pact_broker/ui/controllers/relationships.rb +0 -21
  47. data/lib/pact_broker/ui/view_models/relationships.rb +0 -30
  48. data/spec/lib/pact_broker/ui/controllers/relationships_spec.rb +0 -39
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3d11875536cc6d2a888c0774fa732e34fe2709d0
4
- data.tar.gz: ac11e2c9f5c4f8dddccf82e71049e8a5dec41258
3
+ metadata.gz: c0922b07d5bcc9db298ee95d05ce341ba4ff3030
4
+ data.tar.gz: a94f37ca9589e003343ad2bd2b7f745740ca4620
5
5
  SHA512:
6
- metadata.gz: 5ef0c92ce55eb054238d06849b734d5fca37fbdc3350684e87b2034932cb84e9f3ca935d8128f4a1f5ddbad3a15d27e5a43c70b72d33b700d6d2d68f78c66a80
7
- data.tar.gz: db1f2c583ca514e0c3673f9be6c65802482ff1f79cf35fdd93d8bd4dbce51b55c4c565c4243ae8e0c5f0e9c6f648619e9af4d460d1720f029bb39d20ac048515
6
+ metadata.gz: 7a93bced15dab3e293a8198ae278c666b8c15457bd4c30a552d1bc8c3cb4328e8eca20c4808132626cfa050b4a43fbb65e774a660f16c6a764fd6e511aa9d44f
7
+ data.tar.gz: '0239cfe02ffb216cb6cc7551a7e11dfba098f1e2a520b3f7ef13b321bbc8d49aa433a3986d97c569f9d98c084ddc2a46f8d48013072bf107ee095c5c1ae4af2e'
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ <a name="v2.10.0"></a>
2
+ ### v2.10.0 (2017-11-11)
3
+
4
+
5
+ #### Features
6
+
7
+ * **prod pacts in index**
8
+ * allow all tags to be shown on index ([0a1f0ee](/../../commit/0a1f0ee))
9
+ * allow tags shown in index to be configured via query string ([4eca8ee](/../../commit/4eca8ee))
10
+ * show pacts tagged as the 'prod' or 'production' versions on the index page ([b58b7a3](/../../commit/b58b7a3))
11
+
12
+ * **index page**
13
+ * truncate git shas in table ([94da4c7](/../../commit/94da4c7))
14
+
15
+
1
16
  <a name="v2.9.0"></a>
2
17
  ### v2.9.0 (2017-11-09)
3
18
 
@@ -6,7 +21,7 @@
6
21
  * **webhook templating**
7
22
  * add support for ${pactbroker.pactUrl} in query and body ([0eed596](/../../commit/0eed596))
8
23
 
9
- * **matrix**
24
+ * **matrix** _(note that the matrix resource is still in beta, and there may be breaking changes in the future)_
10
25
  * allow query to determine if a particular pacticipant version is compatible with the latest tagged versions of all its dependencies ([ba4a1cc](/../../commit/ba4a1cc))
11
26
 
12
27
  <a name="v2.8.0.beta.5"></a>
@@ -86,6 +101,14 @@
86
101
 
87
102
  * show webhook status as not_run when all triggered webhooks are not_run ([2d014b2](/../../commit/2d014b2))
88
103
 
104
+ <a name="v2.7.0.beta.1"></a>
105
+ ### v2.7.0.beta.1 (2017-10-16)
106
+
107
+ #### Features
108
+
109
+ * **prod pacts in index**
110
+ * show pacts tagged as the 'prod' or 'production' versions on the index page ([b58b7a3](/../../commit/b58b7a3))
111
+
89
112
  <a name="v2.6.0"></a>
90
113
  ### v2.6.0 (2017-10-06)
91
114
 
data/config.ru CHANGED
@@ -2,14 +2,14 @@ require File.dirname(__FILE__) + '/config/boot'
2
2
  require 'db'
3
3
  require 'pact_broker/api'
4
4
  require 'rack/hal_browser'
5
- require 'pact_broker/ui/controllers/relationships'
5
+ require 'pact_broker/ui/controllers/index'
6
6
 
7
7
 
8
8
  use Rack::Static, :urls => ["/stylesheets", "/css", "/fonts", "/js", "/javascripts", "/images"], :root => "public"
9
9
  use Rack::HalBrowser::Redirect, :exclude => ['/diagnostic', '/trace','/index']
10
10
 
11
11
  run Rack::URLMap.new(
12
- '/ui/relationships' => PactBroker::UI::Controllers::Relationships,
12
+ '/ui/relationships' => PactBroker::UI::Controllers::Index,
13
13
  '/network-graph' => Rack::File.new("#{File.dirname(__FILE__)}/public/Network Graph REA.html"),
14
14
  '/' => PactBroker::API,
15
15
  )
@@ -11,17 +11,17 @@ module PactBroker
11
11
 
12
12
  def initialize pacts
13
13
  @pacts = pacts
14
- @relationships = pacts.collect{|pact| PactBroker::Domain::Relationship.new(pact.consumer,pact.provider)}
14
+ @index_items = pacts.collect{|pact| PactBroker::Domain::IndexItem.new(pact.consumer,pact.provider)}
15
15
  end
16
16
 
17
17
  def to_csv
18
18
  hash = {}
19
- pacticipants = @relationships.collect{|r| r.pacticipants}.flatten.uniq
19
+ pacticipants = @index_items.collect{|r| r.pacticipants}.flatten.uniq
20
20
 
21
- @relationships.each do | relationship |
22
- hash[relationship.consumer.id] ||= pacticipant_array(relationship.consumer, hash.size + 1)
23
- hash[relationship.provider.id] ||= pacticipant_array(relationship.provider, hash.size + 1)
24
- hash[relationship.consumer.id] << relationship.provider.id
21
+ @index_items.each do | index_item |
22
+ hash[index_item.consumer.id] ||= pacticipant_array(index_item.consumer, hash.size + 1)
23
+ hash[index_item.provider.id] ||= pacticipant_array(index_item.provider, hash.size + 1)
24
+ hash[index_item.consumer.id] << index_item.provider.id
25
25
  end
26
26
 
27
27
  max_length = hash.values.collect{|array| array.size}.max
@@ -2,8 +2,8 @@ module PactBroker
2
2
  module Domain
3
3
  class Group < Array
4
4
 
5
- def initialize *relationships
6
- self.concat relationships.flatten
5
+ def initialize *index_items
6
+ self.concat index_items.flatten
7
7
  end
8
8
 
9
9
  def == other
@@ -11,7 +11,7 @@ module PactBroker
11
11
  end
12
12
 
13
13
  def include_pacticipant? pacticipant
14
- any? { | relationship | relationship.include? pacticipant }
14
+ any? { | index_item | index_item.include? pacticipant }
15
15
  end
16
16
 
17
17
  end
@@ -3,26 +3,30 @@ require 'pact_broker/webhooks/status'
3
3
 
4
4
  module PactBroker
5
5
  module Domain
6
- class Relationship
6
+ class IndexItem
7
7
 
8
8
  attr_reader :consumer, :provider, :latest_pact, :latest_verification, :webhooks
9
9
 
10
- def initialize consumer, provider, latest_pact = nil, latest_verification = nil, webhooks = [], triggered_webhooks = []
10
+ def initialize consumer, provider, latest_pact = nil, latest = true, latest_verification = nil, webhooks = [], triggered_webhooks = [], tags = []
11
11
  @consumer = consumer
12
12
  @provider = provider
13
13
  @latest_pact = latest_pact
14
+ @latest = latest
14
15
  @latest_verification = latest_verification
15
16
  @webhooks = webhooks
16
17
  @triggered_webhooks = triggered_webhooks
18
+ @tags = tags
17
19
  end
18
20
 
19
- def self.create consumer, provider, latest_pact, latest_verification, webhooks = [], triggered_webhooks = []
20
- new consumer, provider, latest_pact, latest_verification, webhooks, triggered_webhooks
21
+ def self.create consumer, provider, latest_pact, latest, latest_verification, webhooks = [], triggered_webhooks = [], tags = []
22
+ new consumer, provider, latest_pact, latest, latest_verification, webhooks, triggered_webhooks, tags
21
23
  end
22
24
 
23
25
  def eq? other
24
- Relationship === other && other.consumer == consumer && other.provider == provider &&
25
- other.latest_pact == latest_pact && other.latest_verification == latest_verification &&
26
+ IndexItem === other && other.consumer == consumer && other.provider == provider &&
27
+ other.latest_pact == latest_pact &&
28
+ other.latest? == latest? &&
29
+ other.latest_verification == latest_verification &&
26
30
  other.webhooks == webhooks
27
31
  end
28
32
 
@@ -42,6 +46,22 @@ module PactBroker
42
46
  @latest_pact
43
47
  end
44
48
 
49
+ def latest?
50
+ @latest
51
+ end
52
+
53
+ def consumer_version_number
54
+ @latest_pact.consumer_version_number
55
+ end
56
+
57
+ def provider_version_number
58
+ @latest_verification ? @latest_verification.provider_version_number : nil
59
+ end
60
+
61
+ def tag_names
62
+ @tags
63
+ end
64
+
45
65
  def any_webhooks?
46
66
  @webhooks.any?
47
67
  end
@@ -97,7 +117,7 @@ module PactBroker
97
117
  end
98
118
 
99
119
  def to_s
100
- "Relationship between #{consumer_name} and #{provider_name}"
120
+ "Pact between #{consumer_name} and #{provider_name}"
101
121
  end
102
122
 
103
123
  def to_a
@@ -16,9 +16,8 @@ module PactBroker
16
16
  end
17
17
 
18
18
  def groups
19
- Relationships::Groupify.call pacticipant_service.find_relationships
19
+ Relationships::Groupify.call index_service.find_index_items
20
20
  end
21
-
22
21
  end
23
22
  end
24
- end
23
+ end
@@ -0,0 +1,56 @@
1
+ require 'pact_broker/repositories'
2
+ require 'pact_broker/logging'
3
+ require 'pact_broker/domain/index_item'
4
+
5
+ module PactBroker
6
+
7
+ module Index
8
+ class Service
9
+
10
+ extend PactBroker::Repositories
11
+ extend PactBroker::Services
12
+ extend PactBroker::Logging
13
+
14
+ def self.find_index_items options = {}
15
+ pact_repository
16
+ .find_latest_pacts
17
+ .collect { | pact| build_index_item_rows(pact, tags_for(pact, options)) }
18
+ .flatten
19
+ end
20
+
21
+ def self.tags_for(pact, options)
22
+ if options[:tags] == true
23
+ tag_service.find_all_tag_names_for_pacticipant(pact.consumer_name)
24
+ elsif options[:tags].is_a?(Array)
25
+ options[:tags]
26
+ else
27
+ []
28
+ end
29
+ end
30
+
31
+ def self.build_index_item_rows(pact, tags)
32
+ index_items = [build_latest_pact_index_item(pact, tags)]
33
+ tags.each do | tag |
34
+ index_items << build_index_item_for_tagged_pact(pact, tag)
35
+ end
36
+ index_items.compact
37
+ end
38
+
39
+ def self.build_latest_pact_index_item pact, tags
40
+ latest_verification = verification_service.find_latest_verification_for(pact.consumer, pact.provider)
41
+ webhooks = webhook_service.find_by_consumer_and_provider pact.consumer, pact.provider
42
+ triggered_webhooks = webhook_service.find_latest_triggered_webhooks pact.consumer, pact.provider
43
+ tag_names = pact.consumer_version_tag_names.select{ |name| tags.include?(name) }
44
+ PactBroker::Domain::IndexItem.create pact.consumer, pact.provider, pact, true, latest_verification, webhooks, triggered_webhooks, tag_names
45
+ end
46
+
47
+ def self.build_index_item_for_tagged_pact latest_pact, tag
48
+ pact = pact_service.find_latest_pact consumer_name: latest_pact.consumer_name, provider_name: latest_pact.provider_name, tag: tag
49
+ return nil unless pact
50
+ return nil if pact.id == latest_pact.id
51
+ verification = verification_repository.find_latest_verification_for pact.consumer_name, pact.provider_name, tag
52
+ PactBroker::Domain::IndexItem.create pact.consumer, pact.provider, pact, false, verification, [], [], [tag]
53
+ end
54
+ end
55
+ end
56
+ end
@@ -1,7 +1,6 @@
1
1
  require 'pact_broker/repositories'
2
2
  require 'pact_broker/logging'
3
3
  require 'pact_broker/messages'
4
- require 'pact_broker/domain/relationship'
5
4
  require 'pact_broker/pacticipants/find_potential_duplicate_pacticipant_names'
6
5
 
7
6
  module PactBroker
@@ -58,17 +57,6 @@ module PactBroker
58
57
  end
59
58
  end
60
59
 
61
- # This needs to move into a new service
62
- def self.find_relationships
63
- pact_repository.find_latest_pacts
64
- .collect do | pact|
65
- latest_verification = verification_service.find_latest_verification_for(pact.consumer, pact.provider)
66
- webhooks = webhook_service.find_by_consumer_and_provider pact.consumer, pact.provider
67
- triggered_webhooks = webhook_service.find_latest_triggered_webhooks pact.consumer, pact.provider
68
- PactBroker::Domain::Relationship.create pact.consumer, pact.provider, pact, latest_verification, webhooks, triggered_webhooks
69
- end
70
- end
71
-
72
60
  def self.update params
73
61
  pacticipant = pacticipant_repository.find_by_name(params.fetch('name'))
74
62
  PactBroker::Api::Decorators::PacticipantDecorator.new(pacticipant).from_hash(params)
@@ -22,6 +22,10 @@ module PactBroker
22
22
  self.revision_number ||= 1
23
23
  end
24
24
 
25
+ def latest_tag_names
26
+ LatestTaggedPactPublications.where(id: id).select(:tag_name).collect{|t| t[:tag_name]}
27
+ end
28
+
25
29
  def to_domain
26
30
  PactBroker::Domain::Pact.new(
27
31
  id: id,
@@ -86,7 +86,7 @@ module PactBroker
86
86
  end
87
87
 
88
88
  def find_latest_pacts
89
- LatestPactPublications.order(:consumer_name, :provider_name).collect(&:to_domain_without_tags)
89
+ LatestPactPublications.order(:consumer_name, :provider_name).collect(&:to_domain)
90
90
  end
91
91
 
92
92
  def find_latest_pact(consumer_name, provider_name, tag = nil)
@@ -1,7 +1,7 @@
1
1
  require 'pact_broker/domain/group'
2
2
 
3
3
  =begin
4
- Splits all relationships up into groups of non-connecting relationships.
4
+ Splits all index_items up into groups of non-connecting index_items.
5
5
  =end
6
6
 
7
7
  module PactBroker
@@ -10,21 +10,21 @@ module PactBroker
10
10
 
11
11
  class Groupify
12
12
 
13
- def self.call relationships
14
- recurse_groups([], relationships.dup).collect { |group| Domain::Group.new(group) }
13
+ def self.call index_items
14
+ recurse_groups([], index_items.dup).collect { |group| Domain::Group.new(group) }
15
15
  end
16
16
 
17
- def self.recurse_groups groups, relationship_pool
18
- if relationship_pool.empty?
17
+ def self.recurse_groups groups, index_item_pool
18
+ if index_item_pool.empty?
19
19
  groups
20
20
  else
21
- first, *rest = relationship_pool
21
+ first, *rest = index_item_pool
22
22
  group = [first]
23
23
  new_connections = true
24
24
  while new_connections
25
25
  new_connections = false
26
26
  group = rest.inject(group) do |connected, candidate|
27
- if connected.select { |relationship| relationship.connected?(candidate) }.any?
27
+ if connected.select { |index_item| index_item.connected?(candidate) }.any?
28
28
  new_connections = true
29
29
  connected + [candidate]
30
30
  else
@@ -36,7 +36,7 @@ module PactBroker
36
36
  group.uniq
37
37
  end
38
38
 
39
- recurse_groups(groups + [group], relationship_pool - group)
39
+ recurse_groups(groups + [group], index_item_pool - group)
40
40
  end
41
41
  end
42
42
  end
@@ -1,6 +1,11 @@
1
1
  module PactBroker
2
2
  module Services
3
3
 
4
+ def index_service
5
+ require 'pact_broker/index/service'
6
+ Index::Service
7
+ end
8
+
4
9
  def pact_service
5
10
  # TODO work out how to fix circular dependency
6
11
  require 'pact_broker/pacts/service'
@@ -15,7 +15,7 @@ module PactBroker
15
15
  def find args
16
16
  PactBroker::Domain::Tag
17
17
  .select_all_qualified
18
- .join(:versions, {id: :version_id})
18
+ .join(:versions, { id: :version_id })
19
19
  .join(:pacticipants, {Sequel.qualify("pacticipants", "id") => Sequel.qualify("versions", "pacticipant_id")})
20
20
  .where(name_like(Sequel.qualify("tags", "name"), args.fetch(:tag_name)))
21
21
  .where(name_like(Sequel.qualify("versions", "number"), args.fetch(:pacticipant_version_number)))
@@ -26,6 +26,16 @@ module PactBroker
26
26
  def delete_by_version_id version_id
27
27
  Sequel::Model.db[:tags].where(version_id: version_id).delete
28
28
  end
29
+
30
+ def find_all_tag_names_for_pacticipant pacticipant_name
31
+ PactBroker::Domain::Tag
32
+ .select(Sequel[:tags][:name])
33
+ .join(:versions, { Sequel[:versions][:id] => Sequel[:tags][:version_id] })
34
+ .join(:pacticipants, { Sequel[:pacticipants][:id] => Sequel[:versions][:pacticipant_id] })
35
+ .where(Sequel[:pacticipants][:name] => pacticipant_name)
36
+ .distinct
37
+ .collect{ |tag| tag[:name] }.sort
38
+ end
29
39
  end
30
40
  end
31
41
  end
@@ -25,7 +25,9 @@ module PactBroker
25
25
  connection.run("delete from tags where name = '#{args.fetch(:tag_name)}' and version_id = '#{version.id}'")
26
26
  end
27
27
 
28
+ def find_all_tag_names_for_pacticipant pacticipant_name
29
+ tag_repository.find_all_tag_names_for_pacticipant pacticipant_name
30
+ end
28
31
  end
29
32
  end
30
-
31
33
  end
@@ -1,4 +1,4 @@
1
- require 'pact_broker/ui/controllers/relationships'
1
+ require 'pact_broker/ui/controllers/index'
2
2
  require 'pact_broker/ui/controllers/groups'
3
3
  require 'pact_broker/ui/controllers/matrix'
4
4
  require 'pact_broker/doc/controllers/app'
@@ -11,7 +11,7 @@ module PactBroker
11
11
  @app = ::Rack::Builder.new {
12
12
 
13
13
  map "/ui/relationships" do
14
- run PactBroker::UI::Controllers::Relationships
14
+ run PactBroker::UI::Controllers::Index
15
15
  end
16
16
 
17
17
  map "/groups" do
@@ -27,7 +27,7 @@ module PactBroker
27
27
  end
28
28
 
29
29
  map "/" do
30
- run PactBroker::UI::Controllers::Relationships
30
+ run PactBroker::UI::Controllers::Index
31
31
  end
32
32
  }
33
33
  end
@@ -18,7 +18,7 @@ module PactBroker
18
18
  end
19
19
 
20
20
  get "/" do
21
- view_model = ViewDomain::Relationships.new(pacticipant_service.find_relationships)
21
+ view_model = ViewDomain::IndexItems.new(pacticipant_service.find_index_items)
22
22
  haml 'clusters/show', locals: {relationships: view_model}
23
23
  end
24
24
 
@@ -1,5 +1,5 @@
1
1
  require 'pact_broker/ui/controllers/base_controller'
2
- require 'pact_broker/ui/view_models/relationships'
2
+ require 'pact_broker/ui/view_models/index_items'
3
3
  require 'haml'
4
4
 
5
5
  module PactBroker