rspec-usecases 0.0.12 → 0.0.37

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +2 -0
  3. data/.gitignore +5 -0
  4. data/.rubocop.yml +7 -0
  5. data/Gemfile +19 -10
  6. data/Guardfile +1 -0
  7. data/STORIES.md +25 -4
  8. data/bin/console +1 -1
  9. data/docs/regexp-01.md +56 -0
  10. data/docs/samples.md +62 -0
  11. data/docs/test.debug.txt +93 -0
  12. data/docs/test.json +172 -0
  13. data/docs/test.md +39 -0
  14. data/lib/rspec/usecases.rb +20 -4
  15. data/lib/rspec/usecases/configure.rb +40 -0
  16. data/lib/rspec/usecases/contents/base_content.rb +145 -0
  17. data/lib/rspec/usecases/contents/code.rb +33 -0
  18. data/lib/rspec/usecases/contents/outcome.rb +27 -0
  19. data/lib/rspec/usecases/document.rb +173 -0
  20. data/lib/rspec/usecases/documentor.rb +35 -0
  21. data/lib/rspec/usecases/generator/base_generator.rb +58 -0
  22. data/lib/rspec/usecases/generator/debug_generator.rb +106 -0
  23. data/lib/rspec/usecases/generator/json_generator.rb +39 -0
  24. data/lib/rspec/usecases/generator/markdown_generator.rb +136 -0
  25. data/lib/rspec/usecases/groups/base_group.rb +116 -0
  26. data/lib/rspec/usecases/groups/group.rb +14 -0
  27. data/lib/rspec/usecases/groups/usecase.rb +30 -0
  28. data/lib/rspec/usecases/helpers/uc_file_as_markdown_content.rb +26 -0
  29. data/lib/rspec/usecases/helpers/uc_grab_lines.rb +54 -0
  30. data/lib/rspec/usecases/options/debug_options.rb +33 -0
  31. data/lib/rspec/usecases/options/document_options.rb +24 -0
  32. data/lib/rspec/usecases/options/dynamic_options.rb +102 -0
  33. data/lib/rspec/usecases/options/json_options.rb +32 -0
  34. data/lib/rspec/usecases/options/markdown_options.rb +37 -0
  35. data/lib/rspec/usecases/version.rb +1 -1
  36. data/rspec-usecases.gemspec +6 -0
  37. metadata +45 -9
  38. data/lib/rspec/usecases/content.rb +0 -155
  39. data/lib/rspec/usecases/content_code.rb +0 -42
  40. data/lib/rspec/usecases/content_outcome.rb +0 -30
  41. data/lib/rspec/usecases/usecase.rb +0 -103
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rspec
4
+ module Usecases
5
+ module Groups
6
+ # Group can be used as a basic container, it is
7
+ # similar in nature to describe and context but
8
+ # it will enter the flatten_group_hierarchy as
9
+ # it is a known usecase type
10
+ class Group < Rspec::Usecases::Groups::BaseGroup
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rspec
4
+ module Usecases
5
+ module Groups
6
+ # A usecase stores documentation for a single code usage scenario.
7
+ class Usecase < Rspec::Usecases::Groups::BaseGroup
8
+ # Usage contains a sample on how to call some code
9
+ attr_reader :usage
10
+
11
+ # Usage description gives extra details to support the usage example
12
+ attr_reader :usage_description
13
+
14
+ def build_attributes(example_group)
15
+ super(example_group)
16
+
17
+ @usage = example_group.metadata[:usage] || ''
18
+ @usage_description = example_group.metadata[:usage_description] || ''
19
+ end
20
+
21
+ def to_h
22
+ {
23
+ usage: usage,
24
+ usage_description: usage_description
25
+ }.merge(super.to_h)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rspec
4
+ module Usecases
5
+ # These helpers can be used from RSpec tests
6
+ module Helpers
7
+ # Builds markdown ```content block``` by injecting content
8
+ # from an existing file.
9
+ #
10
+ # @param [String] filename to read content from
11
+ # @param [Array<Integer>] lines (optional) - specific list of line numbers to grab using a 1 based index
12
+ # @param [String] code_type (optional) - what type of content is this, eg. javascript, ruby, css
13
+ def uc_file_as_markdown_content(filename, lines: nil, code_type: nil)
14
+ content = File.read(filename)
15
+
16
+ content = uc_grab_lines(content, lines) if lines
17
+
18
+ # To Deprecate: It may not be smart to support the code_type arg
19
+ # it is probably better to pass content into markdown
20
+ # components in raw format and let them apply this value
21
+ content = "```#{code_type}\n#{content}\n```" unless code_type.nil?
22
+ content
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rspec
4
+ module Usecases
5
+ # These helpers can be used from RSpec tests
6
+ module Helpers
7
+ # Grab lines from content into lines array and then extract specific lines
8
+ #
9
+ # Note that this is a 1 based index, instead of a traditional zero based index
10
+ #
11
+ # An array of [to, from] can be passed to grab specific lines
12
+ # from the content
13
+ #
14
+ # content = <<~TEXT.strip
15
+ # line 1
16
+ # line 2
17
+ # #{' '}
18
+ # line 4
19
+ # line 5
20
+ # TEXT
21
+ #
22
+ # @example - grab specific line numbers
23
+ #
24
+ # lines = uc_grab_lines(content, [1, 3, 5])
25
+ # it { lines.to match_array(['line 1', '', 'line 5']) }
26
+ #
27
+ # @example - specific and range of line numbers
28
+ #
29
+ # lines = uc_grab_lines(content, [1, *(3..4), 5])
30
+ # it { lines.to match_array(['line 1', '', 'line 4', 'line 5']) }
31
+ #
32
+ # @raise [Rspec::Usecases::Error] if lines to include contains a value less than 1
33
+ # @raise [Rspec::Usecases::Error] if lines to include contains a value greater than the content.line_count
34
+ #
35
+ # @param [Array<Integer>] lines_to_include is a list of line numbers to pluck from string
36
+ # rubocop:disable Metrics/AbcSize
37
+ def uc_grab_lines(content, lines_to_include)
38
+ content_lines = content.lines
39
+
40
+ line_nos = lines_to_include.sort.collect
41
+
42
+ raise(Rspec::Usecases::Error, 'Line numbers must start from 1') if line_nos.min < 1
43
+
44
+ raise(Rspec::Usecases::Error, "Line number out of range - content_length: #{content_lines.length} - line_no: #{line_nos.max}") if
45
+ content_lines.length <= line_nos.max - 1
46
+
47
+ output_lines = line_nos.map { |line_no| content_lines[line_no - 1].chomp }
48
+
49
+ output_lines.join("\n")
50
+ end
51
+ # rubocop:enable Metrics/AbcSize
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rspec
4
+ module Usecases
5
+ # Debug Options
6
+ module Options
7
+ # Options for debugging usecases objects
8
+ class DebugOptions < Rspec::Usecases::Options::DynamicOptions
9
+ def initialize(config)
10
+ super(:debug, config, {
11
+ format: :detail,
12
+ print: true,
13
+ write: false,
14
+ file: '',
15
+ open: false
16
+ })
17
+ end
18
+
19
+ def printable?
20
+ self.print == true
21
+ end
22
+
23
+ def writable?
24
+ write == true
25
+ end
26
+
27
+ def openable?
28
+ self.open == true
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rspec
4
+ module Usecases
5
+ module Options
6
+ # Document Options
7
+ class DocumentOptions
8
+ attr_reader :json
9
+ attr_reader :debug
10
+ attr_reader :markdown
11
+
12
+ def initialize(config)
13
+ @json = Rspec::Usecases::Options::JsonOptions.new(config[:json])
14
+ @debug = Rspec::Usecases::Options::DebugOptions.new(config[:debug])
15
+ @markdown = Rspec::Usecases::Options::MarkdownOptions.new(config[:markdown])
16
+ end
17
+
18
+ def to_h
19
+ Rspec::Usecases::Options::DynamicOptions.struct_to_hash(OpenStruct.new(json: json, debug: debug, markdown: markdown))
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rspec
4
+ module Usecases
5
+ # Dynamic Option
6
+ module Options
7
+ # Dynamic option will convert a value
8
+ class DynamicOptions < OpenStruct
9
+ # rubocop:disable Metrics/CyclomaticComplexity
10
+ def initialize(option_key, value, api = {})
11
+ super()
12
+
13
+ # This will load app the default values
14
+ parse(api)
15
+
16
+ self.empty = value.nil? || (value.is_a?(Hash) && value.empty?)
17
+
18
+ if !value.nil? && (value.is_a?(TrueClass) || value.is_a?(FalseClass))
19
+ self.empty = value.is_a?(FalseClass)
20
+ return
21
+ end
22
+
23
+ return if empty?
24
+ return if value == option_key
25
+
26
+ parse(value)
27
+ end
28
+ # rubocop:enable Metrics/CyclomaticComplexity
29
+
30
+ def active?
31
+ !empty?
32
+ end
33
+
34
+ def empty?
35
+ empty
36
+ end
37
+
38
+ def to_h
39
+ DynamicOptions.struct_to_hash(self)
40
+ end
41
+
42
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/AbcSize
43
+ def self.struct_to_hash(data)
44
+ # No test yet
45
+ if data.is_a?(Array)
46
+ return data.map { |v| v.is_a?(OpenStruct) ? struct_to_hash(v) : v }
47
+ end
48
+
49
+ data.each_pair.with_object({}) do |(key, value), hash|
50
+ case value
51
+ when OpenStruct
52
+ hash[key] = struct_to_hash(value)
53
+ when Array
54
+ # No test yet
55
+ values = value.map { |v| v.is_a?(OpenStruct) ? struct_to_hash(v) : v }
56
+ hash[key] = values
57
+ else
58
+ hash[key] = value
59
+ end
60
+ end
61
+ end
62
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/AbcSize
63
+
64
+ private
65
+
66
+ def parse(value)
67
+ case value
68
+ when Array
69
+ parse_array(value)
70
+ when Hash
71
+ parse_hash(value)
72
+ else
73
+ parse_value(value)
74
+ end
75
+ end
76
+
77
+ def parse_hash(data)
78
+ data.each do |k, v|
79
+ send("#{k}=", v)
80
+ end
81
+ end
82
+
83
+ def parse_array(values)
84
+ values.map do |value|
85
+ case value
86
+ when Symbol, String
87
+ parse_symbol_or_string(value)
88
+ when Hash
89
+ parse_hash(value)
90
+ else
91
+ raise Rspec::Usecases::Error, 'Unknown option paramater'
92
+ end
93
+ end
94
+ end
95
+
96
+ def parse_symbol_or_string(value)
97
+ send("#{value}=", true)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rspec
4
+ module Usecases
5
+ module Options
6
+ # Options for turning usecases into JSON objects
7
+ class JsonOptions < Rspec::Usecases::Options::DynamicOptions
8
+ def initialize(config)
9
+ super(:json, config, {
10
+ format: :detail,
11
+ print: true,
12
+ write: false,
13
+ file: '',
14
+ open: false
15
+ })
16
+ end
17
+
18
+ def printable?
19
+ self.print == true
20
+ end
21
+
22
+ def writable?
23
+ write == true
24
+ end
25
+
26
+ def openable?
27
+ self.open == true
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rspec
4
+ module Usecases
5
+ module Options
6
+ # Options for generating MarkDown files from usecases
7
+ class MarkdownOptions < Rspec::Usecases::Options::DynamicOptions
8
+ def initialize(config)
9
+ super(:markdown, config, {
10
+ format: :detail,
11
+ print: true,
12
+ write: false,
13
+ file: '',
14
+ pretty: false,
15
+ open: false
16
+ })
17
+ end
18
+
19
+ def printable?
20
+ self.print == true
21
+ end
22
+
23
+ def writable?
24
+ write == true
25
+ end
26
+
27
+ def prettier?
28
+ pretty == true
29
+ end
30
+
31
+ def openable?
32
+ self.open == true
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Rspec
4
4
  module Usecases
