blueprint-api-rails 0.2.6 → 0.2.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/blueprint/api/rails.rb +84 -29
- data/lib/blueprint/api/rails/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a9fe12b5d07a6b092fd9ac10f9556116e51fa27
|
4
|
+
data.tar.gz: 8d2d6f67c7b40f676cc344427a14f588db42ecdd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 76515fe219c732211854347e732d3dd5bd96b59dfd4527f894b0e218c560953f218d32d439cde34150aae35c1d92c129d57211c60252154743c9bc4f68752342
|
7
|
+
data.tar.gz: da3b116b3d680f9538e794d2531d1ddccc19b9457d2615183c0b314e1d363251b4b0e73d8dbd3d381940c079a8e42655fbc4cf9b862d0476691276be07c6b99b
|
data/lib/blueprint/api/rails.rb
CHANGED
@@ -9,7 +9,6 @@ module Blueprint
|
|
9
9
|
# TODO deprecate all of the branch stuff
|
10
10
|
# TODO limit messages that are lists to a maximum of 10 elements
|
11
11
|
# TODO add support for getting the current user (so we can analysis log messages per user)
|
12
|
-
# TODO only log messages to the Blueprint server if there is an API key (if there isn't we can still check rules locally)
|
13
12
|
|
14
13
|
STRUCTURE_NEW = 'start'
|
15
14
|
|
@@ -48,26 +47,30 @@ module Blueprint
|
|
48
47
|
# utility method for sending JSON payloads to the Anaxim servers - should never be called directly
|
49
48
|
def send(event_type, properties = { }, message = { })
|
50
49
|
|
51
|
-
#
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
50
|
+
# only send messages if we have an API key (even without one this gem can apply architectural verification rules)
|
51
|
+
unless @api_key.nil?
|
52
|
+
|
53
|
+
# construct the base payload
|
54
|
+
payload = {
|
55
|
+
:header => {
|
56
|
+
:structure_id => @structure_id,
|
57
|
+
:properties => properties,
|
58
|
+
:branch => {
|
59
|
+
:name => @branch || 'master'
|
60
|
+
},
|
61
|
+
:eventType => event_type
|
62
|
+
}
|
63
|
+
}
|
62
64
|
|
63
|
-
|
64
|
-
|
65
|
+
# merge (append) the properties hash onto the payload (properties vary per event type)
|
66
|
+
payload.merge! message
|
65
67
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
68
|
+
@conn.post do |req|
|
69
|
+
req.url BLUEPRINT_URL_CONTEXT
|
70
|
+
req.headers['Content-Type'] = 'application/json'
|
71
|
+
req.headers['X-Api-Key'] = @api_key
|
72
|
+
req.body = payload.to_json
|
73
|
+
end
|
71
74
|
end
|
72
75
|
|
73
76
|
self
|
@@ -93,23 +96,43 @@ module Blueprint
|
|
93
96
|
# the list of violations for this action
|
94
97
|
violations = [ ]
|
95
98
|
|
99
|
+
# if all parameters are present then we can check for link rules
|
100
|
+
if source.present? && target.present? && type.present?
|
101
|
+
# check to see if there is a link rule for this source / target pair
|
102
|
+
if RULES.has_key?(:links)
|
103
|
+
link_rule = RULES[:links].find { |l| l[:source] == source && l[:target] == target }
|
104
|
+
|
105
|
+
unless link_rule.nil?
|
106
|
+
# there is a link rule - check that the type is allowed over the link
|
107
|
+
unless link_rule[:allowed] == type
|
108
|
+
violations << "The type #{type} is not allowed over the link #{source} -> #{target}."
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
96
114
|
unless type.nil?
|
97
|
-
# is the type
|
115
|
+
# is the type allowed?
|
116
|
+
if RULES.has_key?(:allowed)
|
117
|
+
unless RULES[:allowed].map { |t| t[:name] }.include?(type)
|
118
|
+
violations << "The type #{type} is not registered as being allowed."
|
119
|
+
end
|
120
|
+
end
|
98
121
|
|
122
|
+
# is the type restricted to a certain structural element?
|
99
123
|
unless RULES[type].nil? # are there any rules for this type?
|
100
124
|
|
101
125
|
if RULES[type].has_key?(:only) # do the rules for this type include an 'only' restriction?
|
102
126
|
allowed_element = RULES[type][:only]
|
103
127
|
|
104
128
|
unless allowed_element.eql?(source)
|
105
|
-
violations << "The type #{type} is allowed only within #{allowed_element} and it was used
|
129
|
+
violations << "The type #{type} is allowed only within #{allowed_element} and it was used within #{source}."
|
106
130
|
end
|
107
131
|
end
|
108
132
|
end
|
109
133
|
end
|
110
134
|
|
111
135
|
# output architectural violations
|
112
|
-
# TODO make this output more obvious (and configurable?)
|
113
136
|
unless violations.empty?
|
114
137
|
p '### Architectural violations found ###'
|
115
138
|
violations.each { |v|
|
@@ -139,8 +162,6 @@ module Blueprint
|
|
139
162
|
end
|
140
163
|
|
141
164
|
# performs an extract (that is, scans the code base for architectural elements)
|
142
|
-
# TODO this scan can be arbitrarily complex - we could scan for anything
|
143
|
-
# TODO add support of passing in custom scanners
|
144
165
|
def scan(repository_type)
|
145
166
|
repo_url = nil
|
146
167
|
|
@@ -175,7 +196,6 @@ module Blueprint
|
|
175
196
|
end
|
176
197
|
|
177
198
|
# now scan for models
|
178
|
-
# TODO support code URLs for models too
|
179
199
|
models = Dir[Rails.root.join('app/models/*.rb')].map { |path|
|
180
200
|
path.match(/(\w+).rb/); $1.titleize
|
181
201
|
}.compact
|
@@ -189,10 +209,12 @@ module Blueprint
|
|
189
209
|
p 'Scan complete'
|
190
210
|
end
|
191
211
|
|
212
|
+
# creates a design context for a structural element
|
192
213
|
def element(name, code_url = nil)
|
193
214
|
StructuralElementDesignContext.new(@api_key, @structure_id, name, code_url)
|
194
215
|
end
|
195
216
|
|
217
|
+
# creates a design context for a concept
|
196
218
|
def concept(name)
|
197
219
|
ConceptDesignContext.new(@api_key, @structure_id, name)
|
198
220
|
end
|
@@ -218,7 +240,7 @@ module Blueprint
|
|
218
240
|
end
|
219
241
|
|
220
242
|
# logs a message between two nodes in the structure
|
221
|
-
def log(
|
243
|
+
def log(source = nil, target = nil, type = nil, message = { }, extras = { })
|
222
244
|
# always check the logged message for architectural rules violations
|
223
245
|
check_rules(source, target, type)
|
224
246
|
|
@@ -373,7 +395,19 @@ module Blueprint
|
|
373
395
|
self
|
374
396
|
end
|
375
397
|
|
376
|
-
# verification
|
398
|
+
# methods to support AVL (architectural verification)
|
399
|
+
|
400
|
+
# marks a conceptual type as allowed within the archiecture
|
401
|
+
def allow
|
402
|
+
unless RULES.has_key?(:allowed)
|
403
|
+
RULES[:allowed] = [ ]
|
404
|
+
end
|
405
|
+
|
406
|
+
# add the type to the allowed list
|
407
|
+
RULES[:allowed] << { :name => @name }
|
408
|
+
end
|
409
|
+
|
410
|
+
# marks a conceptual type as allowed within (and only within) a structural elements
|
377
411
|
def only(element)
|
378
412
|
unless RULES.has_key?(@name)
|
379
413
|
RULES[@name] = { }
|
@@ -433,7 +467,7 @@ module Blueprint
|
|
433
467
|
end
|
434
468
|
|
435
469
|
|
436
|
-
def log(
|
470
|
+
def log(source = nil, target = nil, type = nil, message = { }, extras = { })
|
437
471
|
# always check the logged message for architectural rules violations
|
438
472
|
check_rules(source, target, type)
|
439
473
|
|
@@ -479,8 +513,29 @@ module Blueprint
|
|
479
513
|
end
|
480
514
|
end
|
481
515
|
|
516
|
+
def allow(concept)
|
517
|
+
unless RULES.has_key?(:links)
|
518
|
+
RULES[:links] = [ ]
|
519
|
+
end
|
520
|
+
|
521
|
+
# look for an existing rule
|
522
|
+
existing_rule = RULES[:links].find { |l| l[:source] == @source && l[:target] == @target }
|
523
|
+
|
524
|
+
if existing_rule.nil?
|
525
|
+
existing_rule = {
|
526
|
+
:source => @source,
|
527
|
+
:target => @target,
|
528
|
+
:allowed => concept,
|
529
|
+
}
|
530
|
+
|
531
|
+
RULES[:links] << existing_rule
|
532
|
+
else
|
533
|
+
existing_rule[:allowed] = concept
|
534
|
+
end
|
535
|
+
end
|
536
|
+
|
482
537
|
# logs a message between two nodes in the structure
|
483
|
-
def log(message = { }, extras = { }
|
538
|
+
def log(type = nil, message = { }, extras = { })
|
484
539
|
# always check the logged message for architectural rules violations
|
485
540
|
check_rules(@source, @target, type)
|
486
541
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blueprint-api-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- benjii
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|