projectionist 0.2.0 → 0.3.0

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
  SHA1:
3
- metadata.gz: 16e6dea120ab5ed04934ba4eba2b806bb7914dae
4
- data.tar.gz: 99bf7258097f2de499f3d8eea2efe394c8244223
3
+ metadata.gz: 9337be5a0c417da30876568ce0719dbd92a30f5a
4
+ data.tar.gz: 9f1270e59465fac5cd6c8203a185613c7cbc2276
5
5
  SHA512:
6
- metadata.gz: c8999a092b56b9310d31d6165c6008e5fd1225829d233fc4324e25c71d41733a13dfd82f8abb07bd3335b34a342c1656f5379d36cb4339d380f954f337357c9c
7
- data.tar.gz: dd76f78c31bcfad72340011197e8768edaa6add7022655fefa86e9d33e70b44430a16fba98083c3bf07827b726be13e651653d412bd48c238fdc43684d0180ae
6
+ metadata.gz: 5ae8010ff3493f48a983e760d4ad2f602c348b0c682108045fe313efd15aa0f3fbe5ed748ebb70836cff83e347498bb782374f926189136838a7792894ef5b9e
7
+ data.tar.gz: 17d734a911774efb1997b66a4d1f774bc9d24f5201ef73c538b48298fbe3c541a0f46525f958db7dd0990d8d649c84799d61fc3987f977c9263479357fac1e8e
@@ -1,4 +1,5 @@
1
1
  {
2
+ "README.md": { "type": "readme" },
2
3
  "lib/*.rb": {
3
4
  "type": "lib",
4
5
  "alternate": "spec/{}_spec.rb"
@@ -13,16 +13,23 @@ module Projectionist
13
13
  exit 1
14
14
  end
15
15
 
16
- desc 'edit <type> <file>', 'Edit the file for <type> named <file>'
16
+ desc 'edit <type> [<file>]', 'Edit the file for <type> named <file>'
17
17
  option :editor
18
- def edit(type, file)
18
+ def edit(type, file='')
19
19
  file = @projections.file_for type, file
20
20
  exec "#{editor} #{file}"
21
21
  end
22
22
 
23
- desc 'list <type>', 'List all files for <type>'
23
+ desc 'list [-v|--verbose] <type>', 'List all files for <type>'
24
+ option :verbose, type: :boolean, aliases: '-v',
25
+ desc: "List full file paths instead of file names"
24
26
  def list(type)
25
- puts @projections.files_for(type).join("\n")
27
+ puts @projections.files_for(type, verbose: options[:verbose]).join("\n")
28
+ end
29
+
30
+ desc 'types', 'List all types'
31
+ def types
32
+ puts @projections.types.join("\n")
26
33
  end
27
34
 
28
35
  no_commands do
@@ -3,11 +3,10 @@ require 'projectionist/errors'
3
3
 
4
4
  module Projectionist
5
5
  class Projections
6
- attr_reader :types
7
6
  attr_reader :json_file_existed
8
7
 
9
8
  def initialize
10
- @types = {}
9
+ @type_hash = {}
11
10
  load_file
12
11
  end
13
12
 
@@ -18,28 +17,42 @@ module Projectionist
18
17
  if glob.include? '**/*'
19
18
  raise Projectionist::ProjectionError, 'Globs may not include `**/*`'
20
19
  end
21
- @types[options['type']] = options.merge('glob' => glob)
20
+ @type_hash[options['type']] = options.merge('glob' => glob)
22
21
  end
23
22
  end
24
23
 
25
24
  def type?(type)
26
- @types.key?(type)
25
+ @type_hash.key?(type)
27
26
  end
28
27
 
29
- def file_for(type, name)
28
+ def types
29
+ @type_hash.keys
30
+ end
31
+
32
+ def file_for(type, name='')
30
33
  return nil unless type? type
31
34
 
32
35
  Dir.chdir @basedir
33
- glob = build_glob(@types[type]['glob'], name)
36
+ glob = build_glob(@type_hash[type]['glob'], name)
34
37
  file = Dir.glob(glob)[0]
35
38
  File.expand_path(file.nil? ? glob : file)
36
39
  end
37
40
 
38
- def files_for(type)
41
+ def files_for(type, options = {})
39
42
  return [] unless type? type
40
- glob = @types[type]['glob']
41
- glob = glob.sub('/*', '/**/*') unless glob.include? '**'
42
- Dir.glob(glob).map { |p| File.expand_path p }
43
+
44
+ glob = glob_for type
45
+ files = Dir.glob(glob)
46
+ files.map do |p|
47
+ if options[:verbose]
48
+ File.expand_path(p)
49
+ else
50
+ p.match(glob_to_regex glob) do |m|
51
+ components = m.captures.reject(&:empty?).map { |s| s.sub('/', '') }
52
+ components.join('/')
53
+ end
54
+ end
55
+ end
43
56
  end
44
57
 
45
58
  private
@@ -77,5 +90,18 @@ module Projectionist
77
90
  glob.sub(/\*/, file)
78
91
  end
79
92
  end
93
+
94
+ def glob_for(type)
95
+ glob = @type_hash[type]['glob']
96
+ glob = glob.sub('/*', '/**/*') unless glob.include? '**'
97
+ glob
98
+ end
99
+
100
+
101
+ def glob_to_regex(glob)
102
+ glob.match(/(.*)[*]{2}\/(.*)/) do |m|
103
+ m[1] + '([^\x00]*?)' + m[2].gsub('*', '([^/\x00]*?)')
104
+ end
105
+ end
80
106
  end
81
107
  end
@@ -1,3 +1,3 @@
1
1
  module Projectionist
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -21,7 +21,7 @@ describe Projectionist::Projections do
21
21
  end
22
22
 
23
23
  it 'loads the list of types' do
24
- expect(@projections.types.keys).to eq ['test']
24
+ expect(@projections.types).to eq ['test']
25
25
  end
26
26
 
27
27
  it 'has a method to check if a given type exists' do
@@ -46,7 +46,7 @@ describe Projectionist::Projections do
46
46
  end
47
47
 
48
48
  it 'still loads the file' do
49
- expect(@projections.types.keys).to eq ['test']
49
+ expect(@projections.types).to eq ['test']
50
50
  end
51
51
 
52
52
  it 'still sets a flag that the file existed' do
@@ -76,8 +76,11 @@ describe Projectionist::Projections do
76
76
  end
77
77
 
78
78
  describe '#files_for' do
79
- let(:test_dir) { File.join(fixture_folder, 'test') }
80
- let(:test_files) { (1..10).map { |n| File.join(test_dir, "#{n}_test.rb") } }
79
+ let(:test_dir) { File.join(fixture_folder, 'test') }
80
+ let(:test_files) do
81
+ (1..10).map { |n| File.join(test_dir, "#{n}_test.rb") }
82
+ end
83
+ let(:test_filenames) { (1..10).map(&:to_s) }
81
84
 
82
85
  before do
83
86
  write_fixtures('test/*_test.rb' => { 'type' => 'test' })
@@ -96,7 +99,14 @@ describe Projectionist::Projections do
96
99
 
97
100
  context 'with a valid type' do
98
101
  it 'matches the correct files' do
99
- expect(@projections.files_for 'test').to match_array(test_files)
102
+ expect(@projections.files_for 'test').to match_array(test_filenames)
103
+ end
104
+ end
105
+
106
+ context 'with verbose: true' do
107
+ it 'returns the full filepaths' do
108
+ expect(@projections.files_for 'test', verbose: true)
109
+ .to match_array(test_files)
100
110
  end
101
111
  end
102
112
 
@@ -107,8 +117,9 @@ describe Projectionist::Projections do
107
117
  end
108
118
 
109
119
  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') }
120
+ let(:test_subdir) { File.join(test_dir, 'subdir') }
121
+ let(:test_file_subdir) { File.join(test_subdir, 'subdir_test.rb') }
122
+ let(:test_file_subdir_name) { 'subdir/subdir' }
112
123
  before do
113
124
  Dir.mkdir(test_subdir) unless Dir.exist? test_subdir
114
125
  File.open(test_file_subdir, 'w')
@@ -117,7 +128,7 @@ describe Projectionist::Projections do
117
128
  after { File.delete test_file_subdir }
118
129
 
119
130
  subject { @projections.files_for('test') }
120
- it { is_expected.to include test_file_subdir }
131
+ it { is_expected.to include test_file_subdir_name }
121
132
  end
122
133
  end
123
134
 
@@ -196,5 +207,18 @@ describe Projectionist::Projections do
196
207
  subject { @projections.file_for 'test', 'foobar/file' }
197
208
  it { is_expected.to eq test_file }
198
209
  end
210
+
211
+ context 'with singleton projections' do
212
+ let(:singleton_file) { File.join(fixture_folder, 'README.md') }
213
+ before do
214
+ write_fixtures('README.md' => { 'type' => 'readme' })
215
+ File.open(singleton_file, 'w')
216
+ Dir.chdir fixture_folder
217
+ @projections.load_file
218
+ end
219
+
220
+ subject { @projections.file_for 'readme' }
221
+ it { is_expected.to eq singleton_file }
222
+ end
199
223
  end
200
224
  end
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.2.0
4
+ version: 0.3.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-25 00:00:00.000000000 Z
11
+ date: 2014-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler