attractor 1.2.0 → 2.0.4

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.
@@ -17,6 +17,14 @@ module Attractor
17
17
  [:no_open_browser, type: :boolean],
18
18
  [:ci, type: :boolean]]
19
19
 
20
+ desc "version", "Prints Attractor's version information"
21
+ map %w(-v --version) => :version
22
+ def version
23
+ puts "Attractor version #{Attractor::VERSION}"
24
+ rescue RuntimeError => e
25
+ puts "Runtime error: #{e.message}"
26
+ end
27
+
20
28
  desc 'calc', 'Calculates churn and complexity for all ruby files in current directory'
21
29
  shared_options.each do |shared_option|
22
30
  option(*shared_option)
@@ -0,0 +1,18 @@
1
+ module Attractor
2
+ # from https://github.com/prontolabs/pronto/blob/master/lib/pronto/gem_names.rb
3
+ class GemNames
4
+ def to_a
5
+ gems.map { |gem| gem.name.sub(/^attractor-/, '') }.uniq.sort
6
+ end
7
+
8
+ private
9
+
10
+ def gems
11
+ Gem::Specification.find_all.select do |gem|
12
+ gem.name =~ /^attractor-/
13
+ end.reject do |gem|
14
+ gem.name =~ /attractor-rails/
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,12 @@
1
+ module Attractor
2
+ class RegistryEntry
3
+ attr_reader :type, :detector_class, :calculator_class
4
+
5
+ def initialize(type:, detector_class:, calculator_class:)
6
+ @type = type
7
+ @detector_class = detector_class
8
+ @calculator_class = calculator_class
9
+ end
10
+ end
11
+ end
12
+
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'descriptive_statistics/safe'
4
4
  require 'fileutils'
5
+ require 'forwardable'
5
6
  require 'launchy'
6
7
  require 'tilt'
7
8
 
@@ -27,7 +28,8 @@ module Attractor
27
28
  raise 'There was a problem gathering churn changes'
28
29
  end
29
30
 
30
- def suggestions(quantile)
31
+ def suggestions(quantile:, type: 'rb')
32
+ @suggester.values = values(type: type)
31
33
  @suggestions = @suggester.suggest(quantile)
32
34
  @suggestions
33
35
  end
@@ -40,5 +42,12 @@ module Attractor
40
42
  def render
41
43
  'Attractor'
42
44
  end
45
+
46
+ def values(type: 'rb')
47
+ @values = @calculators[type].calculate
48
+ @values
49
+ rescue NoMethodError => e
50
+ puts "No calculator for type #{type}"
51
+ end
43
52
  end
44
53
  end
@@ -22,8 +22,7 @@ module Attractor
22
22
  if @calculators.size > 1
23
23
  @calculators.each do |calc|
24
24
  @short_type = calc.first
25
- @values = calc.last.calculate
26
- suggester = Suggester.new(values)
25
+ suggester = Suggester.new(values(type: @short_type))
27
26
  @suggestions = suggester.suggest
28
27
 
29
28
  File.open("./attractor_output/javascripts/index.#{@short_type}.js", 'w') { |file| file.write(javascript) }
@@ -32,7 +32,8 @@ module Attractor
32
32
 
33
33
  get '/suggestions' do
34
34
  threshold = params[:t] || 95
35
- @reporter.suggestions(threshold).to_json
35
+ type = params[:type] || 'rb'
36
+ @reporter.suggestions(quantile: threshold, type: type).to_json
36
37
  end
37
38
 
38
39
  error NoMethodError do
@@ -70,12 +71,5 @@ module Attractor
70
71
 
71
72
  Rack::Handler::WEBrick.run Rack::LiveReload.new(app), Port: 7890
72
73
  end
73
-
74
- def values(type: 'rb')
75
- @values = @calculators[type].calculate
76
- @values
77
- rescue NoMethodError => e
78
- puts "No calculator for type #{type}"
79
- end
80
74
  end
81
75
  end
@@ -3,6 +3,8 @@
3
3
  module Attractor
4
4
  # makes suggestions for refactorings
5
5
  class Suggester
6
+ attr_accessor :values
7
+
6
8
  def initialize(values)
7
9
  @values = values || []
8
10
  end
@@ -1,3 +1,3 @@
1
1
  module Attractor
2
- VERSION = "1.2.0"
2
+ VERSION = "2.0.4"
3
3
  end
@@ -1186,9 +1186,9 @@
1186
1186
  "dev": true
1187
1187
  },
1188
1188
  "acorn": {
1189
- "version": "6.3.0",
1190
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz",
1191
- "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==",
1189
+ "version": "7.1.1",
1190
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz",
1191
+ "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==",
1192
1192
  "dev": true
1193
1193
  },
