bonobot 0.0.3 → 0.0.5

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
  SHA256:
3
- metadata.gz: 5e9eaa44c2e0f1388d2fae379becd62eee2cabdbc6d9cdb63d3a13e240fad180
4
- data.tar.gz: 33cf0a5fb51ca3e3c277dcc0cb0f8f0c83103deb154f35549d85580252835c67
3
+ metadata.gz: 06ccb8b5b500887ae4d039b56d507d9c4c3b949ebf82c0b9213f154689832354
4
+ data.tar.gz: 725a0102e557cde864e780396d2ac713ac6446059ab049a9c8acd555c9ea4e00
5
5
  SHA512:
6
- metadata.gz: 935bc736b1bfa50db8ed5ff9415feac5b0e8870e39c658a0234ce11e02adc95cba6ce1435580f1dad90a67e3ac704022eb17eb72631d9a95de19dc42cedbf04c
7
- data.tar.gz: 17cf099a01f76279f4cb22cd0cab31eadc513ec3ac3e32c5a9dec468956cd0bf100a424a080471fccf2a57fe9a9d4f46a1c39057b752e4ce60a36f1b2bcf4727
6
+ metadata.gz: 108229c0e785c832dbc0cc727348b6586ca860d110bf06e8f300b3658b9774c1edc15de024e63f0877328846c682484697998db3633422ea8e95d9ee9f2f480d
7
+ data.tar.gz: 749c8b17db41e4c317dbaf5adca0ea13d770f09345e8fc787c7121c34d50c76a6f2eb357c42d4483189170e30e92f8a1d686651cf4b73151f82dffd569b0f54e
data/Rakefile CHANGED
@@ -7,6 +7,7 @@ rescue LoadError
7
7
  end
8
8
 
9
9
  require "rdoc/task"
10
+ require "rspec/core/rake_task"
10
11
 
11
12
  RDoc::Task.new(:rdoc) do |rdoc|
12
13
  rdoc.rdoc_dir = "rdoc"
@@ -20,10 +21,8 @@ require "bundler/gem_tasks"
20
21
 
21
22
  require "rake/testtask"
22
23
 
23
- Rake::TestTask.new(:test) do |t|
24
- t.libs << "test"
25
- t.pattern = "test/**/*_test.rb"
26
- t.verbose = false
24
+ Rake::TestTask.new(:test) do |_t|
25
+ RSpec::Core::RakeTask.new(:spec)
27
26
  end
28
27
 
29
28
  task default: :test
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EnginesFiles
4
+ def self.files
5
+ @files ||= ::Rails::Engine.subclasses.each_with_object({}) do |klass, hash|
6
+ paths = Dir.glob("#{klass.instance.root}/app/**/*.{erb,rb}")
7
+ next if paths.empty?
8
+
9
+ hash[engine_to_name(klass)] = engine_paths(paths)
10
+ end
11
+ end
12
+
13
+ def self.engine_to_name(engine_class)
14
+ if engine_class.respond_to?(:railtie_namespace) && engine_class.railtie_namespace
15
+ engine_class.railtie_namespace.to_s.split("::").map(&:underscore).join("/")
16
+ else
17
+ engine_class.engine_name.sub("_engine", "")
18
+ end
19
+ end
20
+
21
+ def self.engine_paths(paths)
22
+ paths.each_with_object({}) do |path, hash|
23
+ _name, *short_path = path.sub(gems_dir, "").split("/")
24
+ hash[short_path.join("/")] = { path: path, fingerprint: fingerprint(path) }
25
+ end
26
+ end
27
+
28
+ def self.gems_dir
29
+ @gems_dir ||= "#{Bundler.rubygems.gem_dir}/gems/"
30
+ end
31
+
32
+ def self.fingerprint(path)
33
+ Digest::MD5.hexdigest(File.read(path))
34
+ end
35
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LocalFiles
4
+ def self.files
5
+ @files ||= Dir.glob(::Rails.root.join("app", "**", "*.{erb,rb}")).map { |path| path.sub("#{::Rails.root}/", "") }.each_with_object({}) do |path, hash|
6
+ hash[path] = read_annotation(path)
7
+ end
8
+ end
9
+
10
+ def self.read_annotation(path)
11
+ File.readlines(path).map do |line|
12
+ line.sub(/# bonobot_fingerprint:/, "").sub("<%", "").sub("%>", "").strip if line.match?(/# bonobot_fingerprint:/) || line.match?(/<%# bonobot_fingerprint:/)
13
+ end.compact.first.presence
14
+ end
15
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overloads
4
+ def self.files
5
+ @files ||= LocalFiles.files.each_with_object({}) do |(path, fingerprint), hash|
6
+ EnginesFiles.files.keys.each do |engine_name|
7
+ next unless path.include? engine_name
8
+
9
+ source_path = EnginesFiles.files[engine_name].fetch(path, nil)
10
+ next unless source_path
11
+
12
+ result = [engine_name, source_path.merge(short_path: path)]
13
+
14
+ key = status_key(source_path[:fingerprint], fingerprint)
15
+ if hash[key].nil?
16
+ hash[key] = [result]
17
+ else
18
+ hash[key] << result
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ def self.status_key(source_fingerprint, target_fingerprint)
25
+ return :up_to_date if source_fingerprint == target_fingerprint
26
+ return :missing if target_fingerprint.nil?
27
+
28
+ :out_of_date
29
+ end
30
+
31
+ def self.status(status)
32
+ files.fetch(status, [])
33
+ end
34
+ end
@@ -5,119 +5,42 @@ require "json"
5
5
  module Bonobot
6
6
  class Status
7
7
  def self.generate
8
- puts "#####"
8
+ puts "-----"
9
9
  puts "🙈 🙉 🙊 Bonobot 🙈 🙉 🙊"
10
10
  puts "-----"
11
- puts "🛠 Generating status.json"
12
- File.write("status.json", JSON.pretty_generate({ rails_files: rails_files, engines_files: engines_files, overloads: overloads }))
11
+ puts "🛠 Generating status"
12
+ File.write("status.json", JSON.pretty_generate({ rails_files: LocalFiles.files, engines_files: EnginesFiles.files, overloads: Overloads.files }))
13
13
  puts File.expand_path("status.json")
14
14
  puts "-----"
15
15
 
16
- unless up_to_date.empty?
17
- puts "🥳 Up to date fingerprint count: #{up_to_date.count}"
18
- puts "-> Up to date fingerprint: #{up_to_date}"
16
+ unless Overloads.status(:up_to_date).empty?
17
+ puts "🥳 Up to date fingerprint count: #{Overloads.status(:up_to_date).count}"
18
+ puts "-> Up to date fingerprint: #{present(Overloads.status(:up_to_date))}"
19
19
  puts ""
20
20
  end
21
21
 
22
- unless out_of_date.empty?
23
- puts "😱 Out of date fingerprint count: #{out_of_date.count}"
24
- puts "-> Out of date fingerprint: #{out_of_date}"
22
+ unless Overloads.status(:out_of_date).empty?
23
+ puts "😱 Out of date fingerprint count: #{Overloads.status(:out_of_date).count}"
24
+ puts "-> Out of date fingerprint: #{present(Overloads.status(:out_of_date))}"
25
25
  puts ""
26
26
  end
27
27
 
28
- unless missing.empty?
29
- puts "🤬 Files missing fingerprint count: #{missing.count}"
30
- puts "-> Missing fingerprint: #{missing}"
28
+ unless Overloads.status(:missing).empty?
29
+ puts "🤬 Files missing fingerprint count: #{Overloads.status(:missing).count}"
30
+ puts "-> Missing fingerprint: #{present(Overloads.status(:missing))}"
31
31
  puts ""
32
32
  end
33
33
 
34
34
  puts "-----"
35
- puts "#####"
36
-
37
- out_of_date.empty? && missing.empty?
38
- end
39
-
40
- def self.out_of_date
41
- overloads.fetch(:out_of_date, [])
42
- end
43
-
44
- def self.up_to_date
45
- overloads.fetch(:up_to_date, [])
46
- end
47
-
48
- def self.missing
49
- overloads.fetch(:missing, [])
50
- end
51
-
52
- def self.overloads
53
- @overloads ||= rails_files.each_with_object({}) do |(path, fingerprint), hash|
54
- engines_files.keys.each do |engine_name|
55
- next unless path.include? engine_name
56
-
57
- source_path = engines_files[engine_name].fetch(path, nil)
58
- next unless source_path
59
-
60
- result = [engine_name, source_path]
61
-
62
- key = status_key(source_path[:fingerprint], fingerprint)
63
- if hash[key].nil?
64
- hash[key] = [result]
65
- else
66
- hash[key] << result
67
- end
68
- end
69
- end
70
- end
71
-
72
- def self.rails_files
73
- @rails_files ||= Dir.glob(Rails.root.join("app", "**", "*.{erb,rb}")).map { |path| path.sub("#{Rails.root}/", "") }.each_with_object({}) do |path, hash|
74
- hash[path] = read_annotation(path)
75
- end
76
- end
77
-
78
- def self.engines_files
79
- @engine_files ||= ::Rails::Engine.subclasses.each_with_object({}) do |klass, hash|
80
- paths = Dir.glob("#{klass.instance.root}/app/**/*.{erb,rb}")
81
- next if paths.empty?
82
-
83
- hash[engine_to_gem(klass)] = engine_paths(paths)
84
- end
85
- end
86
-
87
- def self.engine_to_gem(engine_class)
88
- if engine_class.respond_to?(:railtie_namespace) && engine_class.railtie_namespace
89
- engine_class.railtie_namespace.to_s.split("::").map(&:underscore).join("/")
90
- else
91
- engine_class.engine_name.sub("_engine", "")
92
- end
93
- end
94
-
95
- def self.engine_paths(paths)
96
- paths.each_with_object({}) do |path, hash|
97
- _name, *short_path = path.sub("#{gems_dir}/gems/", "").split("/")
98
- hash[short_path.join("/")] = { path: path, fingerprint: fingerprint(path) }
99
- end
100
- end
101
-
102
- def self.fingerprint(path)
103
- Digest::MD5.hexdigest(File.read(path))
104
- end
105
-
106
- def self.gems_dir
107
- @gems_dir ||= Bundler.rubygems.gem_dir
108
- end
109
-
110
- def self.read_annotation(path)
111
- File.readlines(path).map do |line|
112
- line.sub(/# bonobot_fingerprint:/, "").sub("<%", "").sub("%>", "").strip if line.match?(/# bonobot_fingerprint:/) || line.match?(/<%# bonobot_fingerprint:/)
113
- end.compact.first
35
+ Overloads.status(:out_of_date).empty? && Overloads.status(:missing).empty?
114
36
  end
115
37
 
116
- def self.status_key(source_fingerprint, target_fingerprint)
117
- return :up_to_date if source_fingerprint == target_fingerprint
118
- return :missing if target_fingerprint.nil?
38
+ def self.present(entry)
39
+ entries = entry.map do |(engine_name, source_path)|
40
+ " - #{engine_name}: #{source_path[:short_path]} (#{source_path[:fingerprint]})"
41
+ end.join("\n")
119
42
 
120
- :out_of_date
43
+ "\n#{entries}"
121
44
  end
122
45
  end
123
46
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bonobot
4
- VERSION = "0.0.3"
4
+ VERSION = "0.0.5"
5
5
  end
data/lib/bonobot.rb CHANGED
@@ -3,4 +3,8 @@
3
3
  require "bonobot/railtie"
4
4
 
5
5
  module Bonobot
6
+ autoload :Status, "bonobot/status"
7
+ autoload :LocalFiles, "bonobot/local_files"
8
+ autoload :EnginesFiles, "bonobot/engines_files"
9
+ autoload :Overloads, "bonobot/overloads"
6
10
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bonobot/status"
4
-
5
3
  namespace :bonobot do
6
4
  desc "Generate status"
7
5
  task status: :environment do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bonobot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - armandfardeau
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-03 00:00:00.000000000 Z
11
+ date: 2023-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '11.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rubocop
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +94,20 @@ dependencies:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
96
  version: 2.11.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  description: Description of Bonobot.
84
112
  email:
85
113
  - fardeauarmand@gmail.com
@@ -91,6 +119,9 @@ files:
91
119
  - README.md
92
120
  - Rakefile
93
121
  - lib/bonobot.rb
122
+ - lib/bonobot/engines_files.rb
123
+ - lib/bonobot/local_files.rb
124
+ - lib/bonobot/overloads.rb
94
125
  - lib/bonobot/railtie.rb
95
126
  - lib/bonobot/status.rb
96
127
  - lib/bonobot/version.rb