tagrity 0.1.1 → 0.1.2

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: dcfed080b9e287731b704e80488adac996f1c4fa1b8157eb0e0836267eaed3c0
4
- data.tar.gz: a0f2b636f77d14d419efc7b6e899b1c34b9e0ef3e9ed582bfc705e8e1270b84c
3
+ metadata.gz: 38dc3f96b14b1ef629c339a71faf41d448b7ca5281dd9d4e69ea4a2dcf167662
4
+ data.tar.gz: 731c6fb5f54d8c9ca850f2ee6a38018f6a1765b1663334b52ba2ad0f9929c686
5
5
  SHA512:
6
- metadata.gz: 5a97461685ed84ae3c4488ad93469079cee4b24e778222d4d2ea6db47945fe52d10c0665bccd89de431468dffee0aaf6bab776da40710362943e05b876666683
7
- data.tar.gz: 48a82ca820c24f146dec57e888d9621a595e8fd89bd0d76ca4233eab2a54d2b517547192cf1ae5f712e4c8b828a32f46780a6d371c06612e34f263b096ed2016
6
+ metadata.gz: e228435fd32b23cb6d36b184889a82a170abc8422870d4321d36d5e2a17e89a108804ca4f83613ae41ad2e71091dae20a3e59652af5d715fa1f761055f6e1f6b
7
+ data.tar.gz: db4f8487a44f71e366bfa83e6308ab712236ea038348a08ca6302904ab6d8cf1b09b61eb0dcc96aa233b8f964f07b41985af27043756d2001e3d697b19dfdbb6
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tagrity (0.1.0)
4
+ tagrity (0.1.2)
5
5
  listen (~> 3.0)
6
6
  thor (~> 0.20)
7
7
 
@@ -17,6 +17,7 @@ GEM
17
17
  rb-fsevent (0.10.3)
18
18
  rb-inotify (0.10.0)
19
19
  ffi (~> 1.0)
20
+ ripper-tags (0.8.0)
20
21
  rspec (3.9.0)
21
22
  rspec-core (~> 3.9.0)
22
23
  rspec-expectations (~> 3.9.0)
@@ -38,6 +39,7 @@ PLATFORMS
38
39
  DEPENDENCIES
39
40
  bundler (~> 2.0)
40
41
  rake (~> 10.0)
42
+ ripper-tags (~> 0.8.0)
41
43
  rspec (~> 3.0)
42
44
  tagrity!
