featuremap 0.0.2 → 0.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3e9b97e4894658a5d3d8f8dea733013c28c2a74e
4
- data.tar.gz: 453f5df89b88b09fd3b6e67f50781a6044f12210
2
+ SHA256:
3
+ metadata.gz: 1ab3ac84cd60d91bf241cd06522c32ec7d934d665600ee3dcb6784cfcd971fc7
4
+ data.tar.gz: af5666ed23c58b5710beb9e734afa07a10113d724e164dc44987befda31431eb
5
5
  SHA512:
6
- metadata.gz: c4b2b50674749818acee3d3f6ad6d3774f9afd6872ca005584a67f2941a030d8631c08c19c4d9a78cfadd53890fb06be525541b72de996cac30c265ca8cc643c
7
- data.tar.gz: 14436d3a64bbf81b951c374fb9baf82b88282f6b2c04ad17747f05be34e53b3f4c3a8a2f21bc07724548d2eb4f475f0043f9cebc55a21b4e5e91d5ceb9a4689f
6
+ metadata.gz: 3ce368221cf8218c46c635d51dd3e13a934f02527a40c8e67e450c65ac0cf1c18495ae6efeca6691b111a1458b378e0839d1ea509781d78f4135b6dcd2eabc6f
7
+ data.tar.gz: b261f82c0494592aa193ed736d351151556ec67293ae60715daa7cab3d1215097c64c7f5fc7fa7945134a1947939b46c17ad048369bfedc8b0f323ed30c8975b
data/bin/featuremap CHANGED
@@ -28,7 +28,7 @@ else
28
28
  else
29
29
  output_file = "STDOUT"
30
30
  end
31
- featuremap = Featuremap.new(feature_dir, output_file, options[:verbose])
31
+ featuremap = Featuremap::Featuremap.new(feature_dir, output_file, options[:verbose])
32
32
  if featuremap.exit_status == 0
33
33
  featuremap.create_featuremap()
34
34
  end
@@ -17,7 +17,7 @@ Ability: give feedback
17
17
  And the user rights for the feature dir don't allow access
18
18
  When the user runs featuremap
19
19
  Then featuremap exits with 66
20
- And featuremap shows the message "can't access >>secret_features/<< as feature dir"
20
+ And featuremap shows the message "can't access >>secret_features<< as feature dir"
21
21
 
22
22
 
23
23
  # rule: show an error message if the featuremap can't write the mindmap
@@ -23,7 +23,7 @@ end
23
23
  When("the mapper is called") do
24
24
  create_path(@path_to_results)
25
25
  @featuremap_file = "#{@path_to_results}/featuremap.mm"
26
- @mapper = Featuremap.new("#{@path_to_testdata}/#{@feature_dir}", @featuremap_file)
26
+ @mapper = Featuremap::Featuremap.new("#{@path_to_testdata}/#{@feature_dir}", @featuremap_file)
27
27
  @mapper.create_featuremap()
28
28
  end
29
29
 
data/lib/featuremap.rb CHANGED
@@ -1,137 +1,119 @@
1
1
  # use securerandom to create unique id's
2
2
  require 'securerandom'
3
3
  require 'logger'
4
+ require 'cuke_modeler'
4
5
  require_relative 'mindmap'
5
6
 
7
+ module Featuremap
6
8
 
7
- class Featuremap
9
+ class Featuremap
8
10
 
9
- attr_reader :nodes, :exit_status, :mindmap_path, :features_path
11
+ attr_reader :nodes, :exit_status, :mindmap_path, :features_path
10
12
 
