swoop_report 0.3 → 0.3.1

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
2
  SHA1:
3
- metadata.gz: 7347316477eae37b04d727c1a56b84d2c160d41e
4
- data.tar.gz: ec21145456ea9849ebfe6170eb9c648b237fbcd7
3
+ metadata.gz: b0922a69f3164be892c109b44061f09ac31f06c8
4
+ data.tar.gz: bebe25bb3b4ec903c1aee78797f6cf8f3a119337
5
5
  SHA512:
6
- metadata.gz: dee8793eb6f7ef23b45690861fbc47a37e2a336c278817a9dd27e5d588568b89eaf8bc4b325c0cbf22a80177f3fda6677fa69372a54b6c0c7b640271c9cd3d6b
7
- data.tar.gz: 4ed060ce4993d921243e34c03b945cd0b31b54b4c3b07d8ea0cbfe0cfe636dbd9ffce53a53cf2e7c642b9b327cb423091b7b8f730a5e66fe7abfcc0d3d096790
6
+ metadata.gz: 8559e7239f34d6ec739ae95b49c130d8587faa5680303fa03c782064a2bbbd62f99e201bce7395c491048eb57cfb7a9634d921d13b8aafd2ee6e4b5bd5ce8460
7
+ data.tar.gz: 225f1f3ac280592afe588670c2fb2f0f585f6383ff25254ba3e4179963e1e9cdb89f31f90f050c2e38fcfa8f1d2c177ffba13e6da54441d28d98b59dab00dd78
data/CHANGELOG.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # CHANGELOG
2
2
 
3
- ## v0.2.3
3
+ ## v0.3.1
4
+
5
+ * Add line comparison
6
+ * Add file comparison
7
+
8
+ ## v0.3
4
9
 
5
10
  * Fix path for chart template file
6
11
  * Checkout to active branch when error happens
data/Guardfile ADDED
@@ -0,0 +1,14 @@
1
+ guard :rspec, cmd: "bundle exec rspec" do
2
+ require "guard/rspec/dsl"
3
+ dsl = Guard::RSpec::Dsl.new(self)
4
+
5
+ # RSpec files
6
+ rspec = dsl.rspec
7
+ watch(rspec.spec_helper) { rspec.spec_dir }
8
+ watch(rspec.spec_support) { rspec.spec_dir }
9
+ watch(rspec.spec_files)
10
+
11
+ # Ruby files
12
+ ruby = dsl.ruby
13
+ watch(ruby.lib_files) { rspec.spec_dir }
14
+ end
data/lib/swoop.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  require "swoop/version"
2
2
  require "swoop/project"
3
3
  require "swoop/entity"
4
- require "swoop/entity_parser"
4
+ require "swoop/file_parser"
5
+ require "swoop/file_info"
5
6
  require "swoop/report"
6
7
  require "swoop/time_machine"
7
8
 
@@ -57,8 +58,8 @@ module Swoop
57
58
  project = Project.new(@project_path, @dir_path)
58
59
  delorean = TimeMachine.new(project, time_machine_options)
59
60
  delorean.travel do |proj, name, date|
60
- entities = EntityParser.parse_files(proj.filepaths)
61
- reports << Report.new(entities, name, date)
61
+ file_infos = FileParser.parse(proj.filepaths)
62
+ reports << Report.new(file_infos, name, date)
62
63
  end
63
64
 
64
65
  reports
@@ -0,0 +1,50 @@
1
+ module Swoop
2
+
3
+ module Lang
4
+ NONE = 0
5
+ OBJC = 1
6
+ SWIFT = 2
7
+ end
8
+
9
+ class FileInfo
10
+
11
+ attr_reader :filepath, :language, :line_count, :classes, :structs, :extensions
12
+
13
+ def initialize(filepath, language, line_count, classes, structs, extensions)
14
+ @filepath = filepath
15
+ @language = language
16
+ @line_count = line_count
17
+ @classes = classes
18
+ @structs = structs
19
+ @extensions = extensions
20
+ end
21
+
22
+ def swift?
23
+ language == Lang::SWIFT
24
+ end
25
+
26
+ def objc?
27
+ language == Lang::OBJC
28
+ end
29
+
30
+ def entities
31
+ @entities ||= begin
32
+ [ *classes, *structs, *extensions ]
33
+ end
34
+ end
35
+
36
+ def hash
37
+ filepath.hash
38
+ end
39
+
40
+ def eql?(comparee)
41
+ self == comparee
42
+ end
43
+
44
+ def ==(comparee)
45
+ self.filepath == comparee.filepath
46
+ end
47
+
48
+ end
49
+
50
+ end
@@ -2,31 +2,44 @@ require 'json'
2
2
 
