trop 0.4.27 → 0.5.33
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 +4 -4
- data/Gemfile +7 -2
- data/Rakefile +4 -83
- data/VERSION +1 -1
- data/bin/setup +3 -1
- data/lib/trop/gem_tasks.rb +24 -0
- data/lib/trop/shell_deb_verb.rb +65 -9
- data/lib/trop/version.rb +4 -1
- data/rakelib/envrc.rake +2 -0
- data/rakelib/gem_version.rake +46 -0
- data/rakelib/raven.rake +51 -0
- data/rakelib/source_annotation.rake +46 -0
- data/rakelib/source_annotation_extractor.rb +141 -0
- metadata +9 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 13ae332650b6d142dfdf98e3de802130d2d4e62daa0ccfe43bbc93cbc954ba64
|
|
4
|
+
data.tar.gz: ccab3a9d0a5c0c9ae17d938afe034cdd3b7a84a33578d53c2a229197dd2fcd1d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f4c2748eddd5efa8a082287d5a172293c376a8f319180768a71c1366b575d25bc98acc8b27b733db7d6dec717a5db05970ffe21ec3332b9ee010d8e0007cdd01
|
|
7
|
+
data.tar.gz: ac435121e471c62f3c306b82583a729bbcb28d9f459c0571579ecc76eeb82526198f6a3677b975dcaf5fb28e96c6b04c03a866517f721a8f9104c28acfad21b2
|
data/Gemfile
CHANGED
|
@@ -23,9 +23,14 @@ end
|
|
|
23
23
|
|
|
24
24
|
gem 'dotenv'
|
|
25
25
|
gem 'bundler', '~> 2.0.1'
|
|
26
|
-
gem "bundler_geminabox"
|
|
27
26
|
|
|
28
27
|
gem 'sentry-raven'
|
|
29
28
|
gem 'colorize'
|
|
30
29
|
|
|
31
|
-
gem "bundler-geminabox", "
|
|
30
|
+
gem "bundler-geminabox", "1.0"
|
|
31
|
+
|
|
32
|
+
gem "git-version-bump", "~> 0.16.0"
|
|
33
|
+
|
|
34
|
+
gem "gem-release", "~> 2.0"
|
|
35
|
+
|
|
36
|
+
gem "faraday", "0.15.4"
|
data/Rakefile
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
require 'rubygems'
|
|
2
|
-
require 'bundler/gem_tasks'
|
|
3
|
-
require 'bundler/endpoint_specification'
|
|
4
2
|
require 'rake'
|
|
5
|
-
require 'bump'
|
|
6
3
|
require 'fileutils'
|
|
7
|
-
|
|
4
|
+
|
|
5
|
+
require_relative './lib/trop'
|
|
6
|
+
|
|
8
7
|
|
|
9
8
|
begin
|
|
10
9
|
Bundler.setup(:default, :development)
|
|
@@ -14,61 +13,6 @@ rescue Bundler::BundlerError => e
|
|
|
14
13
|
exit e.status_code
|
|
15
14
|
end
|
|
16
15
|
|
|
17
|
-
desc 'Generate a gemspecx file.'
|
|
18
|
-
task :gemspecx do
|
|
19
|
-
spec_dir = File.join( FileUtils.getwd,"*.gemspec")
|
|
20
|
-
spec_path = Dir.glob( spec_dir ).first
|
|
21
|
-
spec_gem = Gem::Specification::load(spec_path)
|
|
22
|
-
spec_str = pp spec_gem
|
|
23
|
-
puts spec_str
|
|
24
|
-
puts spec_path
|
|
25
|
-
File.open("gemspecx.gemspecx", 'w') do |f|
|
|
26
|
-
f.write spec_gem.to_ruby
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
desc 'Generate a gemspec file.'
|
|
31
|
-
task :gemspec do
|
|
32
|
-
spec_dir = File.join( FileUtils.getwd,"*.gemspec")
|
|
33
|
-
spec_path = Dir.glob( spec_dir ).first
|
|
34
|
-
spec_gem = Gem::Specification::load(spec_path) do |s|
|
|
35
|
-
s.version = Trop::VERSION
|
|
36
|
-
end
|
|
37
|
-
File.open(spec_path, 'w') do |f|
|
|
38
|
-
f.write spec_gem.to_ruby
|
|
39
|
-
end
|
|
40
|
-
GemVersion.increment_version
|
|
41
|
-
GemVersion.commit_and_push
|
|
42
|
-
GemVersion.next_version
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
task :patch do
|
|
46
|
-
system 'bump patch --replace-in trop.gemspec --replace-in ./lib/trop/version.rb --replace-in next_gem_version'
|
|
47
|
-
end
|
|
48
|
-
task :min do
|
|
49
|
-
system 'bump minor --replace-in trop.gemspec --replace-in ./lib/trop/version.rb --replace-in next_gem_version'
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
task gembox: :build do
|
|
53
|
-
Dir.chdir('./pkg') do
|
|
54
|
-
system 'gem inabox *.gem --host=http://localhost:9292 -o '
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
#Jeweler::Tasks.new do |gem|
|
|
58
|
-
# gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
|
|
59
|
-
# gem.name = 'trop'
|
|
60
|
-
# gem.homepage = 'http://gitlab.wfschmitt.net/rails/trop'
|
|
61
|
-
# gem.license = 'MIT'
|
|
62
|
-
# gem.summary = %(trop is troppuS)
|
|
63
|
-
# gem.description = %(trop is support)
|
|
64
|
-
# gem.email = 'wfschmittx@gmail.com'
|
|
65
|
-
# gem.authors = ['werner'gcaa
|
|
66
|
-
# gem.files = %w[LICENSE.txt README.md README.rakes.md Gemfile Rakefile TODO.md VERSION lib/trop/config.bundler.tpl lib/trop/core-ext.rb lib/trop/file_finder.rb lib/trop/filefind.rb lib/trop/infogit.rb lib/trop/os.rb lib/trop/shell_deb_verb.rb lib/trop/version.rb]
|
|
67
|
-
#end
|
|
68
|
-
#$SAFE = 0
|
|
69
|
-
#Jeweler::RubygemsDotOrgTasks.new
|
|
70
|
-
|
|
71
|
-
|
|
72
16
|
require 'rake/testtask'
|
|
73
17
|
Rake::TestTask.new(:test) do |test|
|
|
74
18
|
test.libs << 'lib' << 'test'
|
|
@@ -76,34 +20,11 @@ Rake::TestTask.new(:test) do |test|
|
|
|
76
20
|
test.verbose = true
|
|
77
21
|
end
|
|
78
22
|
|
|
79
|
-
task :nexta do
|
|
80
|
-
puts 'hallo nexta'
|
|
81
|
-
puts `rake patch`
|
|
82
|
-
puts `rake gemspec`
|
|
83
|
-
puts `git add --all`
|
|
84
|
-
puts `git commit -m"save" --all`
|
|
85
|
-
puts `git save`
|
|
86
|
-
puts `git push`
|
|
87
|
-
# puts `git commit -m"save"`
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
task next: %i[test build] do
|
|
91
|
-
Rake::Task['nexta'].execute
|
|
92
|
-
Rake::Task['build'].execute
|
|
93
|
-
Rake::Task['install'].execute
|
|
94
|
-
puts `gem inabox`
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
desc 'prepare deployment in public'
|
|
98
|
-
task :deploy do
|
|
99
|
-
`mkdir -p ./public`
|
|
100
|
-
FileUtils.cp(%w[LICENSE.txt README.md README.rakes.md TODO.md], 'public', verbose: true)
|
|
101
|
-
end
|
|
102
|
-
|
|
103
23
|
desc 'Code coverage detail'
|
|
104
24
|
task :simplecov do
|
|
105
25
|
ENV['COVERAGE'] = 'true'
|
|
106
26
|
Rake::Task['test'].execute
|
|
107
27
|
end
|
|
108
28
|
|
|
29
|
+
|
|
109
30
|
task default: :test
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
1.0.0
|
data/bin/setup
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
|
|
3
|
-
IFS
|
|
3
|
+
IFS=$/
|
|
4
4
|
|
|
5
5
|
if [[ -f .envrc.example ]] && ! [[ -f .envrc ]]; then
|
|
6
6
|
cp -v .envrc.example .envrc
|
|
@@ -10,6 +10,8 @@ if [[ -f .envrc.local.example ]] && ! [[ -f .envrc.local ]]; then
|
|
|
10
10
|
cp -v .envrc.local.example .envrc.local
|
|
11
11
|
fi
|
|
12
12
|
|
|
13
|
+
gem inabox --host=http://localhost:9292
|
|
14
|
+
|
|
13
15
|
touch .envrc .envrc.local
|
|
14
16
|
# Do any other automated setup that you need to do here
|
|
15
17
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'bundler'
|
|
2
|
+
require 'bundler/gem_tasks'
|
|
3
|
+
#require 'bundler-geminabox/gem_tasks'
|
|
4
|
+
require 'bundler/endpoint_specification'
|
|
5
|
+
require 'bump'
|
|
6
|
+
require 'gem_version'
|
|
7
|
+
require 'git-version-bump/rake-tasks'
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
module GemHelper
|
|
11
|
+
|
|
12
|
+
def self.rewrite_gemspec
|
|
13
|
+
spec_path = FileUtils.getwd + '/' + Trop::GEMSPEC_NAME
|
|
14
|
+
spec_gem = Gem::Specification::load(spec_path)
|
|
15
|
+
spec_gem.version = GemVersion.next_version
|
|
16
|
+
File.open(spec_path, 'w') {|f| f.write spec_gem.to_ruby }
|
|
17
|
+
unless Trop::Sh::silent?
|
|
18
|
+
File.open("gemspecx.gemspecx", 'w') {|f| f.write spec_gem.to_ruby }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
return spec_gem.version
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
data/lib/trop/shell_deb_verb.rb
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
require 'rake/file_utils_ext'
|
|
3
3
|
require_relative 'core-ext'
|
|
4
4
|
|
|
5
|
+
|
|
5
6
|
#def bash_cmd(cmd)
|
|
6
7
|
# # sh <<-EOS.strip_heredoc, {verbose: false}
|
|
7
8
|
# sh <<-EOS << cmd
|
|
@@ -24,18 +25,32 @@ module Trop
|
|
|
24
25
|
return !!@@verbose
|
|
25
26
|
end
|
|
26
27
|
|
|
27
|
-
def self.verbose!
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
ENV['VERBOSE'] = nil
|
|
31
|
-
else
|
|
32
|
-
@@verbose = true
|
|
33
|
-
end
|
|
28
|
+
def self.verbose!
|
|
29
|
+
@@verbose = true
|
|
30
|
+
ENV['VERBOSE'] = "true"
|
|
34
31
|
return !!@@verbose
|
|
35
32
|
end
|
|
36
33
|
|
|
37
|
-
def self.
|
|
38
|
-
|
|
34
|
+
def self.silence_streams(*streams)
|
|
35
|
+
@@on_hold = streams.collect { |stream| stream.dup }
|
|
36
|
+
streams.each do |stream|
|
|
37
|
+
stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
|
|
38
|
+
stream.sync = true
|
|
39
|
+
end
|
|
40
|
+
yield
|
|
41
|
+
ensure
|
|
42
|
+
streams.each_with_index do |stream, i|
|
|
43
|
+
stream.reopen(@@on_hold[i])
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def self.silent!
|
|
49
|
+
@@verbose = false
|
|
50
|
+
@@debug = false
|
|
51
|
+
ENV['VERBOSE'] = nil
|
|
52
|
+
ENV['DEBUG'] = nil
|
|
53
|
+
return !!@@verbose && !!@@debug
|
|
39
54
|
end
|
|
40
55
|
|
|
41
56
|
def self.silent?
|
|
@@ -57,5 +72,46 @@ module Trop
|
|
|
57
72
|
end
|
|
58
73
|
return @@debug
|
|
59
74
|
end
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def self.systemlocal(cmds)
|
|
78
|
+
cmd = ''
|
|
79
|
+
return [-1, ''] if cmds.nil? || cmds.blank?
|
|
80
|
+
|
|
81
|
+
if cmds.is_a? Array
|
|
82
|
+
cmds.each {|s| cmd = cmd + s.to_s + ' ' unless s.blank?}
|
|
83
|
+
else
|
|
84
|
+
cmd = cmds.to_s
|
|
85
|
+
end
|
|
86
|
+
puts "commands: #{cmd} " if Trop::Sh::debug?
|
|
87
|
+
return [-1, ''] if cmd.blank?
|
|
88
|
+
puts " #{cmd} ".colorize(:green) if Trop::Sh::verbose?
|
|
89
|
+
|
|
90
|
+
# execute system call with return in stdout
|
|
91
|
+
stdout = `#{cmd}`
|
|
92
|
+
# silent if successful or not verbose
|
|
93
|
+
if $CHILD_STATUS.success?
|
|
94
|
+
puts stdout.to_s.colorize(:green) if Trop::Sh::verbose?
|
|
95
|
+
return [0, stdout]
|
|
96
|
+
end
|
|
97
|
+
# error case
|
|
98
|
+
puts " #{cmd} ".colorize(:red)
|
|
99
|
+
puts " #{stdout}".colorize(:red)
|
|
100
|
+
[-1, stdout]
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def self.cwd(*cmds)
|
|
104
|
+
wd = Pathname.new(RAKE_RUN_DIR).join('output')
|
|
105
|
+
Dir.chdir(wd) do
|
|
106
|
+
ret, out = systemlocal(cmds)
|
|
107
|
+
return [ret, out]
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def self.sh(*cmds)
|
|
112
|
+
ret, out = systemlocal(cmds)
|
|
113
|
+
return [ret, out]
|
|
114
|
+
end
|
|
60
115
|
end
|
|
61
116
|
end
|
|
117
|
+
|
data/lib/trop/version.rb
CHANGED
data/rakelib/envrc.rake
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
|
|
2
|
+
require_relative '../lib/trop'
|
|
3
|
+
|
|
4
|
+
namespace :gem do
|
|
5
|
+
Trop::Sh::silent!
|
|
6
|
+
DEVNULL = Gem.win_platform? ? "NUL" : "/dev/null"
|
|
7
|
+
task :gembox do
|
|
8
|
+
Dir.chdir('./pkg') do
|
|
9
|
+
Trop::Sh::systemlocal 'gem inabox *.gem --host=http://localhost:9292 -o '
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
task :next do
|
|
14
|
+
# self.dirty_tree?
|
|
15
|
+
# Are we in a dirty, dirty tree?
|
|
16
|
+
Trop::Sh::silent!
|
|
17
|
+
status,msg = Trop::Sh::systemlocal("git diff --no-ext-diff HEAD 2> #{DEVNULL}" )
|
|
18
|
+
stat2,msg2 = Trop::Sh::systemlocal("git diff-index --cached HEAD 2> #{DEVNULL}")
|
|
19
|
+
clean = (!status && !stat2) && msg.empty? && msg2.empty?
|
|
20
|
+
clean = msg.empty? && msg2.empty?
|
|
21
|
+
|
|
22
|
+
if !clean
|
|
23
|
+
Trop::Sh::verbose!
|
|
24
|
+
puts msg
|
|
25
|
+
puts " repo is not clean please stash or commit"
|
|
26
|
+
else
|
|
27
|
+
vers1 = vers2 = nil
|
|
28
|
+
Trop::Sh::silence_streams(STDOUT) {
|
|
29
|
+
vers1 = GemVersion.increment_version
|
|
30
|
+
vers2 = GemHelper.rewrite_gemspec
|
|
31
|
+
GemVersion.commit_and_push {|g| g.add(Trop::VERSION_FILE) && g.add(Trop::GEMSPEC_NAME)}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
puts "incr. version build and push #{vers1} #{vers2}"
|
|
35
|
+
Trop::Sh::systemlocal('rake build')
|
|
36
|
+
Trop::Sh::systemlocal('rake release')
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
desc 'prepare deployment in public'
|
|
41
|
+
task :deploy do
|
|
42
|
+
`mkdir -p ./public`
|
|
43
|
+
FileUtils.cp(%w[LICENSE.txt README.md README.rakes.md TODO.md], 'public', verbose: true)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
data/rakelib/raven.rake
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
|
|
2
|
+
require_relative '../lib/trop'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
if ENV['CI'].nil?
|
|
6
|
+
require 'sentry-raven'
|
|
7
|
+
Raven.configure do |config| #
|
|
8
|
+
config.silence_ready = true # unless Shell.cwd
|
|
9
|
+
envtest = ENV['SENTRY_DSN'] || 'https://1119c5fd4e7e47b7948c62b22b182fdf@sentry.io/1448013'
|
|
10
|
+
config.dsn = envtest
|
|
11
|
+
config.release = Trop::InfoGit::GitProject.commit_id
|
|
12
|
+
config.ssl_verification = false
|
|
13
|
+
puts "Using dsn #{envtest}".yellow #if Shell.verbose?
|
|
14
|
+
# puts "with comit-id: #{InfoGit::GitProject.commit_id}".yellow if Shell.verbose?
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
namespace :raven do
|
|
20
|
+
desc 'trigger a dummy event on sentry'
|
|
21
|
+
task :trigger do
|
|
22
|
+
return 1 / 0
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# desc 'register a version to sentry'
|
|
28
|
+
# task :deploy do
|
|
29
|
+
# curl http://worker.hbi.ad.harman.com:9000/api/hooks/release/builtin/2/1947c904f6a75a932b0110940151fb12460b699ae1cbb5079c095675197d47e4/
|
|
30
|
+
# commit_id = InfoGit::GitProject.commit_id
|
|
31
|
+
# cmd = <<-EOF.tr!("\n", ' ')
|
|
32
|
+
# curl https://sentry.io/api/hooks/release/builtin/1272992/43a5fce123b9c2f2b8f799489ff49f07ffb615d79e37114e3f29fb03f1e06150/
|
|
33
|
+
# -X POST
|
|
34
|
+
# -H 'Content-Type: application/json'
|
|
35
|
+
# -d '{"version": "#{commit_id}"}'
|
|
36
|
+
# EOF
|
|
37
|
+
# puts cmd
|
|
38
|
+
# system cmd#
|
|
39
|
+
|
|
40
|
+
# sh ('
|
|
41
|
+
# ACCESS_TOKEN=0e63f4a39ce44cf48fb1cc94c75b0ea8
|
|
42
|
+
# ENVIRONMENT=production
|
|
43
|
+
# LOCAL_USERNAME=`whoami`
|
|
44
|
+
# REVISION=`git log -n 1 --pretty=format:"%H"`
|
|
45
|
+
# curl https://api.rollbar.com/api/1/deploy/ \
|
|
46
|
+
# -F access_token=$ACCESS_TOKEN \
|
|
47
|
+
# -F environment=$ENVIRONMENT \
|
|
48
|
+
# -F revision=$REVISION \
|
|
49
|
+
# -F local_username=$LOCAL_USERNAME')
|
|
50
|
+
# end
|
|
51
|
+
#end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
IDIR = 'doc/internal/'.freeze
|
|
2
|
+
# frozen_string_literal: false
|
|
3
|
+
|
|
4
|
+
desc 'tad (test and docs)'
|
|
5
|
+
task :tad do
|
|
6
|
+
puts 'Working in: ' + Dir.getwd.to_str
|
|
7
|
+
#`cd #{IDIR}; git add *; git commit -m"safe old logs" -a; rm *.log; cd -`
|
|
8
|
+
#`rake routes | tee #{IDIR}routes.log `
|
|
9
|
+
# `rake initializers | tee #{IDIR}initializers.log`
|
|
10
|
+
`rake notes:rb | tee #{IDIR}notes.todo.log`
|
|
11
|
+
`rake notes:md | tee #{IDIR}notes.md.log`
|
|
12
|
+
`rake notes:all | tee #{IDIR}notes.log`
|
|
13
|
+
#`rake stats | tee #{IDIR}stats.log`
|
|
14
|
+
#`rake test 2>&1 | tee #{IDIR}rake_test.log`
|
|
15
|
+
#`rake spec 2>&1 | tee #{IDIR}rake_spec.log`
|
|
16
|
+
#`git add *; git commit -m"safe old logs" -a`
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
namespace :notes do
|
|
20
|
+
require File.dirname(__FILE__) + '/source_annotation_extractor'
|
|
21
|
+
|
|
22
|
+
desc 'Enumerate a custom annotation, specify with ANNOTATION=CUSTOM'
|
|
23
|
+
task :custom do
|
|
24
|
+
SourceAnnotationExtractor.enumerate ENV['ANNOTATION']
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
desc 'Enumerate all annotations (use notes:optimize, :fixme, :todo for focus)'
|
|
28
|
+
task :css do
|
|
29
|
+
SourceAnnotationExtractor::Annotation.register_extensions('css', 'scss', 'sass', 'less', 'js') { |tag| %r{\/\/\s*(#{tag}):?\s*(.*)$} }
|
|
30
|
+
SourceAnnotationExtractor.enumerate 'OPTIMIZE|FIXME|TODO', tag: true
|
|
31
|
+
SourceAnnotationExtractor.enumerate 'TODO|LATER', dirs: %w[doc,lib], tag: true
|
|
32
|
+
end
|
|
33
|
+
desc 'Enumerate all markdowns' ## custom annotation, specify with ANNOTATION=CUSTOM
|
|
34
|
+
task :md do
|
|
35
|
+
SourceAnnotationExtractor::Annotation.register_extensions('md') { |tag| /(#{tag}):?\s*(.*)$/ }
|
|
36
|
+
SourceAnnotationExtractor.enumerate 'TODO|LATER|FIXME', dirs: %w(. ../biosonlinux)
|
|
37
|
+
# dirs: ['.','doc','lib','test','artefacts','../biosonlinux'], tag: true
|
|
38
|
+
end
|
|
39
|
+
desc 'Enumerate all rubies' ## custom annotation, specify with ANNOTATION=CUSTOM
|
|
40
|
+
task :rb do
|
|
41
|
+
SourceAnnotationExtractor::Annotation.register_extensions('erb') { |tag| /<%\s*#\s*(#{tag}):?\s*(.*?)\s*%>/ }
|
|
42
|
+
SourceAnnotationExtractor::Annotation.register_extensions('builder', 'rb', 'rake', 'yml', 'yaml', 'ruby') { |tag| /#\s*(#{tag}):?\s*(.*)$/ }
|
|
43
|
+
SourceAnnotationExtractor.enumerate 'OPTIMIZE|FIXME|TODO|LATER', dirs: %w[app/admin app/controllers bin/lib db config test spec .], tag: true
|
|
44
|
+
end
|
|
45
|
+
#
|
|
46
|
+
end
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Implements the logic behind the rake tasks for annotations like
|
|
2
|
+
#
|
|
3
|
+
# rails notes
|
|
4
|
+
# rails notes:optimize
|
|
5
|
+
#
|
|
6
|
+
# and friends. See <tt>rails -T notes</tt> and <tt>railties/lib/rails/tasks/annotations.rake</tt>.
|
|
7
|
+
#
|
|
8
|
+
# Annotation objects are triplets <tt>:line</tt>, <tt>:tag</tt>, <tt>:text</tt> that
|
|
9
|
+
# represent the line where the annotation lives, its tag, and its text. Note
|
|
10
|
+
# the filename is not stored.
|
|
11
|
+
#
|
|
12
|
+
# Annotations are looked for in comments and modulus whitespace they have to
|
|
13
|
+
# start with the tag optionally followed by a colon. Everything up to the end
|
|
14
|
+
# of the line (or closing ERB comment tag) is considered to be their text.
|
|
15
|
+
# noinspection RubyClassVariableUsageInspection
|
|
16
|
+
class SourceAnnotationExtractor
|
|
17
|
+
Annotation = Struct.new(:line, :tag, :text) do
|
|
18
|
+
def self.directories
|
|
19
|
+
@directories ||= %w[bin doc filter lib templates test] + (ENV['SOURCE_ANNOTATION_DIRECTORIES'] || '').split(',')
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Registers additional directories to be included
|
|
23
|
+
# SourceAnnotationExtractor::Annotation.register_directories("spec","another")
|
|
24
|
+
def self.register_directories(*dirs)
|
|
25
|
+
directories.push(*dirs)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.extensions
|
|
29
|
+
@extensions ||= {}
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Registers new Annotations File Extensions
|
|
33
|
+
# SourceAnnotationExtractor::Annotation.register_extensions("css", "scss", "sass", "less", "js") { |tag| /\/\/\s*(#{tag}):?\s*(.*)$/ }
|
|
34
|
+
def self.register_extensions(*exts, &block)
|
|
35
|
+
extensions[/\.(#{exts.join('|')})$/] = block
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
#register_extensions('builder', 'rb', 'rake', 'yml', 'yaml', 'ruby') { |tag| /#\s*(#{tag}):?\s*(.*)$/ }
|
|
39
|
+
#register_extensions('css', 'js') { |tag| /\/\/\s*(#{tag}):?\s*(.*)$/ }
|
|
40
|
+
#register_extensions('erb') { |tag| /<%\s*#\s*(#{tag}):?\s*(.*?)\s*%>/ }
|
|
41
|
+
|
|
42
|
+
# Returns a representation of the annotation that looks like this:
|
|
43
|
+
#
|
|
44
|
+
# [126] [TODO] This algorithm is simple and clearly correct, make it faster.
|
|
45
|
+
#
|
|
46
|
+
# If +options+ has a flag <tt>:tag</tt> the tag is shown as in the example above.
|
|
47
|
+
# Otherwise the string contains just line and text.
|
|
48
|
+
def to_s(options = {})
|
|
49
|
+
s = "[#{line.to_s.rjust(options[:indent])}] "
|
|
50
|
+
s << "[#{tag}] " if options[:tag]
|
|
51
|
+
s << text
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Prints all annotations with tag +tag+ under the root directories +app+,
|
|
56
|
+
# +config+, +db+, +lib+, and +test+ (recursively).
|
|
57
|
+
#
|
|
58
|
+
# Additional directories may be added using a comma-delimited list set using
|
|
59
|
+
# <tt>ENV['SOURCE_ANNOTATION_DIRECTORIES']</tt>.
|
|
60
|
+
#
|
|
61
|
+
# Directories may also be explicitly set using the <tt>:dirs</tt> key in +options+.
|
|
62
|
+
#
|
|
63
|
+
# SourceAnnotationExtractor.enumerate 'TODO|FIXME', dirs: %w(app lib), tag: true
|
|
64
|
+
#
|
|
65
|
+
# If +options+ has a <tt>:tag</tt> flag, it will be passed to each annotation's +to_s+.
|
|
66
|
+
#
|
|
67
|
+
# See <tt>#find_in</tt> for a list of file extensions that will be taken into account.
|
|
68
|
+
#
|
|
69
|
+
# This class method is the single entry point for the rake tasks.
|
|
70
|
+
def self.enumerate(tag, options = {})
|
|
71
|
+
extractor = new(tag)
|
|
72
|
+
dirs = options.delete(:dirs) || Annotation.directories
|
|
73
|
+
puts dirs.to_s
|
|
74
|
+
extractor.display(extractor.find(dirs), options)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
attr_reader :tag
|
|
78
|
+
|
|
79
|
+
def initialize(tag)
|
|
80
|
+
@tag = tag
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Returns a hash that maps filenames under +dirs+ (recursively) to arrays
|
|
84
|
+
# with their annotations.
|
|
85
|
+
def find(dirs)
|
|
86
|
+
dirs.inject({}) { |h, dir| h.update(find_in(dir)) }
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Returns a hash that maps filenames under +dir+ (recursively) to arrays
|
|
90
|
+
# with their annotations. Only files with annotations are included. Files
|
|
91
|
+
# with extension +.builder+, +.rb+, +.rake+, +.yml+, +.yaml+, +.ruby+,
|
|
92
|
+
# +.css+, +.js+ and +.erb+ are taken into account.
|
|
93
|
+
def find_in(dir)
|
|
94
|
+
results = {}
|
|
95
|
+
|
|
96
|
+
Dir.glob("#{dir}/*") do |item|
|
|
97
|
+
next if File.basename(item)[0] == '.'
|
|
98
|
+
|
|
99
|
+
if File.directory?(item)
|
|
100
|
+
results.update(find_in(item))
|
|
101
|
+
else
|
|
102
|
+
extension = Annotation.extensions.detect do |regexp, _block|
|
|
103
|
+
regexp.match(item)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
if extension
|
|
107
|
+
pattern = extension.last.call(tag)
|
|
108
|
+
results.update(extract_annotations_from(item, pattern)) if pattern
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
results
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# If +file+ is the filename of a file that contains annotations this method returns
|
|
117
|
+
# a hash with a single entry that maps +file+ to an array of its annotations.
|
|
118
|
+
# Otherwise it returns an empty hash.
|
|
119
|
+
def extract_annotations_from(file, pattern)
|
|
120
|
+
lineno = 0
|
|
121
|
+
result = File.readlines(file, encoding: Encoding::BINARY).inject([]) do |list, line|
|
|
122
|
+
lineno += 1
|
|
123
|
+
next list unless line =~ pattern
|
|
124
|
+
list << Annotation.new(lineno, Regexp.last_match(1), Regexp.last_match(2))
|
|
125
|
+
end
|
|
126
|
+
result.empty? ? {} : { file => result }
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Prints the mapping from filenames to annotations in +results+ ordered by filename.
|
|
130
|
+
# The +options+ hash is passed to each annotation's +to_s+.
|
|
131
|
+
def display(results, options = {})
|
|
132
|
+
options[:indent] = results.flat_map { |f, a| a.map(&:line) }.max.to_s.size
|
|
133
|
+
results.keys.sort.each do |file|
|
|
134
|
+
puts "#{file}:"
|
|
135
|
+
results[file].each do |note|
|
|
136
|
+
puts " * #{note.to_s(options)}"
|
|
137
|
+
end
|
|
138
|
+
puts
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: trop
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.33
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- werner
|
|
@@ -44,14 +44,14 @@ dependencies:
|
|
|
44
44
|
requirements:
|
|
45
45
|
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '1.
|
|
47
|
+
version: '1.0'
|
|
48
48
|
type: :runtime
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: '1.
|
|
54
|
+
version: '1.0'
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: sentry-raven
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -216,10 +216,16 @@ files:
|
|
|
216
216
|
- lib/trop/core-ext.rb
|
|
217
217
|
- lib/trop/file_finder.rb
|
|
218
218
|
- lib/trop/filefind.rb
|
|
219
|
+
- lib/trop/gem_tasks.rb
|
|
219
220
|
- lib/trop/infogit.rb
|
|
220
221
|
- lib/trop/os.rb
|
|
221
222
|
- lib/trop/shell_deb_verb.rb
|
|
222
223
|
- lib/trop/version.rb
|
|
224
|
+
- rakelib/envrc.rake
|
|
225
|
+
- rakelib/gem_version.rake
|
|
226
|
+
- rakelib/raven.rake
|
|
227
|
+
- rakelib/source_annotation.rake
|
|
228
|
+
- rakelib/source_annotation_extractor.rb
|
|
223
229
|
homepage: http://gitlab.wfschmitt.net/rails/trop
|
|
224
230
|
licenses:
|
|
225
231
|
- MIT
|