5
- VERSION = '0.0.12'
5
+ VERSION = '0.0.37'
6
6
  end
7
7
  end
@@ -37,6 +37,12 @@ Gem::Specification.new do |spec|
37
37
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
38
38
  spec.require_paths = ['lib']
39
39
  # spec.extensions = ['ext/rspec_usecases/extconf.rb']
40
+ spec.extra_rdoc_files = ['README.md', 'STORIES.md', 'USAGE.md']
41
+ spec.rdoc_options += [
42
+ '--title', 'rspec-usecases by appydave.com',
43
+ '--main', 'README.md',
44
+ '--files STORIES.MD USAGE.MD'
45
+ ]
40
46
 
41
47
  # spec.add_dependency 'tty-box', '~> 0.5.0'
42
48
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-usecases
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.37
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Cruwys
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-24 00:00:00.000000000 Z
11
+ date: 2021-02-03 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: " Rspec Usecases helps to write self-documenting code usage examples
14
14
  that execute as normal unit tests while outputting documentation in varied formats\n"
@@ -16,7 +16,10 @@ email:
16
16
  - david@ideasmen.com.au
17
17
  executables: []
18
18
  extensions: []
19
- extra_rdoc_files: []
19
+ extra_rdoc_files:
20
+ - README.md
21
+ - STORIES.md
22
+ - USAGE.md
20
23
  files:
21
24
  - ".github/workflows/main.yml"
22
25
  - ".gitignore"
@@ -31,18 +34,46 @@ files:
31
34
  - Rakefile
32
35
  - STORIES.md
33
36
  - USAGE.md
37
+ - _/app
38
+ - _/def-ruby-gem
39
+ - _/tem-ruby-gem
34
40
  - bin/console
35
41
  - bin/k
36
42
  - bin/kgitsync
37
43
  - bin/khotfix
44
+ - bin/runonce/common.sh
45
+ - bin/runonce/setup-chmod.sh
46
+ - bin/runonce/setup-git.sh
38
47
  - bin/setup
48
+ - docs/regexp-01.md
49
+ - docs/samples.md
50
+ - docs/test.debug.txt
51
+ - docs/test.json
52
+ - docs/test.md
53
+ - generate_markdown.md
39
54
  - hooks/pre-commit
40
55
  - hooks/update-version
41
56
  - lib/rspec/usecases.rb
42
- - lib/rspec/usecases/content.rb
43
- - lib/rspec/usecases/content_code.rb
44
- - lib/rspec/usecases/content_outcome.rb
45
- - lib/rspec/usecases/usecase.rb
57
+ - lib/rspec/usecases/configure.rb
58
+ - lib/rspec/usecases/contents/base_content.rb
59
+ - lib/rspec/usecases/contents/code.rb
60
+ - lib/rspec/usecases/contents/outcome.rb
61
+ - lib/rspec/usecases/document.rb
62
+ - lib/rspec/usecases/documentor.rb
63
+ - lib/rspec/usecases/generator/base_generator.rb
64
+ - lib/rspec/usecases/generator/debug_generator.rb
65
+ - lib/rspec/usecases/generator/json_generator.rb
66
+ - lib/rspec/usecases/generator/markdown_generator.rb
67
+ - lib/rspec/usecases/groups/base_group.rb
68
+ - lib/rspec/usecases/groups/group.rb
69
+ - lib/rspec/usecases/groups/usecase.rb
70
+ - lib/rspec/usecases/helpers/uc_file_as_markdown_content.rb
71
+ - lib/rspec/usecases/helpers/uc_grab_lines.rb
72
+ - lib/rspec/usecases/options/debug_options.rb
73
+ - lib/rspec/usecases/options/document_options.rb
74
+ - lib/rspec/usecases/options/dynamic_options.rb
75
+ - lib/rspec/usecases/options/json_options.rb
76
+ - lib/rspec/usecases/options/markdown_options.rb
46
77
  - lib/rspec/usecases/version.rb
47
78
  - rspec-usecases.gemspec
48
79
  homepage: http://appydave.com/gems/rspec-usecases
@@ -53,7 +84,12 @@ metadata:
53
84
  source_code_uri: https://github.com/klueless-io/rspec-usecases
54
85
  changelog_uri: https://github.com/klueless-io/rspec-usecases/commits/master
55
86
  post_install_message:
56
- rdoc_options: []
87
+ rdoc_options:
88
+ - "--title"
89
+ - rspec-usecases by appydave.com
90
+ - "--main"
91
+ - README.md
92
+ - "--files STORIES.MD USAGE.MD"
57
93
  require_paths:
58
94
  - lib
59
95
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -67,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
67
103
  - !ruby/object:Gem::Version
68
104
  version: '0'
69
105
  requirements: []
70
- rubygems_version: 3.2.5
106
+ rubygems_version: 3.2.7
71
107
  signing_key:
72
108
  specification_version: 4
73
109
  summary: Rspec Usecases helps to write self-documenting code usage examples that execute