43
45
 
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # Tagrity
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/tagrity`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ Automatically regenerate tags on file changes.
6
4
 
7
5
  ## Installation
8
6
 
@@ -22,7 +20,52 @@ Or install it yourself as:
22
20
 
23
21
  ## Usage
24
22
 
25
- TODO: Write usage instructions here
23
+ ```
24
+ Commands:
25
+ tagrity help [COMMAND] # Describe available commands or one specific command
26
+ tagrity start # Start watching a directory (default to pwd)
27
+ tagrity status # List running tagrity processes and the directories being watched
28
+ tagrity stop # Stop watching a directory (default to pwd)
29
+ ```
30
+
31
+ ### start
32
+
33
+ ```
34
+ Usage:
35
+ tagrity start
36
+
37
+ Options:
38
+ [--dir=DIR]
39
+ [--fg], [--no-fg]
40
+ [--configfile=CONFIGFILE]
41
+ [--tagf=TAGF]
42
+ [--default-cmd=DEFAULT_CMD]
43
+ [--excluded-exts=one two three]
44
+ [--excluded-paths=one two three]
45
+
46
+ Start watching a directory (default to pwd)
47
+ ```
48
+
49
+ ### stop
50
+
51
+ ```
52
+ Usage:
53
+ tagrity stop
54
+
55
+ Options:
56
+ [--dir=DIR]
57
+
58
+ Stop watching a directory (default to pwd)
59
+ ```
60
+
61
+ ### status
62
+
63
+ ```
64
+ Usage:
65
+ tagrity status
66
+
67
+ List running tagrity processes and the directories being watched
68
+ ```
26
69
 
27
70
  ## Development
28
71
 
data/lib/tagrity/cli.rb CHANGED
@@ -1,32 +1,30 @@
1
1
  require 'thor'
2
2
  require 'tagrity/commands/start'
3
3
  require 'tagrity/commands/stop'
4
- require 'tagrity/commands/restart'
5
4
  require 'tagrity/commands/status'
6
5
 
7
6
  module Tagrity
8
7
  class CLI < Thor
9
- desc "start", "Start watching pwd or DIR"
8
+ desc "start", "Start watching a directory (default to pwd)"
10
9
  option :dir
11
10
  option :fg, type: :boolean
11
+ option :configfile
12
+ option :tagf
13
+ option :default_cmd
14
+ option :excluded_exts, type: :array
15
+ option :excluded_paths, type: :array
12
16
  def start()
17
+ setup_config
13
18
  Command::Start::call(dir, fg?)
14
19
  end
15
20
 
16
- desc "stop", "Stop watching pwd or DIR"
21
+ desc "stop", "Stop watching a directory (default to pwd)"
17
22
  option :dir
18
23
  def stop()
19
24
  Command::Stop::call(dir)
20
25
  end
21
26
 
22
- desc "restart", "Stop watching pwd or DIR. Start watching pwd or DIR again"
23
- option :dir
24
- option :fg, type: :boolean
25
- def restart()
26
- Command::Restart::call(dir, fg?)
27
- end
28
-
29
- desc "status", "status running tagrity processes watching directories"
27
+ desc "status", "List running tagrity processes and the directories being watched"
30
28
  def status
31
29
  Command::Status::call
32
30
  end
@@ -42,5 +40,15 @@ module Tagrity
42
40
  def fg?
43
41
  options[:fg]
44
42
  end
43
+
44
+ def setup_config
45
+ ConfigFile.instance.init(
46
+ configfile: options[:configfile],
47
+ default_cmd: options[:default_cmd],
48
+ tagf: options[:tagf],
49
+ excluded_exts: options[:excluded_exts],
50
+ excluded_paths: options[:excluded_paths]
51
+ )
52
+ end
45
53
  end
46
54
  end
@@ -2,6 +2,7 @@ require 'listen'
2
2
  require 'tagrity/pid_file'
3
3
  require 'tagrity/process_helper'
4
4
  require 'tagrity/file_callbacks'
5
+ require 'tagrity/provider'
5
6
 
6
7
  module Tagrity
7
8
  module Command
@@ -12,22 +13,19 @@ module Tagrity
12
13
  def call(dir, fg)
13
14
  assert_not_running(dir)
14
15
 
15
- callbacks = FileCallbacks.new
16
+ Process.daemon(nochdir: true) unless fg
16
17
 
17
- Process.daemon unless fg
18
+ callbacks = Provider.provide(:file_callbacks)
18
19
  PidFile.write(PidFile.new(dir, Process.pid))
19
20
 
20
21
  listener = Listen.to(
21
22
  dir,
22
- ignore: [/tags/],
23
+ ignore: [/^\.?tags$/],
23
24
  relative: true,
24
25
  ) do |modified, added, removed|
25
26
  callbacks.on_files_modified(modified)
26
27
  callbacks.on_files_added(added)
27
28
  callbacks.on_files_removed(removed)
28
- puts "modified absolute paths: #{modified}"
29
- puts "added absolute paths: #{added}"
30
- puts "removed absolute paths: #{removed}"
31
29
  end
32
30
  listener.start
33
31
  sleep
@@ -1,7 +1,96 @@
1
+ require 'yaml'
2
+ require 'singleton'
3
+ require 'tagrity/executable_helper'
4
+
1
5
  module Tagrity
2
6
  class ConfigFile
3
- def initialize(opts = {})
7
+ include Singleton
8
+
9
+ class ErrorTagFileNotWritable < StandardError; end
10
+
11
+ def init(
12
+ configfile:,
13
+ default_cmd:,
14
+ tagf:,
15
+ excluded_exts:,
16
+ excluded_paths:
17
+ )
18
+ fname = config_file_name(configfile)
19
+ @config = if fname.nil? then {} else YAML.load_file(fname) end
20
+ ensure_ext_cmds
21
+ ensure_default_cmd(default_cmd)
22
+ ensure_tagf(tagf)
23
+ ensure_excluded_exts(excluded_exts)
24
+ ensure_excluded_paths(excluded_paths)
25
+ end
26
+
27
+ def ft_to_cmd(ext)
28
+ ft_cmd = @config['ext_cmds'][ext]
29
+ return @config['default_cmd'] if ft_cmd.nil? || !ExecutableHelper.is_executable(ft_cmd)
30
+ ft_cmd
31
+ end
32
+
33
+ def is_ft_excluded(ext)
34
+ @config['excluded_exts'].include?(ext)
35
+ end
36
+
37
+ def is_path_excluded(path)
38
+ @config['excluded_paths'].any? { |pat| /^(\.\/)?#{pat}.*/ =~ path }
39
+ end
40
+
41
+ def tagf
42
+ @config['tagf']
43
+ end
44
+
45
+ def to_s
46
+ @config.to_s
47
+ end
48
+
49
+ private
50
+
51
+ def ensure_ext_cmds
52
+ set_option('ext_cmds', nil, {})
53
+ end
54
+
55
+ def ensure_default_cmd(default_cmd)
56
+ set_option('default_cmd', default_cmd, 'ctags')
57
+ end
58
+
59
+ def ensure_excluded_exts(excluded_exts)
60
+ set_option('excluded_exts', excluded_exts, [])
61
+ end
62
+
63
+ def ensure_excluded_paths(excluded_paths)
64
+ set_option('excluded_paths', excluded_paths, [])
65
+ end
66
+
67
+ def ensure_tagf(tagf)
68
+ set_option('tagf', tagf, 'tags')
69
+ unless File.writable?(@config['tagf'])
70
+ raise ErrorTagFileNotWritable, "#{@config['tagf']} must be writable to be used as the tag file."
71
+ end
72
+ end
73
+
74
+ def set_option(key, local_val, default)
75
+ unless local_val.nil?
76
+ @config[key] = local_val
77
+ end
78
+ return if @config.key?(key) && !@config[key].nil? && @config[key].is_a?(default.class)
79
+ @config[key] = default
80
+ end
81
+
82
+ def config_file_name(fname)
83
+ return fname unless fname.nil?
84
+ return global_config_file_name if File.file?(global_config_file_name)
85
+ nil
86
+ end
87
+
88
+ def global_config_file_name
89
+ "#{global_config_dir_name}/config.yml"
90
+ end
4
91
 
92
+ def global_config_dir_name
93
+ "#{ENV["HOME"]}/.config/tagrity"
5
94
  end
6
95
  end
7
96
  end
@@ -0,0 +1,9 @@
1
+ module Tagrity
2
+ class ExecutableHelper
3
+ class << self
4
+ def is_executable(cmd)
5
+ !%x{command -v #{cmd}}.empty?
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,9 +1,10 @@
1
1
  require 'tagrity/tag_generator'
2
+ require 'tagrity/config_file'
2
3
 
3
4
  module Tagrity
4
5
  class FileCallbacks
5
- def initialize
6
- @tag_generator = TagGenerator.new
6
+ def initialize(tag_generator)
7
+ @tag_generator = tag_generator
7
8
  end
8
9
 
9
10
  def on_files_modified(files)
@@ -0,0 +1,26 @@
1
+ require 'tagrity/file_callbacks'
2
+ require 'tagrity/config_file'
3
+ require 'tagrity/tag_generator'
4
+
5
+ module Tagrity
6
+ class Provider
7
+ class << self
8
+ def provide(want)
9
+ case want
10
+ when :file_callbacks
11
+ provide_file_callbacks
12
+ when :tag_generator
13
+ provide_tag_generator
14
+ end
15
+ end
16
+
17
+ def provide_file_callbacks
18
+ FileCallbacks.new(provide(:tag_generator))
19
+ end
20
+
21
+ def provide_tag_generator
22
+ TagGenerator.new
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,33 +1,52 @@
1
+ require 'tagrity/executable_helper'
2
+
1
3
  module Tagrity
2
4
  class TagGenerator
3
5
  class ExecutableNonExist < StandardError; end
4
6
 
5
7
  def initialize
6
8
  assert_executables
7
- end
8
-
9
- def generate_all
9
+ @config = ConfigFile.instance
10
10
  end
11
11
 
12
12
  def generate(files)
13
13
  return if files.empty?
14
- `ctags -f tags --append #{files.join(' ')}`
14
+ files
15
+ .select { |file| !dont_index_file(file) && File.readable?(file) }
16
+ .group_by { |file| @config.ft_to_cmd(file.partition('.').last) }
17
+ .each do |cmd, fnames|
18
+ `#{cmd} -f #{tagf} --append #{fnames.join(' ')}`
19
+ if $?.exitstatus != 0
20
+ puts "{#{cmd}} failed to generate tags for #{fnames} into #{tagf}"
21
+ else
22
+ puts "{#{cmd}} generated tags for #{fnames} into #{tagf}"
23
+ end
24
+ end
15
25
  end
