clerq 0.1.0 → 0.3.3

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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -3
  3. data/CHANGELOG.md +49 -0
  4. data/Gemfile.lock +9 -9
  5. data/README.md +260 -133
  6. data/Rakefile +1 -0
  7. data/clerq.gemspec +6 -6
  8. data/clerq.thor +28 -0
  9. data/docs/README.md +408 -0
  10. data/lib/assets/knb/SRS-IEEE-830-1998.md +293 -0
  11. data/lib/assets/knb/SRS-RUP.md +283 -0
  12. data/lib/assets/knb/business-case.md +135 -0
  13. data/lib/assets/knb/ears-with-examples.md +101 -0
  14. data/lib/assets/knb/problem-statement.md +8 -0
  15. data/lib/assets/knb/product-statement.md +8 -0
  16. data/lib/assets/knb/requirement-attributes.md +26 -0
  17. data/lib/assets/knb/requirement-classification.md +27 -0
  18. data/lib/assets/knb/requirement-life-cycle.md +47 -0
  19. data/lib/assets/knb/requirement-quality.md +13 -0
  20. data/lib/assets/knb/use-case.md +39 -0
  21. data/lib/assets/knb/vision-document.md +191 -0
  22. data/lib/assets/lib/clerq_doc.thor +119 -0
  23. data/lib/assets/lib/colonize_repo.rb +82 -0
  24. data/lib/assets/lib/spec/colonize_repo_spec.rb +85 -0
  25. data/lib/assets/new/clerq.thor.tt +32 -5
  26. data/lib/assets/new/content.md.tt +3 -40
  27. data/lib/assets/tt/default.md.erb +23 -42
  28. data/lib/assets/tt/pandoc.md.erb +11 -8
  29. data/lib/clerq.rb +57 -12
  30. data/lib/clerq/cli.rb +77 -60
  31. data/lib/clerq/entities.rb +0 -1
  32. data/lib/clerq/entities/node.rb +135 -115
  33. data/lib/clerq/properties.rb +1 -3
  34. data/lib/clerq/repositories.rb +2 -4
  35. data/lib/clerq/repositories/file_repository.rb +59 -0
  36. data/lib/clerq/repositories/node_repository.rb +72 -30
  37. data/lib/clerq/repositories/text_repository.rb +47 -0
  38. data/lib/clerq/services.rb +8 -0
  39. data/lib/clerq/services/check_assembly.rb +108 -0
  40. data/lib/clerq/{interactors → services}/create_node.rb +12 -11
  41. data/lib/clerq/services/load_assembly.rb +54 -0
  42. data/lib/clerq/services/query_node.rb +72 -0
  43. data/lib/clerq/services/query_template.rb +26 -0
  44. data/lib/clerq/services/read_node.rb +101 -0
  45. data/lib/clerq/services/render_erb.rb +29 -0
  46. data/lib/clerq/services/render_node.rb +37 -0
  47. data/lib/clerq/services/service.rb +19 -0
  48. data/lib/clerq/settings.rb +2 -2
  49. data/lib/clerq/version.rb +1 -1
  50. metadata +49 -37
  51. data/TODO.md +0 -3
  52. data/lib/assets/tt/gitlab.md.erb +0 -93
  53. data/lib/assets/tt/raw.md.erb +0 -23
  54. data/lib/clerq/entities/template.rb +0 -19
  55. data/lib/clerq/gateways.rb +0 -3
  56. data/lib/clerq/gateways/gateway.rb +0 -17
  57. data/lib/clerq/gateways/in_files.rb +0 -36
  58. data/lib/clerq/gateways/in_memory.rb +0 -35
  59. data/lib/clerq/interactors.rb +0 -5
  60. data/lib/clerq/interactors/check_nodes.rb +0 -81
  61. data/lib/clerq/interactors/compile_nodes.rb +0 -31
  62. data/lib/clerq/interactors/interactor.rb +0 -28
  63. data/lib/clerq/interactors/join_nodes.rb +0 -59
  64. data/lib/clerq/interactors/query_nodes.rb +0 -62
  65. data/lib/clerq/repositories/in_memory.rb +0 -45
  66. data/lib/clerq/repositories/node_reader.rb +0 -107
  67. data/lib/clerq/repositories/repository.rb +0 -11
  68. data/lib/clerq/repositories/template_repository.rb +0 -53
  69. data/lib/clerq/templater.rb +0 -32
