lacerda 0.7.0 → 0.8.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.
- checksums.yaml +4 -4
- data/CHANGELOG.markdown +4 -0
- data/lib/lacerda/infrastructure.rb +19 -5
- data/lib/lacerda/publish_contract.rb +5 -2
- data/lib/lacerda/reporter.rb +40 -0
- data/lib/lacerda/reporters/multi.rb +34 -0
- data/lib/lacerda/reporters/rspec.rb +6 -0
- data/lib/lacerda/reporters/stdout.rb +45 -0
- data/lib/lacerda/service.rb +8 -11
- data/lib/lacerda/version.rb +1 -1
- data/lib/lacerda.rb +17 -6
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 732b9947f1b14ae426fb81521f97c71db31787a8
|
4
|
+
data.tar.gz: 568fccf33cecefd14d595e616d9fa5cd8cc165d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4da97e585d8d88580e630c8eaeaba6ffb83f5cf47da8771c340e045049f5394a02360769171cb7ed6ff19217e255fb80136bf37fe15c9673cfefa9d5750b5e59
|
7
|
+
data.tar.gz: 2f91d653697e862dc113d8c0ab1ab9da8b1e7e81d4c2b5a0b298e99cf2d1c24043395647b55a489ae33797265320e24ceebf368c515f7da77bfd144e86323a5e
|
data/CHANGELOG.markdown
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'active_support/core_ext/hash/indifferent_access'
|
2
|
+
require 'active_support/core_ext/object/try'
|
2
3
|
|
3
4
|
module Lacerda
|
4
5
|
class Infrastructure
|
@@ -15,24 +16,35 @@ module Lacerda
|
|
15
16
|
@services = nil
|
16
17
|
end
|
17
18
|
|
18
|
-
def contracts_fulfilled?
|
19
|
+
def contracts_fulfilled?(reporter = nil)
|
20
|
+
reporter = Lacerda.validate_reporter(reporter)
|
21
|
+
|
19
22
|
@mutex1.synchronize do
|
20
23
|
@errors = {}
|
21
24
|
|
22
25
|
# Check for incompatibility in published objects
|
26
|
+
reporter.try(:check_publishing)
|
23
27
|
publishers.each do |publisher|
|
24
|
-
|
28
|
+
reporter.try(:check_publisher, publisher)
|
29
|
+
publisher.satisfies_consumers?(verbose: @verbose, reporter: reporter)
|
25
30
|
next if publisher.errors.empty?
|
26
31
|
@errors.merge! publisher.errors
|
27
32
|
end
|
28
33
|
|
29
34
|
# Check for missing publishers
|
35
|
+
reporter.try(:check_consuming)
|
30
36
|
missing_publishers = {}
|
31
37
|
consumers.each do |consumer|
|
38
|
+
reporter.try(:check_consumer, consumer)
|
32
39
|
consumer.consumed_objects.each do |object|
|
33
|
-
|
34
|
-
|
35
|
-
|
40
|
+
if object.publisher
|
41
|
+
reporter.try(:object_publisher_existing, object, true)
|
42
|
+
next
|
43
|
+
else
|
44
|
+
reporter.try(:object_publisher_existing, object, false)
|
45
|
+
missing_publishers[object.publisher_name.camelize] ||= []
|
46
|
+
missing_publishers[object.publisher_name.camelize] << consumer.name.camelize
|
47
|
+
end
|
36
48
|
end
|
37
49
|
end
|
38
50
|
|
@@ -45,6 +57,8 @@ module Lacerda
|
|
45
57
|
errors["Missing publishers: "] = missing
|
46
58
|
end
|
47
59
|
|
60
|
+
reporter.try(:result, @errors)
|
61
|
+
|
48
62
|
@errors.empty?
|
49
63
|
end
|
50
64
|
end
|
@@ -8,9 +8,12 @@ module Lacerda
|
|
8
8
|
@comparator.errors
|
9
9
|
end
|
10
10
|
|
11
|
-
def satisfies?(consumer)
|
11
|
+
def satisfies?(consumer, reporter = nil)
|
12
|
+
Lacerda.validate_reporter(reporter)
|
12
13
|
@comparator = Compare::JsonSchema.new(@schema)
|
13
|
-
@comparator.contains?(consumer.consume.scoped_schema(service), consumer.name)
|
14
|
+
result = @comparator.contains?(consumer.consume.scoped_schema(service), consumer.name)
|
15
|
+
reporter.try(:consume_specification_satisfied, consumer, result)
|
16
|
+
result
|
14
17
|
end
|
15
18
|
|
16
19
|
def object(name)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# This is so you can write your own reporters
|
2
|
+
module Lacerda
|
3
|
+
class Reporter
|
4
|
+
def initialize(options = {})
|
5
|
+
end
|
6
|
+
|
7
|
+
def check_publishing
|
8
|
+
# Called before all publishers are iterated to check if they satisfy
|
9
|
+
# their consumers.
|
10
|
+
end
|
11
|
+
|
12
|
+
def check_publisher(publishing_service)
|
13
|
+
# Called before one single publisher is checked against its consumers
|
14
|
+
end
|
15
|
+
|
16
|
+
def object_publish_specification_valid(consumed_object, is_valid)
|
17
|
+
# Called after a consumed object's specification has been checked against
|
18
|
+
# the publisher's specification of that object.
|
19
|
+
end
|
20
|
+
|
21
|
+
def check_consuming
|
22
|
+
# Called before all consumers' consumed objects are iterated to make
|
23
|
+
# sure they have a publisher that meets their specification.
|
24
|
+
end
|
25
|
+
|
26
|
+
def check_consumer(consuming_service)
|
27
|
+
# Called before all consumed objects are iterated
|
28
|
+
end
|
29
|
+
|
30
|
+
def object_publisher_existing(consumed_object, is_published)
|
31
|
+
# Called after a consumed object was inspected (does a publish specification
|
32
|
+
# for this object exist?)
|
33
|
+
end
|
34
|
+
|
35
|
+
def result(errors)
|
36
|
+
# Called when everything is done with an array of errors. If that array
|
37
|
+
# is empty, go ahead and assume all specifications are valid
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'lacerda/reporter'
|
2
|
+
|
3
|
+
module Lacerda
|
4
|
+
module Reporters
|
5
|
+
class Multi < Lacerda::Reporter
|
6
|
+
def initialize(*reporters)
|
7
|
+
@reporters = []
|
8
|
+
[reporters].flatten.each do |r|
|
9
|
+
@reporters << Lacerda.validate_reporter(r)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
methods = Lacerda::Reporter.instance_methods - Object.instance_methods
|
14
|
+
methods.each do |method|
|
15
|
+
define_method method do |*args|
|
16
|
+
send_args = [method, args].flatten
|
17
|
+
@reporters.each do |r|
|
18
|
+
r.send(*send_args)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
#methods = Lacerda::Reporter.instance_methods - Object.instance_methods
|
27
|
+
#methods.each do |method|
|
28
|
+
# Lacerda::Reporters::Multi.send(:define_method, method) do |*args|
|
29
|
+
# send_args = [method, args].flatten.compact
|
30
|
+
# @reporters.each do |r|
|
31
|
+
# r.send(*[method, args].flatten)
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
#end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
module Lacerda
|
3
|
+
module Reporters
|
4
|
+
class Stdout < Lacerda::Reporter
|
5
|
+
def initialize(options = {})
|
6
|
+
@verbose = options.fetch(:verbose, true)
|
7
|
+
@io = options.fetch(:output, $stdout)
|
8
|
+
end
|
9
|
+
|
10
|
+
def check_publishing
|
11
|
+
end
|
12
|
+
|
13
|
+
def check_publisher(publisher)
|
14
|
+
@io.print "\n#{publisher.name.camelize} satisfies: " if @verbose
|
15
|
+
end
|
16
|
+
|
17
|
+
def consume_specification_satisfied(consumer, is_valid)
|
18
|
+
if is_valid
|
19
|
+
@io.print "#{consumer.name.camelize.green} " if @verbose
|
20
|
+
else
|
21
|
+
@io.print "#{consumer.name.camelize.red} " if @verbose
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def check_consuming
|
26
|
+
@io.print "\n" if @verbose
|
27
|
+
end
|
28
|
+
|
29
|
+
def check_consumer(consuming_service)
|
30
|
+
end
|
31
|
+
|
32
|
+
def object_publisher_existing(consumed_object, is_published)
|
33
|
+
end
|
34
|
+
|
35
|
+
def result(errors)
|
36
|
+
if errors.blank?
|
37
|
+
@io.puts "All contracts valid 🙌".green if @verbose
|
38
|
+
else
|
39
|
+
@io.puts JSON.pretty_generate(errors)
|
40
|
+
@io.puts "#{errors.length} contract violations".red
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/lacerda/service.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'active_support/core_ext/string'
|
2
|
+
require 'active_support/core_ext/object/try'
|
2
3
|
require 'blumquist'
|
3
4
|
require 'lacerda/service/error'
|
4
5
|
|
@@ -35,24 +36,20 @@ module Lacerda
|
|
35
36
|
@publish.objects
|
36
37
|
end
|
37
38
|
|
38
|
-
def satisfies?(service)
|
39
|
-
|
39
|
+
def satisfies?(service, reporter = nil)
|
40
|
+
Lacerda.validate_reporter(reporter)
|
41
|
+
@publish.satisfies?(service, reporter)
|
40
42
|
end
|
41
43
|
|
42
44
|
def satisfies_consumers?(options = {})
|
43
|
-
|
45
|
+
reporter = Lacerda.validate_reporter(options.fetch(:reporter, nil))
|
46
|
+
|
44
47
|
@errors = {}
|
45
|
-
print "#{name.camelize} satisfies: " if verbose
|
46
48
|
consumers.each do |consumer|
|
47
|
-
@publish.satisfies?(consumer)
|
48
|
-
if @publish.errors.empty?
|
49
|
-
print "#{consumer.name.camelize.green} "if verbose
|
50
|
-
next
|
51
|
-
end
|
52
|
-
print "#{consumer.name.camelize.red} "if verbose
|
49
|
+
@publish.satisfies?(consumer, reporter)
|
50
|
+
next if @publish.errors.empty?
|
53
51
|
@errors["#{name} -> #{consumer.name}"] = @publish.errors
|
54
52
|
end
|
55
|
-
print "\n" if verbose
|
56
53
|
@errors.empty?
|
57
54
|
end
|
58
55
|
|
data/lib/lacerda/version.rb
CHANGED
data/lib/lacerda.rb
CHANGED
@@ -1,13 +1,24 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
1
|
+
require 'lacerda/conversion'
|
2
|
+
require 'lacerda/publish_contract'
|
3
|
+
require 'lacerda/consume_contract'
|
4
|
+
require 'lacerda/service'
|
5
|
+
require 'lacerda/infrastructure'
|
6
|
+
require 'lacerda/compare/json_schema'
|
7
|
+
require 'lacerda/reporter'
|
8
|
+
require 'lacerda/reporters/multi'
|
9
|
+
require 'lacerda/reporters/rspec'
|
10
|
+
require 'lacerda/reporters/stdout'
|
7
11
|
|
8
12
|
module Lacerda
|
9
13
|
SCOPE_SEPARATOR = '::'
|
10
14
|
|
15
|
+
def self.validate_reporter(reporter)
|
16
|
+
return Lacerda::Reporters::MultiReporter.new(reporter) if reporter.is_a?(Array)
|
17
|
+
return reporter unless reporter
|
18
|
+
return reporter if reporter.class <= Lacerda::Reporter
|
19
|
+
raise "reporter must inherit from Lacerda::Reporter, but #{reporter.class.name} doesn't"
|
20
|
+
end
|
21
|
+
|
11
22
|
# An underscore that doesn't turn :: into /
|
12
23
|
def self.underscore(string)
|
13
24
|
string.gsub(/#{SCOPE_SEPARATOR}/, ':')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lacerda
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jannis Hermanns
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -224,6 +224,10 @@ files:
|
|
224
224
|
- lib/lacerda/object_description.rb
|
225
225
|
- lib/lacerda/publish_contract.rb
|
226
226
|
- lib/lacerda/published_object.rb
|
227
|
+
- lib/lacerda/reporter.rb
|
228
|
+
- lib/lacerda/reporters/multi.rb
|
229
|
+
- lib/lacerda/reporters/rspec.rb
|
230
|
+
- lib/lacerda/reporters/stdout.rb
|
227
231
|
- lib/lacerda/service.rb
|
228
232
|
- lib/lacerda/service/error.rb
|
229
233
|
- lib/lacerda/tasks.rb
|