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.
- checksums.yaml +4 -4
- data/.gitignore +4 -1
- data/CHANGELOG.md +14 -2
- data/Gemfile.lock +24 -0
- data/README.md +107 -30
- data/clerq.thor +28 -0
- data/docs/README.md +408 -0
- data/lib/assets/knb/business-case.md +135 -0
- data/lib/assets/knb/requirement-life-cycle.md +47 -0
- data/lib/assets/knb/vision-document.md +191 -0
- data/lib/assets/lib/clerq_doc.thor +119 -0
- data/lib/assets/lib/colonize_repo.rb +82 -0
- data/lib/assets/lib/spec/colonize_repo_spec.rb +85 -0
- data/lib/assets/new/content.md.tt +1 -0
- data/lib/assets/tt/default.md.erb +1 -1
- data/lib/assets/tt/pandoc.md.erb +6 -6
- data/lib/clerq.rb +7 -2
- data/lib/clerq/cli.rb +33 -47
- data/lib/clerq/entities/node.rb +11 -5
- data/lib/clerq/repositories.rb +0 -1
- data/lib/clerq/repositories/file_repository.rb +1 -0
- data/lib/clerq/repositories/node_repository.rb +7 -6
- data/lib/clerq/services.rb +8 -0
- data/lib/clerq/services/check_assembly.rb +108 -0
- data/lib/clerq/{interactors → services}/create_node.rb +4 -5
- data/lib/clerq/services/load_assembly.rb +54 -0
- data/lib/clerq/{interactors/query_assembly.rb → services/query_node.rb} +15 -12
- data/lib/clerq/{interactors → services}/query_template.rb +3 -8
- data/lib/clerq/services/read_node.rb +98 -0
- data/lib/clerq/services/render_erb.rb +29 -0
- data/lib/clerq/{interactors/render_assembly.rb → services/render_node.rb} +8 -12
- data/lib/clerq/services/service.rb +19 -0
- data/lib/clerq/version.rb +1 -1
- metadata +21 -12
- data/TODO.md +0 -7
- data/lib/clerq/interactors.rb +0 -5
- data/lib/clerq/interactors/check_assembly.rb +0 -77
- data/lib/clerq/interactors/interactor.rb +0 -26
- data/lib/clerq/render_erb.rb +0 -33
- data/lib/clerq/repositories/node_reader.rb +0 -107
data/lib/clerq/version.rb
CHANGED
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.
|
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
|
+
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
|
data/lib/clerq/interactors.rb
DELETED
@@ -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
|
data/lib/clerq/render_erb.rb
DELETED
@@ -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
|