16
26
 
17
27
  def delete_files_tags(files)
18
28
  return if files.empty?
19
- `cat tags | grep -v -F #{files.map { |f| " -e \"#{f}\""}.join(' ')} > .tags`
20
- `mv .tags tags`
29
+ `cat #{tagf} | grep -v -F #{files.map { |f| " -e \" #{f} \""}.join(' ')} > .tagrity.tags`
30
+ `mv -f .tagrity.tags #{tagf}`
31
+ puts "Deleted tags for #{files} from #{tagf}"
21
32
  end
22
33
 
23
34
  private
24
35
 
36
+ def dont_index_file(fname)
37
+ @config.is_ft_excluded(fname.partition('.').last) || @config.is_path_excluded(fname)
38
+ end
39
+
25
40
  def assert_executables
26
41
  %w(cat grep mv).each do |exe|
27
- if %x{command -v #{exe}}.empty?
42
+ if !ExecutableHelper.is_executable(exe)
28
43
  raise ExecutableNonExist, "tagrity depends on the executable #{exe}"
29
44
  end
30
45
  end
31
46
  end
47
+
48
+ def tagf
49
+ @config.tagf
50
+ end
32
51
  end
33
52
  end
@@ -1,3 +1,3 @@
1
1
  module Tagrity
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
data/tagrity.gemspec CHANGED
@@ -32,4 +32,5 @@ Gem::Specification.new do |spec|
32
32
  spec.add_development_dependency "bundler", "~> 2.0"
33
33
  spec.add_development_dependency "rake", "~> 10.0"
34
34
  spec.add_development_dependency "rspec", "~> 3.0"
35
+ spec.add_development_dependency "ripper-tags", "~> 0.8.0"
35
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tagrity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam P. Regasz-Rethy
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-05 00:00:00.000000000 Z
11
+ date: 2019-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: ripper-tags
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.8.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.8.0
83
97
  description: Ditto
84
98
  email:
85
99
  - rethy.spud@gmail.com
@@ -102,14 +116,15 @@ files:
102
116
  - exe/tagrity
103
117
  - lib/tagrity.rb
104
118
  - lib/tagrity/cli.rb
105
- - lib/tagrity/commands/restart.rb
106
119
  - lib/tagrity/commands/start.rb
107
120
  - lib/tagrity/commands/status.rb
108
121
  - lib/tagrity/commands/stop.rb
109
122
  - lib/tagrity/config_file.rb
123
+ - lib/tagrity/executable_helper.rb
110
124
  - lib/tagrity/file_callbacks.rb
111
125
  - lib/tagrity/pid_file.rb
112
126
  - lib/tagrity/process_helper.rb
127
+ - lib/tagrity/provider.rb
113
128
  - lib/tagrity/tag_generator.rb
114
129
  - lib/tagrity/version.rb
115
130
  - tagrity.gemspec
@@ -135,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
150
  - !ruby/object:Gem::Version
136
151
  version: '0'
137
152
  requirements: []
138
- rubygems_version: 3.0.6
153
+ rubygems_version: 3.0.3
139
154
  signing_key:
140
155
  specification_version: 4
141
156
  summary: Regenerate tags on file changes.
@@ -1,12 +0,0 @@
1
- module Tagrity
2
- module Command
3
- class Restart
4
- class << self
5
- def call(dir, fg)
6
- Command::Stop.call(dir)
7
- Command::Start.call(dir, fg)
8
- end
9
- end
10
- end
11
- end
12
- end