3
3
  module Swoop
4
4
 
5
- class EntityParser
5
+ class FileParser
6
6
 
7
- attr_reader :entities
7
+ attr_reader :entityInfos
8
8
 
9
- def self.parse_files(filepaths)
10
- filepaths
11
- .map { |p| self.new(p).entities }
12
- .flatten
13
- .uniq
9
+ def self.parse(filepaths)
10
+ filepaths.map { |p| self.new(p).entityInfos }.compact.uniq
14
11
  end
15
12
 
16
13
  def initialize(filepath)
17
14
  @filepath = filepath
18
15
  end
19
16
 
20
- def entities
21
- @entitites ||= begin
22
- return parse_swift if File.extname(@filepath) == ".swift"
23
- return parse_objc if File.extname(@filepath) == ".h"
24
- []
17
+ def entityInfos
18
+ @entityInfos ||= begin
19
+ return parse_swift if swift_file?
20
+ return parse_objc if objc_header_file? || objc_implementation_file?
21
+ nil
25
22
  end
26
23
  end
27
24
 
28
25
  private
29
26
 
27
+ def swift_file?
28
+ File.extname(@filepath) == ".swift"
29
+ end
30
+
31
+ def objc_header_file?
32
+ File.extname(@filepath) == ".h"
33
+ end
34
+
35
+ def objc_implementation_file?
36
+ File.extname(@filepath) == ".m"
37
+ end
38
+
39
+ def lines_count
40
+ File.new(@filepath).readlines.size
41
+ end
42
+
30
43
  LANG_SWIFT = 'swift'
31
44
  LANG_OBJC = 'objc'
32
45
  TYPE_CLASS = 'class'
@@ -42,7 +55,7 @@ module Swoop
42
55
  structs = filter(SWIFT_STRUCT).map { |e| Entity.new(e, LANG_SWIFT, TYPE_STRUCT) }
43
56
  extensions = filter(SWIFT_EXT).map { |e| Entity.new(e, LANG_SWIFT, TYPE_EXTENSION) }
44
57
 
45
- [ *classes, *structs, *extensions ]
58
+ FileInfo.new(@filepath, Lang::SWIFT, lines_count, classes, structs, extensions)
46
59
  end
47
60
 
48
61
  OBJC_CLASS = '@interface\s*(\w+)\s*:'
@@ -50,6 +63,9 @@ module Swoop
50
63
  OBJC_STRUCT ='typedef\s*struct\s*{.*?}\s*(\w*)'
51
64
  OBJC_STRUCT2 = 'struct\s*(\w+)'
52
65
  def parse_objc
66
+ # Only counting the lines and the file
67
+ return FileInfo.new(@filepath, Lang::OBJC, lines_count, [], [], []) if objc_implementation_file?
68
+
53
69
  classes = filter(OBJC_CLASS).map { |e| Entity.new(e, LANG_OBJC, TYPE_CLASS) }
54
70
  categories = filter(OBJC_CATEGORY, false)