11
- def initialize(p_features_path, p_mindmap_path, p_verbose = false)
12
- if p_mindmap_path == "STDOUT"
13
- @log = Logger.new(STDERR)
14
- else
15
- @log = Logger.new(STDOUT)
16
- end
17
- @log.formatter = proc do |severity, datetime, progname, msg|
18
- date_format = datetime.strftime("%Y-%m-%d %H:%M:%S")
19
- "[#{date_format}] #{severity.ljust(5,' ')}: #{msg}\n"
20
- end
21
- @log.datetime_format = "%H:%M:%S"
22
- if ENV['LOG_LEVEL'] == 'debug'
23
- @log.level = Logger::DEBUG
24
- elsif ENV['LOG_LEVEL'] == 'info'
25
- @log.level = Logger::INFO
26
- elsif ENV['LOG_LEVEL'] == 'warn'
27
- @log.level = Logger::WARN
28
- else
29
- # default log level
30
- @log.level = Logger::ERROR
31
- end
32
- if p_verbose && @log.level != Logger::DEBUG && p_mindmap_path != "STDOUT"
33
- @log.level = Logger::INFO
34
- @log.info "set log level to verbose"
35
- end
36
- @exit_status = 0
37
- @mindmap_path = p_mindmap_path
38
- if Dir.exists?(p_features_path)
39
- @features_path = p_features_path
40
- @log.info("create a new featuremap")
41
- @mindmap = Mindmap.new(@log)
42
- else
43
- @exit_status = 66 # see https://www.freebsd.org/cgi/man.cgi?query=sysexits&sektion=3 for more info
44
- @log.error("can't find >>#{p_features_path}<< as feature dir")
45
- return
46
- end
47
- end
48
-
49
- # class entry point - create a mindmap for a given path
50
- def create_featuremap()
51
- mindmap_path = @mindmap_path
52
- if mindmap_path != "STDOUT"
53
- while File.exists?(mindmap_path)
54
- filename_parts = mindmap_path.split(".")
55
- if filename_parts[0] =~ /-\d+$/
56
- filename_parts = filename_parts[0].split("-")
57
- mindmap_path = "#{filename_parts[0]}-#{filename_parts[1].to_i + 1}.mm"
58
- else
59
- mindmap_path = "#{filename_parts[0]}-1.mm"
60
- end
13
+ def initialize(p_features_path, p_mindmap_path, p_verbose = false)
14
+ if p_mindmap_path == "STDOUT"
15
+ @log = Logger.new(STDERR)
16
+ else
17
+ @log = Logger.new(STDOUT)
61
18
  end
62
- if mindmap_path != @mindmap_path
63
- @log.warn("given mindmap name is already in use, created #{mindmap_path}")
19
+ @log.formatter = proc do |severity, datetime, progname, msg|
20
+ date_format = datetime.strftime("%Y-%m-%d %H:%M:%S")
21
+ "[#{date_format}] #{severity.ljust(5,' ')}: #{msg}\n"
64
22
  end
65
- begin
66
- IO.write("#{mindmap_path}","")
67
- rescue Exception
68
- @log.error("can't write to #{mindmap_path}")
69
- @exit_status = 74
70
- return
23
+ @log.datetime_format = "%H:%M:%S"
24
+ if ENV['LOG_LEVEL'] == 'debug'
25
+ @log.level = Logger::DEBUG
26
+ elsif ENV['LOG_LEVEL'] == 'info'
27
+ @log.level = Logger::INFO
28
+ elsif ENV['LOG_LEVEL'] == 'warn'
29
+ @log.level = Logger::WARN
30
+ else
31
+ # default log level
32
+ @log.level = Logger::ERROR
71
33
  end
72
- end
73
- read_features(@features_path)
74
- if @exit_status == 0
75
- if mindmap_path != "STDOUT"
76
- mindmap_file = File.open(mindmap_path,"w")
77
- mindmap_file.write(@mindmap.to_s)
78
- mindmap_file.close
34
+ if p_verbose && @log.level != Logger::DEBUG && p_mindmap_path != "STDOUT"
35
+ @log.level = Logger::INFO
36
+ @log.info "set log level to verbose"
37
+ end
38
+ @exit_status = 0
39
+ @mindmap_path = p_mindmap_path
40
+ if Dir.exists?(p_features_path)
41
+ @features_path = p_features_path
42
+ @log.info("create a new featuremap")
43
+ @mindmap = Mindmap.new(@log)
79
44
  else
80
- puts @mindmap.to_s
45
+ @exit_status = 66 # see https://www.freebsd.org/cgi/man.cgi?query=sysexits&sektion=3 for more info
46
+ @log.error("can't find >>#{p_features_path}<< as feature dir")
47
+ return
81
48
  end
82
49
  end
83
- end
84
50
 
85
- # scan feature folder for feature files and subdirs
86
- def read_features(p_features_path = @features_path, p_parent_node = nil)
87
- # don't read features if some error happened before
88
- if @exit_status == 0
89
- feature_node = nil
90
- begin
91
- if p_features_path.end_with?("/")
92
- features_path = p_features_path
93
- else
94
- features_path = p_features_path + "/"
51
+ # class entry point - create a mindmap for a given path
52
+ def create_featuremap()
53
+ mindmap_path = @mindmap_path
54
+ if mindmap_path != "STDOUT"
55
+ while File.exists?(mindmap_path)
56
+ filename_parts = mindmap_path.split(".")
57
+ if filename_parts[0] =~ /-\d+$/
58
+ filename_parts = filename_parts[0].split("-")
59
+ mindmap_path = "#{filename_parts[0]}-#{filename_parts[1].to_i + 1}.mm"
60
+ else
61
+ mindmap_path = "#{filename_parts[0]}-1.mm"
62
+ end
63
+ end
64
+ if mindmap_path != @mindmap_path
65
+ @log.warn("given mindmap name is already in use, created #{mindmap_path}")
95
66
  end
96
- features = Dir.entries(features_path)
97
- rescue Exception
67
+ begin
68
+ IO.write("#{mindmap_path}","")
69
+ rescue Exception
70
+ @log.error("can't write to #{mindmap_path}")
71
+ @exit_status = 74
72
+ return
73
+ end
74
+ end
75
+ begin
76
+ directory_model = CukeModeler::Directory.new(@features_path)
77
+ @log.info "start reading features from dir #{@features_path}"
78
+ read_features(directory_model)
79
+ rescue Exception => e
98
80
  @log.error("can't access >>#{features_path}<< as feature dir")
81
+ @log.debug(e.message)
99
82
  @exit_status = 66
100
83
  return
101
84
  end
102
- @log.info "start reading features from dir #{features_path}"
103
- feature_count = 0
104
- scenario_count = 0
105
- features.each do |feature_file|
106
- #ignore files starting with .
107
- if feature_file =~ /^[^\.]/
108
- #look for features in only in .feature files
109
- if feature_file =~ /\.feature$/
110
- feature = File.read("#{features_path}#{feature_file}")
111
- feature.scan(/^\s*(Feature|Ability|Business Need):\s*(\S.*)$/) do |feature_type, feature_name|
112
- feature_node = @mindmap.add_node(feature_name, "feature", p_parent_node)
113
- feature_count += 1
114
- end
115
- feature.scan(/^\s*(Scenario|Scenario Outline):\s*(\S.*)$/) do |scenario_type, scenario_name|
116
- case scenario_type
117
- when "Scenario Outline" then @mindmap.add_node(scenario_name, "scenario_outline", feature_node)
118
- when "Scenario" then @mindmap.add_node(scenario_name, "scenario", feature_node)
119
- end
120
- scenario_count += 1
121
- end
122
- end
123
- # look for subdirs
124
- if File.directory?("#{features_path}#{feature_file}")
125
- # ignore step_definitions and support folders because those are used for code
126
- if feature_file != "step_definitions" && feature_file != "support"
127
- subdir_node = @mindmap.add_node(feature_file, "subdir", p_parent_node)
128
- read_features("#{features_path}#{feature_file}", subdir_node)
129
- end
85
+ if @exit_status == 0
86
+ if mindmap_path != "STDOUT"
87
+ mindmap_file = File.open(mindmap_path,"w")
88
+ mindmap_file.write(@mindmap.to_s)
89
+ mindmap_file.close
90
+ else
91
+ puts @mindmap.to_s
92
+ end
93
+ end
94
+ end
95
+
96
+ #TODO work in progress: use cuke modeler
97
+ def read_features(p_cm_directory, p_parent_node = nil)
98
+ feature_node = nil
99
+ p_cm_directory.feature_files.each do |feature_file|
100
+ feature_node = @mindmap.add_node(feature_file.feature.name, "feature", p_parent_node)
101
+ feature_file.feature.tests.each do |scenario|
102
+ if scenario.keyword == "Scenario"
103
+ @mindmap.add_node(scenario.name, "scenario", feature_node)
104
+ elsif scenario.keyword == "Scenario Outline"
105
+ @mindmap.add_node(scenario.name, "scenario_outline", feature_node)
130
106
  end