@@ -0,0 +1,72 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative "service"
4
+
5
+ module Clerq
6
+ module Services
7
+
8
+ # Provides repository nodes assembly
9
+ # @param [Sring] optional query string
10
+ # @return [Node] assembly of repository nodes
11
+ #
12
+ # Usage
13
+ # QueryAssembly.(asse:, query:)
14
+ # QueryAssembly.(query_string)
15
+ #
16
+ # Rules for root node:
17
+ # when query not passed, it return the whole hierarchy
18
+ # when nodes not found, it returns empty root node with meta[:query]
19
+ # when query returns one single node, it returns this node
20
+ # when query returns mare than one nodes, then
21
+ # * it creates empty root node with meta[:query]
22
+ # * and places found nodes to the root
23
+ class QueryNode < Service
24
+
25
+ def call
26
+ proc = prepare_query unless @query.empty?
27
+
28
+ arry = @assembly.select{|node| proc.call(node) }
29
+ return arry.first.orphan! if arry.size == 1
30
+
31
+ node = Node.new(title: Clerq.title, meta: {query: @query})
32
+ arry.each{|n| node << n.orphan!}
33
+ node
34
+ end
35
+
36
+ protected
37
+
38
+ def initialize(assembly: , query: )
39
+ unless assembly.is_a? Node
40
+ msg = "Invailid argument 'assembly'"
41
+ raise ArgumentError, msg
42
+ end
43
+ unless query.is_a? String
44
+ msg = "Invailid argument 'query'"
45
+ raise ArgumentError, msg
46
+ end
47
+ @query = query
48
+ @assembly = assembly
49
+ end
50
+
51
+ def prepare_query
52
+ proc = Proc.new{|node| eval(@query)}
53
+ Node.new.select{|node| proc.call(node)}
54
+ proc
55
+ rescue Exception => e
56
+ msg = "Invalid query format #{@query} (#{e.message})\n#{USAGE}"
57
+ raise ArgumentError, msg
58
+ end
59
+
60
+ USAGE = <<~EOF
61
+ QueryAssembly.call(query: ) evaluates query paramater
62
+ by eval() as 'Proc.new { |node| eval(query) }'
63
+ e.g. the followed queries are valid:
64
+ node.id == 'uc'
65
+ node.title == 'Introduction'
66
+ node[:originator] == 'clerq'
67
+ EOF
68
+
69
+ end
70
+
71
+ end
72
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative "service"
4
+
5
+ module Clerq
6
+ module Services
7
+
8
+ class QueryTemplate < Service
9
+
10
+ def call
11
+ Clerq.text_repository.text(@template)
12
+ end
13
+
14
+ # @param template [String] required name of template
15
+ def initialize(template)
16
+ if !(template.is_a?(String) && !template.empty?)
17
+ msg = "Invailid argument 'template'"
18
+ raise ArgumentError, msg
19
+ end
20
+ @template = template
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,101 @@
1
+ # encoding: UTF-8
2
+ require_relative 'service'
3
+ require_relative '../entities/node'
4
+ include Clerq::Entities
5
+
6
+ module Clerq
7
+ module Services
8
+
9
+ # The service reads nodes from file and returns array of nodes
10
+ # It returns array because the file can have a few root nodes
11
+ class ReadNode < Service
12
+
13
+ def call
14
+ # FIXME: something wrong here when foreach!
15
+ #
16
+ text = File.read(@filename)
17
+ read_nodes(text) do |node_text|
18
+ level, node = parse_node(node_text)
19
+ next unless node
20
+ node[:filename] = @filename
21
+ insert_node(node, level)
22
+ end
23
+
24
+ ary = Array.new(@node.items)
25
+ ary.each(&:orphan!)
26
+ ary
27
+ end
28
+
29
+ # @param filename [String] input file for reading
30
+ # @param on_error [Proc] proc object {|error| ...}
31
+ def initialize(filename, on_error = nil)
32
+ @filename = filename
33
+ @on_error = on_error
34
+ @node = Node.new(id: filename)
35
+ end
36
+
37
+ protected
38
+
39
+ # @param [Enumerator<String>] text
40
+ # @return [Array<String>] where each item represents one node
41
+ def read_nodes(text, &block)
42
+ quote, node = false, []
43
+ text = text.split(?\n) unless text.is_a? Enumerator
44
+ text.each do |line|
45
+ if line.start_with?('#') && !quote && !node.empty?
46
+ block.call(node.join("\n"))
47
+ node = []
48
+ end
49
+ node << line
50
+ quote = !quote if line.start_with?('```')
51
+ end
52
+ block.call(node.join("\n")) unless node.empty?
53
+ end
54
+
55
+ def insert_node(node, level)
56
+ parent = @node
57
+ while parent.last_item && (parent.nesting_level + 1) < level
58
+ parent = parent.last_item
59
+ end
60
+ unless (parent.nesting_level + 1) == level
61
+ msg = "invalid header level: #{'#' * level} #{node.title}"
62
+ @on_error.call(msg) if @on_error
63
+ parent = @node
64
+ end
65
+ parent << node
66
+ end
67
+
68
+ def parse_node(text)
69
+ text += "\n" unless text.end_with?("\n")
70
+ parts = NODE_REGX.match(text)
71
+ lv = parts[1] || ''
72
+ id = parts[3] || ''
73
+ title = parts[4] || ''
74
+ body = parts[7] || ''
75
+ meta = {}
76
+ meta.merge!(parse_meta(parts[6])) if parts[6]
77
+ [lv.size, Node.new(id: id, title: title, body: body.strip, meta: meta)]
78
+ rescue StandardError
79
+ msg = "invalid node format: #{text}"
80
+ @on_error.call(msg) if @on_error
81
+ [nil, nil]
82
+ end
83
+
84
+ def parse_meta(text)
85
+ text.strip.split(/[;,\n]/).inject({}) do |h, i|
86
+ pair = /\s?(\w*):\s*(.*)/.match(i)
87
+ h.merge(pair[1].to_sym => pair[2])
88
+ end || {}
89
+ rescue StandardError
90
+ msg = "invalid meta format:\n{{#{text}}}"
91
+ @on_error.call(msg) if @on_error
92
+ {}
93
+ end
94
+
95
+ NODE_REGX =
96
+ /^(\#+)[ ]*(\[([^\[\]\s]*)\][ ]*)?([\s\S]*?)\n({{([\s\S]*?)}})?(.*)$/m
97
+
98
+ end
99
+
100
+ end
101
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'erb'
4
+ require_relative 'service'
5
+
6
+ module Clerq
7
+ module Services
8
+
9
+ # Render @object trough ERB temlate
10
+ #
11
+ # Usage
12
+ # erb = "id: <%= @object.id %>\ntitle: <%= @object.title %>\n"
13
+ # obj = Node.new(id: 'uc', title: 'Use Cases', meta: {skip_meta: true})
14
+ # txt = RenderErb.call(erb, obj) # or RenderErb.(erb, obj)
15
+ class RenderErb < Service
16
+
17
+ def call
18
+ tt = ERB.new(@erb, nil, "-")
19
+ tt.result(binding)
20
+ end
21
+
22
+ def initialize(erb: , object: )
23
+ @erb = erb
24
+ @object = object
25
+ end
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: UTF-8
2
+ require_relative 'service'
3
+ require_relative 'query_template'
4
+ require_relative 'render_erb'
5
+
6
+ module Clerq
7
+ module Services
8
+
9
+ class RenderNode < Service
10
+
11
+ def call
12
+ @erb = QueryTemplate.(@ett)
13
+ RenderErb.(erb: @erb, object: @node)
14
+ end
15
+
16
+ def initialize(node: , template:)
17
+ check_string_argument!(template, 'template')
18
+ check_string_empty!(template, 'template')
19
+ @node = node
20
+ @ett = template
21
+ end
22
+
23
+ def check_string_argument!(arg, str)
24
+ return if arg.is_a? String
25
+ errmsg = ":#{str} must be String!"
26
+ raise ArgumentError, errmsg, caller
27
+ end
28
+
29
+ def check_string_empty!(arg, str)
30
+ return unless arg.empty?
31
+ errmsg = ":#{str} cannot be empty!"
32
+ raise ArgumentError, errmsg, caller
33
+ end
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,19 @@
1
+ # encoding: UTF-8
2
+
3
+ module Clerq
4
+ module Services
5
+
6
+ class Service
7
+ def self.call(*args, **opts)
8
+ new(*args, **opts).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
@@ -12,9 +12,9 @@ module Clerq
12
12
  STORAGE = 'clerq.yml'.freeze
13
13
 
14
14
  # binary document settings that can be changed through 'clerq.yml'
15
- property :document, default: 'Clеrk SRS'
15
+ property :document, default: 'Clеrq SRS'
16
16
  property :template, default: 'default.md.erb'
17
- property :title, default: 'Clеrk SRS'
17
+ property :title, default: 'Clеrq SRS'
18
18
 
19
19
  # folders structure
20
20
  property :bin, default: 'bin'
data/lib/clerq/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Clerq
2
- VERSION = "0.1.0"
2
+ VERSION = "0.3.3"
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.1.0
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nikolay Voynov
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-11-08 00:00:00.000000000 Z
11
+ date: 2021-05-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,58 +16,59 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.17'
19
+ version: 2.2.3
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.17'
26
+ version: 2.2.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '13.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '5.0'
47
+ version: 5.14.2
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '5.0'
54
+ version: 5.14.2
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: thor
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.20.3
61
+ version: 1.0.1
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.20.3
69
- description: The gem provides requirements markup; file based requirements project
70
- structure; document templates; customizable CLI for managing requirements projects.
68
+ version: 1.0.1
69
+ description: The gem provides text nodes markup, text repository, advanced customizable
70
+ CLI for managing repository, the powerful templating system for text transformation
71
+ that perfect matches for managing large structured texts.
71
72
  email:
72
73
  - nvoynov@gmail.com
73
74
  executables:
@@ -77,15 +78,33 @@ extra_rdoc_files: []
77
78
  files:
78
79
  - ".gitignore"
79
80
  - ".travis.yml"
81
+ - CHANGELOG.md
80
82
  - Gemfile
81
83
  - Gemfile.lock
82
84
  - README.md
83
85
  - Rakefile
84
- - TODO.md
85
86
  - bin/console
86
87
  - bin/setup
87
88
  - clerq.gemspec
89
+ - clerq.thor
90
+ - docs/README.md
91
+ - docs/_config.yml
88
92
  - exe/clerq
93
+ - lib/assets/knb/SRS-IEEE-830-1998.md
94
+ - lib/assets/knb/SRS-RUP.md
95
+ - lib/assets/knb/business-case.md
96
+ - lib/assets/knb/ears-with-examples.md
97
+ - lib/assets/knb/problem-statement.md
98
+ - lib/assets/knb/product-statement.md
99
+ - lib/assets/knb/requirement-attributes.md
100
+ - lib/assets/knb/requirement-classification.md
101
+ - lib/assets/knb/requirement-life-cycle.md
102
+ - lib/assets/knb/requirement-quality.md
103
+ - lib/assets/knb/use-case.md
104
+ - lib/assets/knb/vision-document.md
105
+ - lib/assets/lib/clerq_doc.thor
106
+ - lib/assets/lib/colonize_repo.rb
107
+ - lib/assets/lib/spec/colonize_repo_spec.rb
89
108
  - lib/assets/new/README.md.tt
90
109
  - lib/assets/new/clerq.thor.tt
91
110
  - lib/assets/new/clerq.yml.tt
@@ -113,34 +132,27 @@ files:
113
132
  - lib/assets/promo/src/us/us.reader.md
114
133
  - lib/assets/promo/src/us/us.writer.md
115
134
  - lib/assets/tt/default.md.erb
116
- - lib/assets/tt/gitlab.md.erb
117
135
  - lib/assets/tt/pandoc.md.erb
118
- - lib/assets/tt/raw.md.erb
119
136
  - lib/clerq.rb
120
137
  - lib/clerq/cli.rb
121
138
  - lib/clerq/entities.rb
122
139
  - lib/clerq/entities/node.rb
123
- - lib/clerq/entities/template.rb
124
- - lib/clerq/gateways.rb
125
- - lib/clerq/gateways/gateway.rb
126
- - lib/clerq/gateways/in_files.rb
127
- - lib/clerq/gateways/in_memory.rb
128
- - lib/clerq/interactors.rb
129
- - lib/clerq/interactors/check_nodes.rb
130
- - lib/clerq/interactors/compile_nodes.rb
131
- - lib/clerq/interactors/create_node.rb
132
- - lib/clerq/interactors/interactor.rb
133
- - lib/clerq/interactors/join_nodes.rb
134
- - lib/clerq/interactors/query_nodes.rb
135
140
  - lib/clerq/properties.rb
136
141
  - lib/clerq/repositories.rb
137
- - lib/clerq/repositories/in_memory.rb
138
- - lib/clerq/repositories/node_reader.rb
142
+ - lib/clerq/repositories/file_repository.rb
139
143
  - lib/clerq/repositories/node_repository.rb
140
- - lib/clerq/repositories/repository.rb
141
- - lib/clerq/repositories/template_repository.rb
144
+ - lib/clerq/repositories/text_repository.rb
145
+ - lib/clerq/services.rb
146
+ - lib/clerq/services/check_assembly.rb
147
+ - lib/clerq/services/create_node.rb
148
+ - lib/clerq/services/load_assembly.rb
149
+ - lib/clerq/services/query_node.rb
150
+ - lib/clerq/services/query_template.rb
151
+ - lib/clerq/services/read_node.rb
152
+ - lib/clerq/services/render_erb.rb
153
+ - lib/clerq/services/render_node.rb
154
+ - lib/clerq/services/service.rb
142
155
  - lib/clerq/settings.rb
143
- - lib/clerq/templater.rb
144
156
  - lib/clerq/version.rb
145
157
  homepage: https://github.com/nvoynov/clerq
146
158
  licenses:
@@ -150,7 +162,7 @@ metadata:
150
162
  homepage_uri: https://github.com/nvoynov/clerq
151
163
  source_code_uri: https://github.com/nvoynov/clerq
152
164
  changelog_uri: https://github.com/nvoynov/clerq/CHANGELOG.md
153
- post_install_message:
165
+ post_install_message:
154
166
  rdoc_options: []
155
167
  require_paths:
156
168
  - lib
@@ -165,8 +177,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
165
177
  - !ruby/object:Gem::Version
166
178
  version: '0'
167
179
  requirements: []
168
- rubygems_version: 3.0.6
169
- signing_key:
180
+ rubygems_version: 3.2.15
181
+ signing_key:
170
182
  specification_version: 4
171
- summary: Toolkit for requirements management
183
+ summary: Text node repository and automation of managing large structured texts.
172
184
  test_files: []