projectionist 0.1.2 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e6d516e8da9c41857b4ccabac75f9fd33c1af027
4
- data.tar.gz: 20a1755d7801fd40f3a02a70932aba96c940142b
3
+ metadata.gz: 16e6dea120ab5ed04934ba4eba2b806bb7914dae
4
+ data.tar.gz: 99bf7258097f2de499f3d8eea2efe394c8244223
5
5
  SHA512:
6
- metadata.gz: 82a89e17bd7a518f3a358174996ce649c487740c88b932109de623d2dd0e3a4ed4bb78911ecab707920ac69ba33f071538ee79bf25ff732bd466aee2c4890339
7
- data.tar.gz: 370a88d3fcb609bc182fc374f0e743d76ee534d5df0d87ff019f81bae22e1e8201f2d24d7c1f159960405d1dc1c8857c4fa016e6fe2cd5d7785a127c322ccab4
6
+ metadata.gz: c8999a092b56b9310d31d6165c6008e5fd1225829d233fc4324e25c71d41733a13dfd82f8abb07bd3335b34a342c1656f5379d36cb4339d380f954f337357c9c
7
+ data.tar.gz: dd76f78c31bcfad72340011197e8768edaa6add7022655fefa86e9d33e70b44430a16fba98083c3bf07827b726be13e651653d412bd48c238fdc43684d0180ae
data/.projections.json CHANGED
@@ -1,5 +1,6 @@
1
1
  {
2
- "lib/**/*.rb": {
3
- "type": "lib"
2
+ "lib/*.rb": {
3
+ "type": "lib",
4
+ "alternate": "spec/{}_spec.rb"
4
5
  }
5
6
  }
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  # Projectionist
7
7
 
8
- Command-line interface to the [.projections.json](https://github.com/tpope/vim-projectionist) format - WIP
8
+ Quickly edit project files using the [.projections.json](https://github.com/tpope/vim-projectionist) format
9
9
 
10
10
  ## Installation
11
11
 
@@ -29,12 +29,5 @@ The command to edit `lib/whatever/test.rb` would be:
29
29
 
30
30
  $ prj edit lib whatever/test
31
31
 
32
-
33
- ## Contributing
34
-
35
- 1. [Fork it](https://github.com/glittershark/projectionist/fork)
36
- 2. Create your feature branch (`git checkout -b my-new-feature`)
37
- 3. Commit your changes (`git commit -am 'Add some feature'`)
38
- 4. Push to the branch (`git push origin my-new-feature`)
39
- 5. Create a new Pull Request
32
+ Note that there are two glob components here - `**` and `*`. When editing files, these components are separated by a `/`
40
33
 
data/lib/projectionist.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'projectionist/version'
2
2
  require 'projectionist/projections'
3
3
  require 'projectionist/cli'
4
+ require 'projectionist/errors'
4
5
 
5
6
  module Projectionist
6
7
  end
@@ -8,19 +8,28 @@ module Projectionist
8
8
  def initialize(*)
9
9
  @projections = Projectionist::Projections.new
10
10
  super
11
+ rescue Projectionist::ProjectionError => error
12
+ $stderr.puts "ERROR: #{error.message}"
13
+ exit 1
11
14
  end
12
15
 
13
16
  desc 'edit <type> <file>', 'Edit the file for <type> named <file>'
14
17
  option :editor
15
18
  def edit(type, file)
16
- editor = options[:editor] || ENV['EDITOR'] || `which vim`
17
19
  file = @projections.file_for type, file
18
- exec editor, file
20
+ exec "#{editor} #{file}"
19
21
  end
20
22
 
21
23
  desc 'list <type>', 'List all files for <type>'
22
24
  def list(type)
23
25
  puts @projections.files_for(type).join("\n")
24
26
  end
27
+
28
+ no_commands do
29
+ def editor
30
+ editor = options[:editor] || ENV['VISUAL'] || ENV['EDITOR'] || 'vim'
31
+ editor.empty? ? 'vim' : editor
32
+ end
33
+ end
25
34
  end
26
35
  end
@@ -0,0 +1,4 @@
1
+ module Projectionist
2
+ class ProjectionError < Exception
3
+ end
4
+ end
@@ -1,4 +1,5 @@
1
1
  require 'json'
2
+ require 'projectionist/errors'
2
3
 
3
4
  module Projectionist
4
5
  class Projections
@@ -14,6 +15,9 @@ module Projectionist
14
15
  @json = get_json path
15
16
  @json.each do |glob, options|
16
17
  next unless options.key? 'type'
18
+ if glob.include? '**/*'
19
+ raise Projectionist::ProjectionError, 'Globs may not include `**/*`'
20
+ end
17
21
  @types[options['type']] = options.merge('glob' => glob)
18
22
  end
19
23
  end
@@ -33,7 +37,9 @@ module Projectionist
33
37
 
34
38
  def files_for(type)
35
39
  return [] unless type? type
36
- Dir.glob(@types[type]['glob']).map { |p| File.expand_path p }
40
+ glob = @types[type]['glob']
41
+ glob = glob.sub('/*', '/**/*') unless glob.include? '**'
42
+ Dir.glob(glob).map { |p| File.expand_path p }
37
43
  end
38
44
 
39
45
  private
@@ -63,9 +69,13 @@ module Projectionist
63
69
  def build_glob(glob, file)
64
70
  # Split the passed file by `/`, then replace all globs that use `*` or
65
71
  # `**` with components of the passed file, in order
66
- file_components = file.split('/')
67
- glob_components = glob.split(/\*+/)
68
- glob_components.zip(file_components).flatten.compact.join('')
72
+ if glob.include? '**'
73
+ file_components = file.split('/')
74
+ glob_components = glob.split(/\*+/)
75
+ glob_components.zip(file_components).flatten.compact.join('')
76
+ else
77
+ glob.sub(/\*/, file)
78
+ end
69
79
  end
70
80
  end
71
81
  end
@@ -1,3 +1,3 @@
1
1
  module Projectionist
2
- VERSION = '0.1.2'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -66,21 +66,28 @@ describe Projectionist::Projections do
66
66
  expect(@projections.json_file_existed).to be false
67
67
  end
68
68
  end
69
+
70
+ context 'with `**/*` in projections' do
71
+ before { write_fixtures('test/**/*.rb' => { 'type' => 'disallowed' }) }
72
+ it 'raises an error' do
73
+ expect { @projections.load_file }.to raise_error Projectionist::ProjectionError
74
+ end
75
+ end
69
76
  end
70
77
 
71
78
  describe '#files_for' do
72
79
  let(:test_dir) { File.join(fixture_folder, 'test') }
73
- let(:test_files) { (1..10).map { |n| File.join(test_dir, "test_#{n}.rb") } }
80
+ let(:test_files) { (1..10).map { |n| File.join(test_dir, "#{n}_test.rb") } }
74
81
 
75
82
  before do
76
- write_fixtures('test/test_*.rb' => { 'type' => 'test' })
83
+ write_fixtures('test/*_test.rb' => { 'type' => 'test' })
77
84
  Dir.mkdir(test_dir) unless Dir.exist? test_dir
78
85
 
79
86
  test_files.each { |f| File.open(f, 'w') }
80
87
 
81
88
  # make bad test files as well
82
89
  5.times do |n|
83
- file = File.join(test_dir, "bad_#{n}.rb")
90
+ file = File.join(test_dir, "#{n}_bad.rb")
84
91
  File.open(file, 'w')
85
92
  end
86
93
 
@@ -98,6 +105,20 @@ describe Projectionist::Projections do
98
105
  expect(@projections.files_for 'toast').to eq []
99
106
  end
100
107
  end
108
+
109
+ context 'with files in child directories' do
110
+ let(:test_subdir) { File.join(test_dir, 'subdir') }
111
+ let(:test_file_subdir) { File.join(test_subdir, 'subdir_test.rb') }
112
+ before do
113
+ Dir.mkdir(test_subdir) unless Dir.exist? test_subdir
114
+ File.open(test_file_subdir, 'w')
115
+ end
116
+
117
+ after { File.delete test_file_subdir }
118
+
119
+ subject { @projections.files_for('test') }
120
+ it { is_expected.to include test_file_subdir }
121
+ end
101
122
  end
102
123
 
103
124
  describe '#file_for' do
@@ -142,6 +163,18 @@ describe Projectionist::Projections do
142
163
  end
143
164
  end
144
165
 
166
+ context 'with files in child directories' do
167
+ let(:test_subdir) { File.join(test_dir, 'subdir') }
168
+ let(:test_file_subdir) { File.join(test_subdir, 'file.rb') }
169
+ before do
170
+ Dir.mkdir(test_subdir) unless Dir.exist? test_subdir
171
+ File.open(test_file_subdir, 'w')
172
+ end
173
+
174
+ subject { @projections.file_for('test', 'subdir/file') }
175
+ it { is_expected.to eq test_file_subdir }
176
+ end
177
+
145
178
  context 'in a child directory' do
146
179
  before { Dir.chdir test_dir }
147
180
  subject { @projections.file_for('test', 'file') }
@@ -149,7 +182,7 @@ describe Projectionist::Projections do
149
182
  end
150
183
  end
151
184
 
152
- context 'with multi-level globs' do
185
+ context 'with advanced globs' do
153
186
  let(:test_dir) { File.join(fixture_folder, 'test', 'foobar') }
154
187
  let(:test_file) { File.join(test_dir, 'test_file.rb') }
155
188
  before do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: projectionist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Griffin Smith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-23 00:00:00.000000000 Z
11
+ date: 2014-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -107,6 +107,7 @@ files:
107
107
  - bin/prj
108
108
  - lib/projectionist.rb
109
109
  - lib/projectionist/cli.rb
110
+ - lib/projectionist/errors.rb
110
111
  - lib/projectionist/projections.rb
111
112
  - lib/projectionist/version.rb
112
113
  - projectionist.gemspec