jekyll-archimate 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8cca198efae7d2a8b22e7df60440fcd68c8617e9
4
- data.tar.gz: 45684df63ae3ce763c510dc98cdf9a15b7419e93
3
+ metadata.gz: 1390d11ccf52bae0ba50f6f22bd1dec103f2465e
4
+ data.tar.gz: 792d680dea4b6dbb6a95f91276d14d7df09ee373
5
5
  SHA512:
6
- metadata.gz: 651b1932c684728d99b26bdf178fea1ea3e8931e8701679e60b014569618e92875a6b406fa243b97af16177ec7d390c79b643a59b7dbecf1959bc688eb0173fe
7
- data.tar.gz: d4e1d9e6d95e6c6e34182fb928634cb0decac62abe96eaf577fbf235dcdc0fe1f53aee100479401af644b0ae91ed74ceb5c88584440c6834bf26b39fe5c0b2d9
6
+ metadata.gz: aa6f9b4030f007efb4ca456029abb00721af40180c67ea6ca96ebc81814ec10115c7c8261e8cd4cef66601ae2ae509d9aa46f608c175ed34f2f5378774171df4
7
+ data.tar.gz: 0730d88c6bd3b3067b1d797cb913a19dc8cecab7307ba9695a06b79ed66b02ad05f76ef423084e314a1826c7822fa3f62cf6f7f11d14867651dca99ecf453960
@@ -3,5 +3,6 @@ require "jekyll"
3
3
  require "jekyll/archimate/version"
4
4
  require "jekyll/archimate/archimate_cache"
5
5
  require "jekyll/archimate/archimate_diagram_tag"
6
- require "jekyll/archimate/element_catalog_tag"
6
+ require "jekyll/archimate/catalog_tag"
7
+ require "jekyll/archimate/matrix_tag"
7
8
  require "jekyll/archimate/archimate_hook"
@@ -6,15 +6,17 @@ module Jekyll
6
6
  module Archimate
7
7
  # Removes all keys that have null or empty values
8
8
  def self.hash_purge(hash)
9
- hash.delete_if { |_, value| !value || value.empty? }
9
+ hash.delete_if { |_, value| !value || (value.is_a?(String) && value.empty?) }
10
10
  end
11
11
 
12
12
  # Base class for ArchiMate Entities: Model, Diagram, Element, Relationship
13
13
  class EntityBase
14
14
  attr_reader :entity
15
+ attr_reader :model
15
16
 
16
- def initialize(entity)
17
+ def initialize(entity, model: nil)
17
18
  @entity = entity
19
+ @model = model
18
20
  end
19
21
 
20
22
  def to_h
@@ -25,7 +27,7 @@ module Jekyll
25
27
  {
26
28
  id: entity.id,
27
29
  name: entity.name,
28
- documentation: entity.documentation.map(&:to_h),
30
+ documentation: entity.documentation&.to_h,
29
31
  properties: entity.properties.map(&:to_h)
30
32
  }
31
33
  end
@@ -46,8 +48,8 @@ module Jekyll
46
48
  super.merge(
47
49
  type: "Element",
48
50
  element_type: entity.type,
49
- relationships: entity.relationships.map(&:id),
50
- views: entity.diagrams.map(&:id)
51
+ relationships: model.relationships.select { |rel| rel.source&.id == entity.id || rel.target&.id == entity.id }.map(&:id),
52
+ views: model.diagrams.select { |dia| dia.element_ids.include?(entity.id) }.map(&:id)
51
53
  )
52
54
  end
53
55
  end
@@ -58,9 +60,9 @@ module Jekyll
58
60
  super.merge(
59
61
  type: "Relationship",
60
62
  relationship_type: entity.type,
61
- source: entity.source,
62
- target: entity.target,
63
- views: entity.diagrams.map(&:id)
63
+ source: entity.source&.id,
64
+ target: entity.target&.id,
65
+ views: model.diagrams.select { |dia| dia.relationship_ids.include?(entity.id) }.map(&:id)
64
66
  )
65
67
  end
66
68
  end
@@ -96,7 +98,7 @@ module Jekyll
96
98
  def to_h
97
99
  Archimate.hash_purge(
98
100
  id: folder.id,
99
- name: folder.name,
101
+ name: folder.name.to_s,
100
102
  folders: folder.organizations.map { |child| Folder.new(child).to_h },
101
103
  diagrams: items
102
104
  )
@@ -119,11 +121,11 @@ module Jekyll
119
121
  end
120
122
 
121
123
  def elements
