metadata_presenter 1.3.0 → 1.6.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.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -0
  3. data/app/controllers/metadata_presenter/answers_controller.rb +4 -2
  4. data/app/controllers/metadata_presenter/change_answer_controller.rb +1 -1
  5. data/app/controllers/metadata_presenter/engine_controller.rb +12 -7
  6. data/app/models/metadata_presenter/component.rb +5 -1
  7. data/app/models/metadata_presenter/condition.rb +13 -0
  8. data/app/models/metadata_presenter/criteria.rb +25 -0
  9. data/app/models/metadata_presenter/evaluate_conditions.rb +29 -0
  10. data/app/models/metadata_presenter/file_uploader.rb +7 -1
  11. data/app/models/metadata_presenter/flow.rb +21 -0
  12. data/app/models/metadata_presenter/next_page.rb +53 -8
  13. data/app/models/metadata_presenter/page.rb +8 -0
  14. data/app/models/metadata_presenter/page_answers.rb +2 -0
  15. data/app/models/metadata_presenter/previous_page.rb +38 -0
  16. data/app/models/metadata_presenter/service.rb +12 -4
  17. data/app/models/metadata_presenter/traversed_pages.rb +40 -0
  18. data/app/operators/metadata_presenter/base_operator.rb +20 -0
  19. data/app/operators/metadata_presenter/is_answered_operator.rb +7 -0
  20. data/app/operators/metadata_presenter/is_not_answered_operator.rb +7 -0
  21. data/app/operators/metadata_presenter/is_not_operator.rb +11 -0
  22. data/app/operators/metadata_presenter/is_operator.rb +11 -0
  23. data/app/operators/metadata_presenter/operator.rb +29 -0
  24. data/config/initializers/inflections.rb +3 -0
  25. data/default_metadata/component/upload.json +1 -0
  26. data/fixtures/branching.json +883 -0
  27. data/lib/metadata_presenter/version.rb +1 -1
  28. data/lib/tasks/metadata_presenter_tasks.rake +90 -4
  29. metadata +30 -2
@@ -1,3 +1,3 @@
1
1
  module MetadataPresenter
2
- VERSION = '1.3.0'.freeze
2
+ VERSION = '1.6.0'.freeze
3
3
  end
@@ -1,4 +1,90 @@
1
- # desc "Explaining what the task does"
2
- # task :metadata_presenter do
3
- # # Task goes here
4
- # end
1
+ require 'metadata_presenter/test_helpers'
2
+
3
+ namespace :metadata do
4
+ include MetadataPresenter::TestHelpers
5
+
6
+ desc 'Represent the flow objects in human readable form'
7
+ task flow: :environment do
8
+ metadata = ENV['SERVICE_METADATA'] || metadata_fixture('branching')
9
+ service = MetadataPresenter::Service.new(metadata)
10
+
11
+ graph = MetadataPresenter::Graph.new(service)
12
+
13
+ graph.draw.generate_image
14
+ puts "Generated file #{graph.filename}"
15
+ system("open #{graph.filename}")
16
+ end
17
+ end
18
+
19
+ require 'ruby-graphviz'
20
+
21
+ module MetadataPresenter
22
+ class Graph
23
+ attr_reader :service, :filename, :nodes
24
+
25
+ delegate :metadata, :start_page, :find_page_by_uuid, :service_slug, to: :service
26
+
27
+ def initialize(service)
28
+ @service = service
29
+ @graphviz = GraphViz.new(:G, type: :digraph)
30
+ @filename = Rails.root.join('tmp', "#{service_slug}.png")
31
+ @nodes = {}
32
+ end
33
+
34
+ def draw
35
+ draw_nodes
36
+ draw_edges
37
+
38
+ self
39
+ end
40
+
41
+ def generate_image
42
+ @graphviz.output(png: filename)
43
+ end
44
+
45
+ private
46
+
47
+ def draw_nodes
48
+ flow.each do |id, _value|
49
+ flow_object = service.flow(id)
50
+
51
+ if flow_object.branch?
52
+ full_description = flow_object.conditions.map do |condition|
53
+ condition.criterias.map do |criteria|
54
+ criteria.service = service
55
+
56
+ "if #{criteria.criteria_component.humanised_title} #{criteria.operator} #{criteria.field_label}"
57
+ end
58
+ end
59
+ nodes[id] = @graphviz.add_nodes(full_description.flatten.join(' - '))
60
+ else
61
+ current_page = find_page_by_uuid(id)
62
+ nodes[id] = @graphviz.add_nodes(current_page.url)
63
+ end
64
+ end
65
+ end
66
+
67
+ def draw_edges
68
+ flow.each do |id, _value|
69
+ flow_object = service.flow(id)
70
+ current_node = nodes[id]
71
+ node_next = nodes[flow_object.default_next]
72
+
73
+ if flow_object.branch?
74
+ @graphviz.add_edges(current_node, node_next, label: 'Conditions are not met', labelfontsize: 8) if node_next
75
+
76
+ flow_object.group_by_page.each do |page_uuid, _conditions|
77
+ conditions_node = nodes[page_uuid]
78
+ @graphviz.add_edges(current_node, conditions_node, label: 'Conditions are met', labelfontsize: 8) if conditions_node
79
+ end
80
+ elsif node_next
81
+ @graphviz.add_edges(current_node, node_next)
82
+ end
83
+ end
84
+ end
85
+
86
+ def flow
87
+ metadata['flow']
88
+ end
89
+ end
90
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metadata_presenter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - MoJ Online
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-04 00:00:00.000000000 Z
11
+ date: 2021-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: govuk_design_system_formbuilder
@@ -128,6 +128,20 @@ dependencies:
128
128
  - - ">="