1194
1194
  "acorn-jsx": {
@@ -2833,14 +2833,6 @@
2833
2833
  "acorn": "^7.0.0",
2834
2834
  "acorn-jsx": "^5.0.2",
2835
2835
  "eslint-visitor-keys": "^1.1.0"
2836
- },
2837
- "dependencies": {
2838
- "acorn": {
2839
- "version": "7.1.0",
2840
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz",
2841
- "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==",
2842
- "dev": true
2843
- }
2844
2836
  }
2845
2837
  },
2846
2838
  "esprima": {
@@ -6731,6 +6723,12 @@
6731
6723
  "webpack-sources": "^1.4.1"
6732
6724
  },
6733
6725
  "dependencies": {
6726
+ "acorn": {
6727
+ "version": "6.4.1",
6728
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
6729
+ "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
6730
+ "dev": true
6731
+ },
6734
6732
  "serialize-javascript": {
6735
6733
  "version": "1.9.1",
6736
6734
  "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attractor
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julian Rubisch
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-15 00:00:00.000000000 Z
11
+ date: 2020-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: churn
@@ -150,6 +150,34 @@ dependencies:
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: attractor-javascript
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: attractor-ruby
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
153
181
  - !ruby/object:Gem::Dependency
154
182
  name: autoprefixer-rails
155
183
  requirement: !ruby/object:Gem::Requirement
@@ -351,17 +379,17 @@ files:
351
379
  - attractor.gemspec
352
380
  - bin/console
353
381
  - bin/setup
382
+ - bin/standardize
383
+ - bin/test
354
384
  - dist/calculator.bundle.js
355
385
  - exe/attractor
356
386
  - lib/attractor.rb
357
387
  - lib/attractor/calculators/base_calculator.rb
358
- - lib/attractor/calculators/js_calculator.rb
359
- - lib/attractor/calculators/ruby_calculator.rb
360
388
  - lib/attractor/cli.rb
361
389
  - lib/attractor/detectors/base_detector.rb
362
- - lib/attractor/detectors/js_detector.rb
363
- - lib/attractor/detectors/ruby_detector.rb
364
390
  - lib/attractor/duration_parser.rb
391
+ - lib/attractor/gem_names.rb
392
+ - lib/attractor/registry_entry.rb
365
393
  - lib/attractor/reporters/.keep
366
394
  - lib/attractor/reporters/base_reporter.rb
367
395
  - lib/attractor/reporters/console_reporter.rb
@@ -382,7 +410,7 @@ metadata:
382
410
  source_code_uri: https://github.com/julianrubisch/attractor
383
411
  bug_tracker_uri: https://github.com/julianrubisch/attractor/issues
384
412
  changelog_uri: https://github.com/julianrubisch/attractor/CHANGELOG.md
385
- post_install_message:
413
+ post_install_message:
386
414
  rdoc_options: []
387
415
  require_paths:
388
416
  - lib
@@ -397,8 +425,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
397
425
  - !ruby/object:Gem::Version
398
426
  version: '0'
399
427
  requirements: []
400
- rubygems_version: 3.0.3
401
- signing_key:
428
+ rubygems_version: 3.1.2
429
+ signing_key:
402
430
  specification_version: 4
403
431
  summary: Churn vs Complexity Chart Generator
404
432
  test_files: []
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Attractor
4
- class JsCalculator < BaseCalculator
5
- def initialize(file_prefix: '', minimum_churn_count: 3, start_ago: 365 * 5)
6
- super(file_prefix: file_prefix, file_extension: '(js|jsx)', minimum_churn_count: minimum_churn_count, start_ago: start_ago)
7
- @type = "JavaScript"
8
- end
9
-
10
- def calculate
11
- super do |change|
12
- complexity, details = JSON.parse(`node #{__dir__}/../../../dist/calculator.bundle.js #{Dir.pwd}/#{change[:file_path]}`)
13
-
14
- [complexity, details]
15
- end
16
- end
17
- end
18
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'flog'
4
-
5
- module Attractor
6
- class RubyCalculator < BaseCalculator
7
- def initialize(file_prefix: '', minimum_churn_count: 3, start_ago: 365 * 5)
8
- super(file_prefix: file_prefix, file_extension: 'rb', minimum_churn_count: minimum_churn_count, start_ago: start_ago)
9
- @type = "Ruby"
10
- end
11
-
12
- def calculate
13
- super do |change|
14
- flogger = Flog.new(all: true)
15
- flogger.flog(change[:file_path])
16
- complexity = flogger.total_score
17
- details = flogger.totals
18
- [complexity, details]
19
- end
20
- end
21
- end
22
- end
@@ -1,11 +0,0 @@
1
- module Attractor
2
- class JsDetector < BaseDetector
3
- def detect
4
- package_json_exists?
5
- end
6
-
7
- def package_json_exists?
8
- File.exist? File.expand_path("package.json", Dir.pwd)
9
- end
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- module Attractor
2
- class RubyDetector < BaseDetector
3
- def detect
4
- gemfile_exists?
5
- end
6
-
7
- def gemfile_exists?
8
- File.exist? File.expand_path("Gemfile", Dir.pwd)
9
- end
10
- end
11
- end