122
- model.elements.map { |element| ElementEntity.new(element).to_h }
124
+ model.elements.map { |element| ElementEntity.new(element, model: model).to_h }
123
125
  end
124
126
 
125
127
  def relationships
126
- model.relationships.map { |relationship| RelationshipEntity.new(relationship).to_h }
128
+ model.relationships.map { |relationship| RelationshipEntity.new(relationship, model: model).to_h }
127
129
  end
128
130
 
129
131
  def diagrams
@@ -182,6 +184,7 @@ module Jekyll
182
184
  @archimate_file = archimate_file
183
185
  @clean_generated_dirs = @site.config.fetch('clean', false)
184
186
  @model = ArchimateCache.load_model(archimate_file.sub(site.source, ""))
187
+ @site.data["archimate_model"] = @model
185
188
  end
186
189
 
187
190
  def generate
@@ -240,7 +243,7 @@ module Jekyll
240
243
  {
241
244
  "id" => el.id,
242
245
  "name" => el.name.to_s,
243
- "documentation" => el.documentation.first.to_s,
246
+ "documentation" => el.documentation&.to_s,
244
247
  "type" => el.type,
245
248
  "properties" => el.properties.each_with_object({}) do |property, hash|
246
249
  hash[property.key.to_s] = property.value.to_s
@@ -251,7 +254,7 @@ module Jekyll
251
254
  end
252
255
  end
253
256
 
254
- Jekyll::Hooks.register :site, :after_init do |site|
257
+ Jekyll::Hooks.register :site, :pre_render do |site|
255
258
  Jekyll.logger.info "ArchiMate Generator..."
256
259
  Dir.glob("#{site.source}/**/*.archimate").each do |archimate_file|
257
260
  unless archimate_file.start_with?(site.dest) || archimate_file.sub(site.source, "").start_with?("/_")
@@ -4,7 +4,7 @@ module Jekyll
4
4
  #
5
5
  # {% element_catalog type:"Principle" | caption:"Principles Catalog" %}
6
6
  #
7
- class ElementCatalogTag < Liquid::Tag
7
+ class CatalogTag < Liquid::Tag
8
8
  attr_reader :context
9
9
  attr_reader :caption
10
10
  attr_reader :element_types
@@ -95,5 +95,5 @@ module Jekyll
95
95
  end
96
96
  end
97
97
 
98
- Liquid::Template.register_tag("element_catalog", Jekyll::Archimate::ElementCatalogTag)
98
+ Liquid::Template.register_tag("catalog", Jekyll::Archimate::CatalogTag)
99
99
 
@@ -0,0 +1,148 @@
1
+ module Jekyll
2
+ module Archimate
3
+ # Insert a diagram from the ArchiMate model.
4
+ #
5
+ # {% matrix type:"Principle" | caption:"Principles Catalog" %}
6
+ # {% matrix source:"ApplicationComponent" | target:"ApplicationComponent" | }
7
+ #
8
+ class MatrixTag < Liquid::Tag
9
+ attr_reader :context
10
+ attr_reader :caption
11
+ attr_reader :element_types
12
+ attr_reader :markup
13
+
14
+
15
+ def initialize(tag_name, markup, tokens)
16
+ @markup = markup
17
+ @context = nil
18
+ @caption = nil
19
+ @element_types = []
20
+ super
21
+ end
22
+
23
+ def render(context)
24
+ @context = context
25
+ scan_attributes(context)
26
+ application_interaction
27
+ render_table
28
+ end
29
+
30
+ # Here I want all of the Serving relationships between 2 app components
31
+ # included or derived.
32
+ #
33
+ # attrs:
34
+ # source_selector: Element selector for source elements
35
+ # target_selector: Element selector for target elements
36
+ # relationship_selector
37
+ def application_interaction
38
+ model = site.data["archimate_model"]
39
+ derived_relations_engine = ::Archimate::DerivedRelations.new(model)
40
+
41
+ concrete_rels = model.relationships.select { |rel|
42
+ rel.type == "ServingRelationship" &&
43
+ rel.source.type == "ApplicationComponent" &&
44
+ rel.target.type == "ApplicationComponent"
45
+ }
46
+
47
+ derived_rels = derived_relations_engine.derived_relations(
48
+ model.elements.select { |el| el.type == "ApplicationComponent" },
49
+ lambda { |rel| rel.weight >= ::Archimate::DataModel::Serving::WEIGHT },
50
+ lambda { |el| el.type == "ApplicationComponent" },
51
+ lambda { |el| el.type == "ApplicationComponent" }
52
+ )
53
+
54
+ @all_rels = [concrete_rels, derived_rels].flatten
55
+
56
+ @callers = @all_rels.map(&:source).uniq.sort { |a, b| a.name.to_s <=> b.name.to_s }
57
+ @callees = @all_rels.map(&:target).uniq.sort { |a, b| a.name.to_s <=> b.name.to_s }
58
+ end
59
+
60
+ def matrix_data
61
+ model = site.data["archimate_model"]
62
+ derived_relations_engine = ::Archimate::DerivedRelations.new(model)
63
+
64
+ end
65
+
66
+ def render_table
67
+ <<~END
68
+ <table class="table table-condensed table-hover table-striped">
69
+ <caption>#{caption}</caption>
70
+ <thead>
71
+ <tr>
72
+ <th>&nbsp;</th>
73
+ <th class="success" scope="col" colspan="#{@callers.size}">Callers</th>
74
+ </tr>
75
+ <tr>
76
+ <th class="info" scope="col">Callees</th>
77
+ #{@callers.map { |ac| "<th class=\"success\" scope=\"col\" style=\"text-transform: capitalize\">#{ac.name}</th>" }.join("\n")}
78
+ </tr>
79
+ </thead>
80
+ <tbody>
81
+ #{render_rows.strip}
82
+ </tbody>
83
+ </table>
84
+ END
85
+ end
86
+
87
+ def render_rows
88
+ return "<tr><td>No Items</td></tr>" if @callees.empty?
89
+ @callees.map do |callee|
90
+ <<~END
91
+ <tr>
92
+ <th class="info" scope="row">#{callee.name}</th>
93
+ #{@callers.map { |caller| cell_content(caller, callee) }.join("")}
94
+ </tr>
95
+ END
96
+ end.join("")
97
+ end
98
+
99
+ def cell_content(caller, callee)
100
+ rels = @all_rels.select { |rel| rel.source == caller && rel.target == callee }
101
+ if rels.empty?
102
+ "<td></td>"
103
+ else
104
+ derived = rels.all? { |rel| rel.derived }
105
+ span_class = derived ? "text-danger" : "text-primary"
106
+ tooltip = "#{caller.name} &rarr; #{}#{callee.name} #{"(derived)" if derived}"
107
+ cell = <<~END
108
+ <td>
109
+ <a href="#" data-toggle="tooltip" data-placement="top" title="#{tooltip}">
110
+ <span class="#{span_class}">&crarr; calls</span>
111
+ </a>
112
+ </td>
113
+ END
114
+ end
115
+ end
116
+
117
+ def scan_attributes(context)
118
+ @converter = converter(context)
119
+
120
+ # Render any liquid variables
121
+ markup = Liquid::Template.parse(@markup).render(context)
122
+
123
+ # Extract tag attributes
124
+ attributes = {}
125
+ markup.scan(Liquid::TagAttributes) do |key, value|
126
+ attributes[key] = value
127
+ end
128
+ @caption = attributes['caption']&.gsub!(/\A"|"\Z/, '')
129
+ element_type = attributes['type']
130
+ element_type = element_type.gsub!(/\A"|"\Z/, '') if element_type
131
+ @element_types = element_type.split(",").map(&:strip)
132
+ end
133
+
134
+ def converter(context)
135
+ # Gather settings
136
+ site = context.registers[:site]
137
+ site.find_converter_instance(::Jekyll::Converters::Markdown)
138
+ end
139
+
140
+ def site
141
+ @site ||= context.registers[:site]
142
+ end
143
+ end
144
+ end
145
+ end
146
+
147
+ Liquid::Template.register_tag("matrix", Jekyll::Archimate::MatrixTag)
148
+
@@ -1,5 +1,5 @@
1
1
  module Jekyll
2
2
  module Archimate
3
- VERSION = "0.2.0"
3
+ VERSION = "0.2.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-archimate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Morga
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-10-19 00:00:00.000000000 Z
11
+ date: 2017-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -101,7 +101,8 @@ files:
101
101
  - lib/jekyll/archimate/archimate_cache.rb
102
102
  - lib/jekyll/archimate/archimate_diagram_tag.rb
103
103
  - lib/jekyll/archimate/archimate_hook.rb
104
- - lib/jekyll/archimate/element_catalog_tag.rb
104
+ - lib/jekyll/archimate/catalog_tag.rb
105
+ - lib/jekyll/archimate/matrix_tag.rb
105
106
  - lib/jekyll/archimate/version.rb
106
107
  homepage: https://github.com/mmorga/jekyll-archimate
107
108
  licenses: []