55
71
  .map { |exts|
@@ -59,7 +75,7 @@ module Swoop
59
75
  structs = (filter(OBJC_STRUCT, true, Regexp::MULTILINE) + filter(OBJC_STRUCT2))
60
76
  .map { |e| Entity.new(e, LANG_OBJC, TYPE_STRUCT) }
61
77
 
62
- [ *classes, *structs, *categories ]
78
+ FileInfo.new(@filepath, Lang::OBJC, lines_count, classes, structs, categories)
63
79
  end
64
80
 
65
81
  def file_content
@@ -77,6 +93,7 @@ module Swoop
77
93
  return filtered unless should_flatten
78
94
  filtered.flatten
79
95
  end
96
+
80
97
  end
81
98
 
82
99
  end
@@ -22,10 +22,10 @@ module Swoop
22
22
  def csv
23
23
  @csv ||= begin
24
24
  lines = []
25
- lines << "name,date,swift class,swift class %,objc class,objc class %,total class,swift struct,swift struct %,objc struct,objc struct %,total struct,swift extension,swift extension %,objc extension,objc extension %,total extension"
25
+ lines << "name,date,swift lines,swift lines %,objc lines,objc lines %,total lines,swift files,swift files %,objc files,objc files %,total files,swift class,swift class %,objc class,objc class %,total class,swift struct,swift struct %,objc struct,objc struct %,total struct,swift extension,swift extension %,objc extension,objc extension %,total extension"
26
26
 
27
27
  reports.each do |report|
28
- lines << "#{report.name},#{report.date},#{report.swift_classes_count},#{'%.02f' % report.swift_classes_percentage},#{report.objc_classes_count},#{'%.02f' % report.objc_classes_percentage},#{report.classes_count},#{report.swift_structs_count},#{'%.02f' % report.swift_structs_percentage},#{report.objc_structs_count},#{'%.02f' % report.objc_structs_percentage},#{report.structs_count},#{report.swift_extensions_count},#{'%.02f' % report.swift_extensions_percentage},#{report.objc_extensions_count},#{'%.02f' % report.objc_extensions_percentage},#{report.extensions_count}"
28
+ lines << "#{report.name},#{report.date},#{report.swift_lines_count},#{'%.02f' % report.swift_lines_percentage},#{report.objc_lines_count},#{'%.02f' % report.objc_lines_percentage},#{report.lines_count},#{report.swift_files_count},#{'%.02f' % report.swift_files_percentage},#{report.objc_files_count},#{'%.02f' % report.objc_files_percentage},#{report.files_count},#{report.swift_classes_count},#{'%.02f' % report.swift_classes_percentage},#{report.objc_classes_count},#{'%.02f' % report.objc_classes_percentage},#{report.classes_count},#{report.swift_structs_count},#{'%.02f' % report.swift_structs_percentage},#{report.objc_structs_count},#{'%.02f' % report.objc_structs_percentage},#{report.structs_count},#{report.swift_extensions_count},#{'%.02f' % report.swift_extensions_percentage},#{report.objc_extensions_count},#{'%.02f' % report.objc_extensions_percentage},#{report.extensions_count}"
29
29
  end
30
30
 
31
31
  lines.join("\n")
@@ -10,10 +10,35 @@ module Swoop
10
10
 
11
11
  private
12
12
 
13
+ def f(lines)
14
+ return lines if lines < 1_000
15
+
16
+ count_in_thousand = Integer(Float(lines) / Float(1_000))
17
+ "#{count_in_thousand}K"
18
+ end
19
+
13
20
  def table
14
- headings = ["name", "date", "swift\nclass", "swift\nclass (%)", "objc\nclass", "objc\nclass (%)", "total\nclass", "swift\nstruct", "swift\nstruct(%)", "objc\nstruct", "objc\nstruct(%)", "total\nstruct", "swift\next", "swift\next(%)", "objc\next", "objc\next(%)", "total\next"]
21
+ headings = [
22
+ "name", "date",
23
+ "swift\nfiles (%)", "objc\nfiles (%)",
24
+ "swift\nlines (%)", "objc\nlines (%)",
25
+ "swift\nclass (%)", "objc\nclass (%)",
26
+ "swift\nstruct(%)", "objc\nstruct(%)",
27
+ "swift\next(%)", "objc\next(%)"
28
+ ]
15
29
  rows = reports.map do |r|
16
- [r.name,r.date,r.swift_classes_count,"#{'%.02f' % r.swift_classes_percentage}",r.objc_classes_count,"#{'%.02f' % r.objc_classes_percentage}",r.classes_count,r.swift_structs_count,"#{'%.02f' % r.swift_structs_percentage}",r.objc_structs_count,"#{'%.02f' % r.objc_structs_percentage}",r.structs_count,r.swift_extensions_count,"#{'%.02f' % r.swift_extensions_percentage}",r.objc_extensions_count,"#{'%.02f' % r.objc_extensions_percentage}",r.extensions_count]
30
+ [r.name,r.date,
31
+ "#{'%.02f' % r.swift_files_percentage} (#{f r.swift_files_count}/#{f r.files_count})",
32
+ "#{'%.02f' % r.objc_files_percentage} (#{f r.objc_files_count}/#{f r.files_count})",
33
+ "#{'%.02f' % r.swift_lines_percentage} (#{f r.swift_lines_count}/#{f r.lines_count})",
34
+ "#{'%.02f' % r.objc_lines_percentage} (#{f r.objc_lines_count}/#{f r.lines_count})",
35
+ "#{'%.02f' % r.swift_classes_percentage} (#{r.swift_classes_count}/#{r.classes_count})",
36
+ "#{'%.02f' % r.objc_classes_percentage} (#{r.objc_classes_count}/#{r.classes_count})",
37
+ "#{'%.02f' % r.swift_structs_percentage} (#{r.swift_structs_count}/#{r.structs_count})",
38
+ "#{'%.02f' % r.objc_structs_percentage} (#{r.objc_structs_count}/#{r.structs_count})",
39
+ "#{'%.02f' % r.swift_extensions_percentage} (#{r.swift_extensions_count}/#{r.extensions_count})",
40
+ "#{'%.02f' % r.objc_extensions_percentage} (#{r.objc_extensions_count}/#{r.extensions_count})",
41
+ ]
17
42
  end
18
43
 
19
44
  @table ||= Terminal::Table.new(:title => title, :headings => headings, :rows => rows)
data/lib/swoop/report.rb CHANGED
@@ -4,8 +4,8 @@ module Swoop
4
4
 
5
5
  attr_reader :name
6
6
 
7
- def initialize(entities, name = '', date = Time.now)
8
- @entities = entities
7
+ def initialize(file_infos, name = '', date = Time.now)
8
+ @file_infos = file_infos
9
9
  @date = date
10
10
 
11
11
  if name.nil? || name == ''
@@ -19,6 +19,52 @@ module Swoop
19
19
  @date.strftime("%d-%m-%Y")
20
20
  end
21
21
 
22
+ # Files
23
+ def files_count
24
+ @files_count ||= @file_infos.count
25
+ end
26
+
27
+ def swift_files_count
28
+ @swift_files_count ||= swift_file_infos.count
29
+ end
30
+
31
+ def objc_files_count
32
+ @objc_files_count ||= objc_file_infos.count
33
+ end
34
+
35
+ def swift_files_percentage
36
+ return 0 if files_count == 0
37
+ (swift_files_count.to_f / files_count) * 100
38
+ end
39
+
40
+ def objc_files_percentage
41
+ return 0 if files_count == 0
42
+ (objc_files_count.to_f / files_count) * 100
43
+ end
44
+
45
+ # Lines
46
+ def lines_count
47
+ @lines_count ||= @file_infos.map(&:line_count).reduce(:+)
48
+ end
49
+
50
+ def swift_lines_count
51
+ @swift_lines_count ||= swift_file_infos.map(&:line_count).reduce(:+)
52
+ end
53
+
54
+ def objc_lines_count
55
+ @objc_lines_count ||= objc_file_infos.map(&:line_count).reduce(:+)
56
+ end
57
+
58
+ def swift_lines_percentage
59
+ return 0 if lines_count == 0
60
+ (swift_lines_count.to_f / lines_count) * 100
61
+ end
62
+
63
+ def objc_lines_percentage
64
+ return 0 if lines_count == 0
65
+ (objc_lines_count.to_f / lines_count) * 100
66
+ end
67
+
22
68
  # Classes
23
69
  def classes_count
24
70
  classes.count
@@ -90,56 +136,50 @@ module Swoop
90
136
  (objc_extensions_count.to_f / extensions_count) * 100
91
137
  end
92
138
 
93
- def to_s
94
- "Class | swift : #{swift_classes_count} (#{'%.02f' % swift_classes_percentage}%) , objc : #{objc_classes_count} (#{'%.02f' % objc_classes_percentage}%), total: #{classes_count} \n" +
95
- "Structs | swift : #{swift_structs_count} (#{'%.02f' % swift_structs_percentage}%) , objc : #{objc_structs_count} (#{'%.02f' % objc_structs_percentage}%), total: #{structs_count} \n" +
96
- "Extensions | swift : #{swift_extensions_count} (#{'%.02f' % swift_extensions_percentage}%) , objc : #{objc_extensions_count} (#{'%.02f' % objc_extensions_percentage}%), total: #{extensions_count}"
97
- end
98
-
99
139
  private
100
140
 
101
141
  def classes
102
- @classes ||= @entities.select(&:class?)
142
+ @classes ||= @file_infos.flat_map(&:classes)
103
143
  end
104
144
 
105
145
  def structs
106
- @structs ||= @entities.select(&:struct?)
146
+ @structs ||= @file_infos.flat_map(&:structs)
107
147
  end
108
148
 
109
149
  def extensions
110
- @extensions ||= @entities.select(&:extension?)
150
+ @extensions ||= @file_infos.flat_map(&:extensions).uniq
111
151
  end
112
152
 
113
- def swift_entities
114
- @swift_entities ||= @entities.select(&:swift?)
153
+ def swift_file_infos
154
+ @swift_file_infos ||= @file_infos.select(&:swift?)
115
155
  end
116
156
 
117
157
  def swift_classes
118
- @swift_classes ||= swift_entities.select(&:class?)
158
+ @swift_classes ||= swift_file_infos.flat_map(&:classes)
119
159
  end
120
160
 
121
161
  def swift_structs
122
- @swift_structs ||= swift_entities.select(&:struct?)
162
+ @swift_structs ||= swift_file_infos.flat_map(&:structs)
123
163
  end
124
164
 
125
165
  def swift_extensions
126
- @swift_extensions ||= swift_entities.select(&:extension?)
166
+ @swift_extensions ||= swift_file_infos.flat_map(&:extensions).uniq
127
167
  end
128
168
 
129
- def objc_entities
130
- @objc_entities ||= @entities.select(&:objc?)
169
+ def objc_file_infos
170
+ @objc_file_infos ||= @file_infos.select(&:objc?)
131
171
  end
132
172
 
133
173
  def objc_classes
134
- @objc_classes ||= objc_entities.select(&:class?)
174
+ @objc_classes ||= objc_file_infos.flat_map(&:classes)
135
175
  end
136
176
 
137
177
  def objc_structs
138
- @objc_structs ||= objc_entities.select(&:struct?)
178
+ @objc_structs ||= objc_file_infos.flat_map(&:structs)
139
179
  end
140
180
 
141
181
  def objc_extensions
142
- @objc_extensions ||= objc_entities.select(&:extension?)
182
+ @objc_extensions ||= objc_file_infos.flat_map(&:extensions).uniq
143
183
  end
144
184
  end
145
185
  end
data/lib/swoop/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Swoop
2
- VERSION = "0.3"
2
+ VERSION = "0.3.1"
3
3
  end
Binary file
data/swoop.gemspec CHANGED
@@ -22,6 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency "rspec", "~> 3.0"
23
23
  spec.add_development_dependency "pry", "~> 0.10.3"
24
24
  spec.add_development_dependency "coveralls"
25
+ spec.add_development_dependency "guard-rspec"
25
26
 
26
27
  spec.add_runtime_dependency "thor", "~> 0.19"
27
28
  spec.add_runtime_dependency "xcodeproj", "~> 1.2"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: swoop_report
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.3'
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ikhsan Assaat
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-05 00:00:00.000000000 Z
11
+ date: 2017-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: guard-rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: thor
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -150,6 +164,7 @@ files:
150
164
  - ".travis.yml"
151
165
  - CHANGELOG.md
152
166
  - Gemfile
167
+ - Guardfile
153
168
  - LICENSE.txt
154
169
  - README.md
155
170
  - Rakefile
@@ -158,7 +173,8 @@ files:
158
173
  - exe/swoop
159
174
  - lib/swoop.rb
160
175
  - lib/swoop/entity.rb
161
- - lib/swoop/entity_parser.rb
176
+ - lib/swoop/file_info.rb
177
+ - lib/swoop/file_parser.rb
162
178
  - lib/swoop/project.rb
163
179
  - lib/swoop/renderer/chart_renderer.rb
164
180
  - lib/swoop/renderer/chart_renderer/chart.html.erb