129
129
  - !ruby/object:Gem::Version
130
130
  version: '0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: ruby-graphviz
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
131
145
  - !ruby/object:Gem::Dependency
132
146
  name: rspec-rails
133
147
  requirement: !ruby/object:Gem::Requirement
@@ -263,8 +277,12 @@ files:
263
277
  - app/helpers/metadata_presenter/default_text.rb
264
278
  - app/jobs/metadata_presenter/application_job.rb
265
279
  - app/models/metadata_presenter/component.rb
280
+ - app/models/metadata_presenter/condition.rb
281
+ - app/models/metadata_presenter/criteria.rb
266
282
  - app/models/metadata_presenter/date_field.rb
283
+ - app/models/metadata_presenter/evaluate_conditions.rb
267
284
  - app/models/metadata_presenter/file_uploader.rb
285
+ - app/models/metadata_presenter/flow.rb
268
286
  - app/models/metadata_presenter/item.rb
269
287
  - app/models/metadata_presenter/meta.rb
270
288
  - app/models/metadata_presenter/meta_item.rb
@@ -273,8 +291,16 @@ files:
273
291
  - app/models/metadata_presenter/offline_upload_adapter.rb
274
292
  - app/models/metadata_presenter/page.rb
275
293
  - app/models/metadata_presenter/page_answers.rb
294
+ - app/models/metadata_presenter/previous_page.rb
276
295
  - app/models/metadata_presenter/service.rb
296
+ - app/models/metadata_presenter/traversed_pages.rb
277
297
  - app/models/metadata_presenter/uploaded_file.rb
298
+ - app/operators/metadata_presenter/base_operator.rb
299
+ - app/operators/metadata_presenter/is_answered_operator.rb
300
+ - app/operators/metadata_presenter/is_not_answered_operator.rb
301
+ - app/operators/metadata_presenter/is_not_operator.rb
302
+ - app/operators/metadata_presenter/is_operator.rb
303
+ - app/operators/metadata_presenter/operator.rb
278
304
  - app/presenters/metadata_presenter/page_answers_presenter.rb
279
305
  - app/validators/metadata_presenter/accept_validator.rb
280
306
  - app/validators/metadata_presenter/base_validator.rb
@@ -316,6 +342,7 @@ files:
316
342
  - app/views/metadata_presenter/page/start.html.erb
317
343
  - config/initializers/default_metadata.rb
318
344
  - config/initializers/default_text.rb
345
+ - config/initializers/inflections.rb
319
346
  - config/initializers/page_components.rb
320
347
  - config/initializers/schemas.rb
321
348
  - config/routes.rb
@@ -348,6 +375,7 @@ files:
348
375
  - default_metadata/string/error.required.json
349
376
  - default_metadata/string/error.virus_scan.json
350
377
  - default_text/content.json
378
+ - fixtures/branching.json
351
379
  - fixtures/invalid_content_page.json
352
380
  - fixtures/no_component_page.json
353
381
  - fixtures/non_finished_service.json