featuremap 0.0.2 → 0.1.0

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