blueprint-api-rails 0.2.6 → 0.2.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 785506963749b0ec9c534c6ae2a2f29b43d51531
4
- data.tar.gz: 692c18d746600e1f399d54d25422c00e6bcb18c7
3
+ metadata.gz: 8a9fe12b5d07a6b092fd9ac10f9556116e51fa27
4
+ data.tar.gz: 8d2d6f67c7b40f676cc344427a14f588db42ecdd
5
5
  SHA512:
6
- metadata.gz: dddbdc7efef2de303de2e3c8a84862d56e9c01044a89a640e336b9f7db88a638584ee3a2428eb8dccc8063d753463950cb4ba532aeba9db53c83e1990d89b8b8
7
- data.tar.gz: 1288df1666ab966e2316b523827cc970540abc5680b8477f2428791f9c38953cb07f49c3942e2543799d356b5c6f7b9b3c6239f9892a1c83ea806b8f565954a7
6
+ metadata.gz: 76515fe219c732211854347e732d3dd5bd96b59dfd4527f894b0e218c560953f218d32d439cde34150aae35c1d92c129d57211c60252154743c9bc4f68752342
7
+ data.tar.gz: da3b116b3d680f9538e794d2531d1ddccc19b9457d2615183c0b314e1d363251b4b0e73d8dbd3d381940c079a8e42655fbc4cf9b862d0476691276be07c6b99b
@@ -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
- # construct the base payload
52
- payload = {
53
- :header => {
54
- :structure_id => @structure_id,
55
- :properties => properties,
56
- :branch => {
57
- :name => @branch || 'master'
58
- },
59
- :eventType => event_type
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
- # merge (append) the properties hash onto the payload (properties vary per event type)
64
- payload.merge! message
65
+ # merge (append) the properties hash onto the payload (properties vary per event type)
66
+ payload.merge! message
65
67
 
66
- @conn.post do |req|
67
- req.url BLUEPRINT_URL_CONTEXT
68
- req.headers['Content-Type'] = 'application/json'
69
- req.headers['X-Api-Key'] = @api_key
70
- req.body = payload.to_json
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 restricted to a certain structural element?
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 in #{source}."
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(message = { }, extras = { }, type = nil, source = nil, target = nil)
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 methods
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(message = { }, extras = { }, type = nil, source = nil, target = nil)
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 = { }, type = nil)
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
 
@@ -1,7 +1,7 @@
1
1
  module Blueprint
2
2
  module Api
3
3
  module Rails
4
- VERSION = '0.2.6'
4
+ VERSION = '0.2.7'
5
5
  end
6
6
  end
7
7
  end
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.6
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-20 00:00:00.000000000 Z
11
+ date: 2016-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler