clerq 0.1.0 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
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: []