pact_broker 2.9.0 → 2.10.0

Sign up to get free protection for your applications and to get access to all the features.
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