clerq 0.2.0 → 0.3.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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -1
  3. data/CHANGELOG.md +14 -2
  4. data/Gemfile.lock +24 -0
  5. data/README.md +107 -30
  6. data/clerq.thor +28 -0
  7. data/docs/README.md +408 -0
  8. data/lib/assets/knb/business-case.md +135 -0
  9. data/lib/assets/knb/requirement-life-cycle.md +47 -0
  10. data/lib/assets/knb/vision-document.md +191 -0
  11. data/lib/assets/lib/clerq_doc.thor +119 -0
  12. data/lib/assets/lib/colonize_repo.rb +82 -0
  13. data/lib/assets/lib/spec/colonize_repo_spec.rb +85 -0
  14. data/lib/assets/new/content.md.tt +1 -0
  15. data/lib/assets/tt/default.md.erb +1 -1
  16. data/lib/assets/tt/pandoc.md.erb +6 -6
  17. data/lib/clerq.rb +7 -2
  18. data/lib/clerq/cli.rb +33 -47
  19. data/lib/clerq/entities/node.rb +11 -5
  20. data/lib/clerq/repositories.rb +0 -1
  21. data/lib/clerq/repositories/file_repository.rb +1 -0
  22. data/lib/clerq/repositories/node_repository.rb +7 -6
  23. data/lib/clerq/services.rb +8 -0
  24. data/lib/clerq/services/check_assembly.rb +108 -0
  25. data/lib/clerq/{interactors → services}/create_node.rb +4 -5
  26. data/lib/clerq/services/load_assembly.rb +54 -0
  27. data/lib/clerq/{interactors/query_assembly.rb → services/query_node.rb} +15 -12
  28. data/lib/clerq/{interactors → services}/query_template.rb +3 -8
  29. data/lib/clerq/services/read_node.rb +98 -0
  30. data/lib/clerq/services/render_erb.rb +29 -0
  31. data/lib/clerq/{interactors/render_assembly.rb → services/render_node.rb} +8 -12
  32. data/lib/clerq/services/service.rb +19 -0
  33. data/lib/clerq/version.rb +1 -1
  34. metadata +21 -12
  35. data/TODO.md +0 -7
  36. data/lib/clerq/interactors.rb +0 -5
  37. data/lib/clerq/interactors/check_assembly.rb +0 -77
  38. data/lib/clerq/interactors/interactor.rb +0 -26
  39. data/lib/clerq/render_erb.rb +0 -33
  40. data/lib/clerq/repositories/node_reader.rb +0 -107
@@ -0,0 +1,19 @@
1
+ # encoding: UTF-8
2
+
3
+ module Clerq
4
+ module Services
5
+
6
+ class Service
7
+ def self.call(*args)
8
+ new(*args).call
9
+ end
10
+
11
+ private_class_method :new
12
+
13
+ # Should be implemented in subclasses
14
+ def call
15
+ end
16
+ end
17
+
18
+ end
19
+ end
@@ -1,3 +1,3 @@
1
1
  module Clerq
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clerq
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nikolay Voynov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-11-23 00:00:00.000000000 Z
11
+ date: 2019-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -83,18 +83,26 @@ files:
83
83
  - Gemfile.lock
84
84
  - README.md
85
85
  - Rakefile
86
- - TODO.md
87
86
  - bin/console
88
87
  - bin/setup
89
88
  - clerq.gemspec
89
+ - clerq.thor
90
+ - docs/README.md
91
+ - docs/_config.yml
90
92
  - exe/clerq
91
93
  - lib/assets/knb/SRS-IEEE-830-1998.md
92
94
  - lib/assets/knb/SRS-RUP.md
95
+ - lib/assets/knb/business-case.md
93
96
  - lib/assets/knb/ears-with-examples.md
94
97
  - lib/assets/knb/problem-statement.md
95
98
  - lib/assets/knb/product-statement.md
96
99
  - lib/assets/knb/requirement-attributes.md
100
+ - lib/assets/knb/requirement-life-cycle.md
97
101
  - lib/assets/knb/use-case.md
102
+ - lib/assets/knb/vision-document.md
103
+ - lib/assets/lib/clerq_doc.thor
104
+ - lib/assets/lib/colonize_repo.rb
105
+ - lib/assets/lib/spec/colonize_repo_spec.rb
98
106
  - lib/assets/new/README.md.tt
99
107
  - lib/assets/new/clerq.thor.tt
100
108
  - lib/assets/new/clerq.yml.tt
@@ -127,20 +135,21 @@ files:
127
135
  - lib/clerq/cli.rb
128
136
  - lib/clerq/entities.rb
129
137
  - lib/clerq/entities/node.rb
130
- - lib/clerq/interactors.rb
131
- - lib/clerq/interactors/check_assembly.rb
132
- - lib/clerq/interactors/create_node.rb
133
- - lib/clerq/interactors/interactor.rb
134
- - lib/clerq/interactors/query_assembly.rb
135
- - lib/clerq/interactors/query_template.rb
136
- - lib/clerq/interactors/render_assembly.rb
137
138
  - lib/clerq/properties.rb
138
- - lib/clerq/render_erb.rb
139
139
  - lib/clerq/repositories.rb
140
140
  - lib/clerq/repositories/file_repository.rb
141
- - lib/clerq/repositories/node_reader.rb
142
141
  - lib/clerq/repositories/node_repository.rb
143
142
  - lib/clerq/repositories/text_repository.rb
143
+ - lib/clerq/services.rb
144
+ - lib/clerq/services/check_assembly.rb
145
+ - lib/clerq/services/create_node.rb
146
+ - lib/clerq/services/load_assembly.rb
147
+ - lib/clerq/services/query_node.rb
148
+ - lib/clerq/services/query_template.rb
149
+ - lib/clerq/services/read_node.rb
150
+ - lib/clerq/services/render_erb.rb
151
+ - lib/clerq/services/render_node.rb
152
+ - lib/clerq/services/service.rb
144
153
  - lib/clerq/settings.rb
145
154
  - lib/clerq/version.rb
146
155
  homepage: https://github.com/nvoynov/clerq
data/TODO.md DELETED
@@ -1,7 +0,0 @@
1
- # TODO
2
-
3
- [ ] Return node file name from NodeRepository and CreateNode
4
- [ ] Provide CheckAssembly with checking links with partial ids e.g. `[[*.entiity]]`
5
- [ ] Provide separate MarkupNode in `lib` with minitest specs
6
- [ ] Auto load code from `lib`?
7
- [ ] GitHub Pages! Architect or Hacker template
@@ -1,5 +0,0 @@
1
- require_relative "interactors/create_node"
2
- require_relative "interactors/query_template"
3
- require_relative "interactors/query_assembly"
4
- require_relative "interactors/check_assembly"
5
- require_relative "interactors/render_assembly"
@@ -1,77 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require_relative "interactor"
4
-
5
- module Clerq
6
- module Interactors
7
-
8
- class CheckAssembly < Interactor
9
-
10
- def call
11
- @node = Clerq.node_repository.assemble
12
- {}.tap do |errors|
13
- nonuniq = nonuniq_ids
14
- errors.merge!(nonuniq_ids: nonuniq) if !nonuniq.empty?
15
- parents = unknown_parents
16
- errors.merge!(unknown_parents: parents) if !parents.empty?
17
- references = unknown_references
18
- errors.merge!(unknown_references: references) if !references.empty?
19
- order = unknown_order_index
20
- errors.merge!(unknown_order_index: order) if !order.empty?
21
- end
22
- end
23
-
24
- protected
25
-
26
- # @return [Hash<node id, Array<file_name>>] node ids and array of file_names
27
- def nonuniq_ids
28
- @node.each_with_object({}){|node, hsh|
29
- hsh[node.id] ||= []
30
- # TODO that way CheckNodes depends on files!?
31
- hsh[node.id] << node[:file_name]
32
- }.select{|k, v| v.size > 1}
33
- .each{|k, v| v.uniq!}
34
- end
35
-
36
- # @return [Hash<parent, Array<node id>>] unknown meta[:parent] and
37
- # array of nodes those have this meta attribute
38
- def unknown_parents
39
- @node # .drop(1)?
40
- .select{|node| node[:parent] && node.parent.id != node[:parent]}
41
- .each_with_object({}){|node, hsh|
42
- hsh[node[:parent]] ||= []
43
- hsh[node[:parent]] << node.id
44
- }
45
- end
46
-
47
- # @return [Hash<node_id, Array<node_id>>] node ids that noe found
48
- # in hierarchy and array of node ids those have links to corresponding
49
- # unknown node
50
- def unknown_references
51
- index = @node.map(&:id).drop(1)
52
- @node.each_with_object({}) do |node, hsh|
53
- node.links
54
- .reject {|lnk| index.include?(lnk)}
55
- .each do |lnk|
56
- hsh[lnk] ||= []
57
- hsh[lnk] << node.id
58
- end
59
- end
60
- end
61
-
62
- # @return [Hash<node_id, Array<node_id>>] node ids and array of
63
- # unknown links in :order_index
64
- def unknown_order_index
65
- @node
66
- .select{|node| node[:order_index]}
67
- .each_with_object({}){|node, hsh|
68
- order = node[:order_index].split(/ /)
69
- wrong = order.select{|o| node.item(o).nil?}
70
- hsh[node.id] = wrong unless wrong.empty?
71
- }
72
- end
73
-
74
- end
75
-
76
- end
77
- end
@@ -1,26 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- module Clerq
4
- module Interactors
5
-
6
- class Interactor
7
- Failure = Class.new(StandardError)
8
-
9
- def self.inherited(klass)
10
- klass.const_set(:Failure, Class.new(klass::Failure))
11
- end
12
-
13
- def self.call(*args)
14
- new(*args).call
15
- end
16
-
17
- # Should be implemented in subclasses
18
- def call; end
19
-
20
- # TODO Suppress ability to create new object
21
- # private_class_method :new
22
-
23
- end
24
-
25
- end
26
- end
@@ -1,33 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require 'erb'
4
-
5
- module Clerq
6
-
7
- # Render @object trough ERB temlate
8
- #
9
- # Usage
10
- # erb = "id: <%= @object.id %>\ntitle: <%= @object.title %>\n"
11
- # obj = Node.new(id: 'uc', title: 'Use Cases', meta: {skip_meta: true})
12
- # txt = RenderErb.call(erb, obj) # or RenderErb.(erb, obj)
13
- class RenderErb
14
-
15
- # @param erb [Text] ERB template
16
- # @param object [Object]
17
- # @result [String?]
18
- def self.call(erb: , object: )
19
- new(erb: erb, object: object).call
20
- end
21
-
22
- def call
23
- tt = ERB.new(@erb, nil, "-")
24
- tt.result(binding)
25
- end
26
-
27
- def initialize(erb: , object: )
28
- @erb = erb
29
- @object = object
30
- end
31
- end
32
-
33
- end
@@ -1,107 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require_relative '../entities'
4
- include Clerq::Entities
5
-
6
- module Clerq
7
- module Repositories
8
- end
9
- end
10
-
11
- class Clerq::Repositories::NodeReader
12
-
13
- # @param [String] file_name with node
14
- # @return [Array<Node>] from file
15
- def self.call(file_name)
16
- new(file_name).call
17
- end
18
-
19
- # @param [Enumerator] lines; for testing purpose
20
- # @return [Array<Node>] from file
21
- def call(text = File.foreach(@file_name))
22
- STDOUT.print "Reading #{@file_name} ..."
23
-
24
- read_nodes(text).each do |node_text|
25
- level, node = parse_node(node_text)
26
- next unless node
27
- node[:file_name] = @file_name
28
- insert_node(node, level)
29
- end
30
-
31
- STDOUT.puts @errors.empty? ? "OK" : "Errors found"
32
- unless @errors.empty?
33
- STDERR.puts "Errors reading #{@file_name}"
34
- STDERR.puts @errors.map{|e| "\t#{e}"}.join("\n")
35
- end
36
-
37
- nodes = Array.new(@node.items)
38
- nodes.each(&:orphan!)
39
- nodes
40
- end
41
-
42
- protected
43
-
44
- def initialize(file_name)
45
- @file_name = file_name
46
- @node = Node.new(id: file_name)
47
- @errors = []
48
- end
49
-
50
- # @param [Enumerator<String>] text
51
- # @return [Array<String>] where each item represents one node
52
- def read_nodes(text)
53
- [].tap do |nodes|
54
- quote, body = false, ''
55
- text.each do |line|
56
- if line.start_with?('#') && !quote && !body.empty?
57
- nodes << body
58
- body = ''
59
- end
60
- body << line
61
- quote = !quote if line.start_with?('```')
62
- end
63
- nodes << body unless body.empty?
64
- end
65
- end
66
-
67
- def insert_node(node, level)
68
- parent = @node
69
- while parent.last_item && (parent.nesting_level + 1) < level
70
- parent = parent.last_item
71
- end
72
- unless (parent.nesting_level + 1) == level
73
- @errors << "invalid header level: #{'#' * level} [#{node.id}]"
74
- parent = @node
75
- end
76
- parent << node
77
- end
78
-
79
- def parse_node(text)
80
- text += "\n" unless text.end_with?("\n")
81
- parts = NODE_REGX.match(text)
82
- lv = parts[1] || ''
83
- id = parts[3] || ''
84
- title = parts[4] || ''
85
- body = parts[7] || ''
86
- meta = {}
87
- meta.merge!(parse_meta(parts[6])) if parts[6]
88
- [lv.size, Node.new(id: id, title: title, body: body.strip, meta: meta)]
89
- rescue StandardError
90
- @errors << "invalid node format:\n#{text}"
91
- [nil, nil]
92
- end
93
-
94
- def parse_meta(text)
95
- text.strip.split(/[;\n]/).inject({}) do |h, i|
96
- pair = /\s?(\w*):\s*(.*)/.match(i)
97
- h.merge(pair[1].to_sym => pair[2])
98
- end || {}
99
- rescue StandardError
100
- @errors << "invalid meta format:\n{{#{text}}}"
101
- {}
102
- end
103
-
104
- NODE_REGX =
105
- /^(\#+)[ ]*(\[([^\[\]\s]*)\][ ]*)?([\s\S]*?)\n({{([\s\S]*?)}})?(.*)$/m
106
-
107
- end