131
107
  end
132
108
  end
133
- @log.info "found #{feature_count} feature(s) and #{scenario_count} scenarios in dir #{features_path}"
109
+ p_cm_directory.directories.each do |sub_dir|
110
+ if sub_dir.name != "step_definitions" and sub_dir.name != "support"
111
+ subdir_node = @mindmap.add_node(sub_dir.name, "subdir", p_parent_node)
112
+ @log.info("add features from #{sub_dir.path}")
113
+ read_features(sub_dir, subdir_node)
114
+ end
115
+ end
134
116
  end
135
- end
136
117
 
118
+ end
137
119
  end
data/lib/mindmap.rb CHANGED
@@ -1,59 +1,61 @@
1
- class Mindmap
1
+ module Featuremap
2
+ class Mindmap
2
3
 
3
- def initialize(p_logger)
4
- @log = p_logger
5
- @nodes = []
6
- root_node = create_node("featuremap","root")
7
- @nodes.insert(0, root_node)
8
- end
9
-
10
- # convert mindmap object to string
11
- def to_s
12
- map = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
13
- map << "<map version=\"1.0.1\">\n"
14
- map << "<!-- To view this file, download free mind mapping software FreeMind from http://freemind.sourceforge.net -->\n"
15
- map << nodes_to_s(@nodes)
16
- map << "</map>\n"
17
- end
4
+ def initialize(p_logger)
5
+ @log = p_logger
6
+ @nodes = []
7
+ root_node = create_node("featuremap","root")
8
+ @nodes.insert(0, root_node)
9
+ end
18
10
 
19
- # create a new node
20
- def create_node(p_node_text, p_node_type)
21
- node = {"created" => Time.now.to_i, "id" => SecureRandom.uuid.gsub(/-/,''), "modified" => Time.now.to_i, "text" => p_node_text, "type" => p_node_type, "nodes" => []}
22
- end
11
+ # convert mindmap object to string
12
+ def to_s
13
+ map = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
14
+ map << "<map version=\"1.0.1\">\n"
15
+ map << "<!-- To view this file, download free mind mapping software FreeMind from http://freemind.sourceforge.net -->\n"
16
+ map << nodes_to_s(@nodes)
17
+ map << "</map>\n"
18
+ end
23
19
 
24
- # add a new node
25
- def add_node(p_node_text, p_node_type, p_parent_node = nil)
26
- new_node = create_node(p_node_text, p_node_type)
27
- # add new node on top level per default
28
- if p_parent_node.nil?
29
- p_parent_node = @nodes[0]
20
+ # create a new node
21
+ def create_node(p_node_text, p_node_type)
22
+ node = {"created" => Time.now.to_i, "id" => SecureRandom.uuid.gsub(/-/,''), "modified" => Time.now.to_i, "text" => p_node_text, "type" => p_node_type, "nodes" => []}
30
23
  end
31
- p_parent_node["nodes"].insert(0, new_node)
32
- return new_node
33
- end
34
24
 
35
- # turn hash of nodes into mindmap xml string
36
- def nodes_to_s(p_nodes, p_nodes_text="")
37
- nodes_text = p_nodes_text
38
- #@log.debug nodes_text
39
- p_nodes.each do |node|
40
- nodes_text << "<node CREATED=\"#{node["created"]}\" ID=\"#{node["type"]}_#{node["id"]}\" MODIFIED=\"#{node["modified"]}\" TEXT=\"#{node["text"]}\">\n"
41
- # add icons and fonts to nodes
42
- case node["type"]
43
- when "feature"
44
- nodes_text << "<font BOLD=\"true\" NAME=\"SansSerif\" SIZE=\"12\"/>"
45
- when "subdir"
46
- nodes_text << "<icon BUILTIN=\"folder\"/>\n"
47
- when "scenario_outline"
48
- nodes_text << "<icon BUILTIN=\"list\"/>\n"
25
+ # add a new node
26
+ def add_node(p_node_text, p_node_type, p_parent_node = nil)
27
+ new_node = create_node(p_node_text, p_node_type)
28
+ # add new node on top level per default
29
+ if p_parent_node.nil?
30
+ p_parent_node = @nodes[0]
49
31
  end
50
- # call function recursively for sublevel nodes
51
- if not node["nodes"].empty?
52
- nodes_to_s(node["nodes"], nodes_text)
32
+ p_parent_node["nodes"].insert(0, new_node)
33
+ return new_node
34
+ end
35
+
36
+ # turn hash of nodes into mindmap xml string
37
+ def nodes_to_s(p_nodes, p_nodes_text="")
38
+ nodes_text = p_nodes_text
39
+ #@log.debug nodes_text
40
+ p_nodes.each do |node|
41
+ nodes_text << "<node CREATED=\"#{node["created"]}\" ID=\"#{node["type"]}_#{node["id"]}\" MODIFIED=\"#{node["modified"]}\" TEXT=\"#{node["text"]}\">\n"
42
+ # add icons and fonts to nodes
43
+ case node["type"]
44
+ when "feature"
45
+ nodes_text << "<font BOLD=\"true\" NAME=\"SansSerif\" SIZE=\"12\"/>"
46
+ when "subdir"
47
+ nodes_text << "<icon BUILTIN=\"folder\"/>\n"
48
+ when "scenario_outline"
49
+ nodes_text << "<icon BUILTIN=\"list\"/>\n"
50
+ end
51
+ # call function recursively for sublevel nodes
52
+ if not node["nodes"].empty?
53
+ nodes_to_s(node["nodes"], nodes_text)
54
+ end
55
+ nodes_text << "</node>\n"
53
56
  end
54
- nodes_text << "</node>\n"
57
+ return nodes_text
55
58
  end
56
- return nodes_text
57
- end
58
59
 
60
+ end
59
61
  end
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Featuremap
2
- VERSION = '0.0.2'
2
+ VERSION = '0.1.0'
3
3
  end
metadata CHANGED
@@ -1,18 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: featuremap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthias Carell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-13 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2019-07-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: cuke_modeler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  description: |-
14
28
  Featurmaps helps you to visualize the functionality of your \
15
- application by presenting your features as a mindmap
29
+ application by turning your Gherkin features into a mindmap
16
30
  email:
17
31
  - rumpelcenter-featuremap at yahoo.com
18
32
  executables:
@@ -37,7 +51,8 @@ files:
37
51
  - lib/mindmap.rb
38
52
  - lib/version.rb
39
53
  homepage: https://github.com/mckryton/featuremap
40
- licenses: []
54
+ licenses:
55
+ - MIT
41
56
  metadata: {}
42
57
  post_install_message:
43
58
  rdoc_options: []
@@ -54,8 +69,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
54
69
  - !ruby/object:Gem::Version
55
70
  version: '0'
56
71
  requirements: []
57
- rubyforge_project: featuremap
58
- rubygems_version: 2.6.14
72
+ rubyforge_project:
73
+ rubygems_version: 2.7.7
59
74
  signing_key:
60
75
  specification_version: 4
61
76
  summary: A script to convert Gherkin features into a mindmap