phtools 0.3.0.pre.alpha → 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: b2ba039340b6db82d48a60d8f61bc675ad8c7f55
4
- data.tar.gz: c68da1cc277fffea7af2746ec5c0a35301f7f03b
3
+ metadata.gz: 921ff0d0c9821c060f63be602f1ac915100cd08c
4
+ data.tar.gz: bd7b1d4d522b91cbf0e968660efc2cedafb27e0d
5
5
  SHA512:
6
- metadata.gz: 9417503eb41d424de70de88973b4f43c50778948bf2b41c6601b8a1e383ebbccd3a3e38b72b571abfc19d0f01cc3e4041efd1a82c5932a873759b279ca451739
7
- data.tar.gz: 1de101093f41bf5e058226a79fe21610a099ad53dc842880854c13fe714092f90bae814ea5879b91427752c32185a8d6294d531df1991aeae5a01c426d8dd8ee
6
+ metadata.gz: 8f76752ffec443ad1cfd8eed65ba440d83b2511f8152cf9c7bbf6e16d6cda16529729357189fce04888039e18761aaa5f327f98efefc880030259e0aee0bc29d
7
+ data.tar.gz: 87ac9775742fb7840b69e7a71d9c322c7d9f6184f4cb02e48a267728bcf6308b39fa47c183048e65dc17cb6e7808a3983a735dd704e5eadd58e119ea0ca01d0b
data/Guardfile CHANGED
@@ -5,16 +5,30 @@ notification :terminal_notifier, app_name: "phtools"
5
5
  # notification :terminal_title
6
6
  # notification :tmux, display_message: false
7
7
 
8
- guard 'cucumber', notification: true do
9
- watch(%r{^features/.+\.feature$})
10
- watch(%r{^features/support/.+$}) { 'features' }
11
- watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/{m[1]}.feature")][0] || 'features' }
12
- watch(%r{^bin/(.+)$}) { |m| "features/#{m[1]}.feature" }
13
- end
14
-
15
8
  guard :rspec, cmd: "bundle exec rspec" do
16
9
  watch(%r{^spec/.+_spec\.rb$})
17
10
  watch(%r{^bin/(.+)$}) { |m| "spec/#{m[1]}_spec.rb" }
18
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
19
- watch('spec/spec_helper.rb') { "spec" }
11
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
12
+ watch('spec/spec_helper.rb') { "spec" }
13
+ end
14
+
15
+ cucumber_options = {
16
+ # Below are examples overriding defaults
17
+ # cmd: 'bundle exec cucumber',
18
+ # cmd_additional_args: '--profile guard',
19
+ # all_after_pass: false,
20
+ # all_on_start: false,
21
+ # keep_failed: false,
22
+ # feature_sets: ['features/frontend', 'features/experimental'],
23
+ # run_all: { cmd_additional_args: '--profile guard_all' },
24
+ # focus_on: { 'wip' }, # @wip
25
+ notification: true
26
+ }
27
+
28
+ guard 'cucumber', cucumber_options do
29
+ watch(%r{^features/.+\.feature$})
30
+ watch(%r{^features/support/.+$}) { 'features' }
31
+ watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/{m[1]}.feature")][0] || 'features' }
32
+ watch(%r{^exe/(.+)$}) { |m| "features/#{m[1]}.feature" }
33
+ watch(%r{^lib/(.+)\.rb$}) { |m| "features/#{m[1]}.feature" }
20
34
  end
data/History.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # RELEASED
2
2
 
3
- ## [v0.3.0-alpha](https://github.com/andrewbiz/phtools/compare/v0.3.0-alpha...v0.2.4)
3
+ ## [v0.3.0.pre.alpha](https://github.com/andrewbiz/phtools/compare/v0.2.4...v0.3.0.pre.alpha)
4
4
 
5
5
  * Improved phtools - now it supports DIRs and FILEMASKs parameters
6
6
  * Added aruba (cucumber) tests for phls
data/README.md CHANGED
@@ -1,6 +1,49 @@
1
- # ANB's phtools
1
+ [![Version ](https://img.shields.io/gem/v/phtools.svg?style=flat)](https://rubygems.org/gems/phtools)
2
+ # PHTOOLS by ANB
3
+ A bundle of small CLI tools for arranging, renaming, tagging of the photo and video files. Helps keep photo-video assets in order.
2
4
 
3
- A bundle of small CLI tools for arranging, renaming, tagging of the photo and video files. Helps keep photo-video assets in order.
5
+ ##Installation
6
+ ### Install for usage
7
+ Get the latest [ruby](https://www.ruby-lang.org/) (>= 2.3) installed.
4
8
 
5
- ## Install for usage
6
- gem install phtools
9
+ Install ExifTool by Phil Harvey (http://www.sno.phy.queensu.ca/~phil/exiftool/)
10
+ ```
11
+ gem install phtools
12
+ ```
13
+ ### Install for development
14
+ Fork or download from GitHub.
15
+
16
+ ```sh
17
+ bundle install
18
+ ```
19
+ Develop, test:
20
+ ```sh
21
+ bundle exec rspec
22
+ bundle exec cucumber
23
+ ```
24
+ ... or do testing automatically to get real Test Driven Development:
25
+ ```sh
26
+ bundle exec guard
27
+ ```
28
+
29
+ ## PHTOOLS Use cases
30
+ ### Use Case 1. Collect photos, videos, raw-photos from different sources into one place (for further processing)
31
+
32
+ ####Given
33
+ I have copies of SD Cards with photos, videos taken with DSLR camera on my Hard Disk in `~/path/to/copy/SDCard1` and in `~/path/to/copy/SDCard2`.
34
+
35
+ And I have empty folder `~/Desktop/assets_staging` I would like to collect all the photo-files to.
36
+
37
+ ####When
38
+ I run:
39
+ ```sh
40
+ cd ~/Desktop/assets_staging
41
+ phls -R ~/path/to/copy/SDCard1 ~/path/to/copy/SDCard2 | phmove -a
42
+ ```
43
+
44
+ ####Then
45
+ I get all photos moved to `~/Desktop/assets_staging`.
46
+
47
+ And all videos are moved to `~/Desktop/assets_staging/VIDEO`.
48
+
49
+ And all raw photo-files are moved to `~/Desktop/assets_staging/RAW`.
data/TODO.md ADDED
@@ -0,0 +1,6 @@
1
+ - [x] core - runner.rb: print class instance variables in debug mode
2
+ - [x] phls: use init method to initialize variables
3
+ - [x] phls: change -r to -R
4
+ - [x] phmove: create phmove tool based on ftarrange code (see ftools repo)
5
+ - [ ] phmove: make parameters to set photo, video, raw folder names
6
+ - [ ] phmove: -a (--arrange) parameter means to put photo, video, raw files into separate folders inside target. If -a is not set all files are moved to target directory (plain collection of files)
data/exe/phls CHANGED
@@ -24,13 +24,13 @@ Example: #{tool_name} abc '*aaa*' | phrename -a anb => scans 'abc' folder and
24
24
  sends all found phtools friendly files filtered with *aaa* to phrename command.
25
25
 
26
26
  Usage:
27
- #{tool_name} [-D] [-r] [DIR_OR_FILEMASK...]
27
+ #{tool_name} [-D] [-R] [DIR_OR_FILEMASK...]
28
28
  #{tool_name} -h | --help
29
29
  #{tool_name} -v | --version
30
30
 
31
31
  Options:
32
32
  -D --debug Turn on debugging (verbose) mode
33
- -r --recursive Recursively scan directories
33
+ -R --recursive Recursively scan directories
34
34
  -h --help Show this screen.
35
35
  -v --version Show version.
36
36
  DOCOPT
data/exe/phmove ADDED
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # (c) ANB Andrew Bizyaev
4
+
5
+ module PhTools
6
+ tool_name = File.basename(__FILE__)
7
+ require "#{tool_name}"
8
+
9
+ file_type = FILE_TYPE_IMAGE + FILE_TYPE_VIDEO + FILE_TYPE_AUDIO
10
+ usage = <<DOCOPT
11
+ ***************************************************
12
+ phtools - *Keep Your Photos In Order* (c) ANB
13
+ ***************************************************
14
+ #{tool_name} moves input file(s) into WORKING_FOLDER
15
+ separating photo files, RAW photo files and VIDEO files in corresponding
16
+ subfolders.
17
+ phtools friendly files: #{file_type * ','}
18
+
19
+ Optimized to be used with other *phtools* via pipes.
20
+ Example: phls | phrename -a anb | #{tool_name}
21
+
22
+ Usage:
23
+ #{tool_name} [-w WORKING_FOLDER] [-D]
24
+ #{tool_name} -h | --help
25
+ #{tool_name} -v | --version
26
+
27
+ Options:
28
+ -w FLD --working_folder=FLD Folder the input files to be
29
+ moved to [default: .]
30
+ -D --debug Turn on debugging (verbose) mode
31
+ -h --help Show this screen.
32
+ -v --version Show version.
33
+ DOCOPT
34
+
35
+ PhTools.const_get(tool_name.capitalize).new(usage, file_type).run!
36
+ end
data/lib/phls.rb CHANGED
@@ -12,15 +12,8 @@ module PhTools
12
12
  end
13
13
 
14
14
  def run!
15
- dirs_to_scan = []
16
- filemasks = []
17
- @options_cli['DIR_OR_FILEMASK'].each do |item|
18
- File.directory?(item) ? dirs_to_scan << item : filemasks << item
19
- end
20
- dirs_to_scan = ['.'] if dirs_to_scan.empty?
21
- filemasks = ['*.*'] if filemasks.empty?
22
- dirs_to_scan.each do |dir|
23
- fmask = File.join(dir, @options_cli['--recursive'] ? '**' : '', "{#{filemasks * ','}}")
15
+ @dirs_to_scan.each do |dir|
16
+ fmask = File.join(dir, @options_cli['--recursive'] ? '**' : '', "{#{@filemasks * ','}}")
24
17
  Dir.glob(fmask, File::FNM_CASEFOLD).each { |f| output_file(f) if File.file?(f) }
25
18
  end
26
19
 
@@ -34,6 +27,16 @@ module PhTools
34
27
 
35
28
  private
36
29
 
30
+ def validate_options
31
+ @dirs_to_scan = []
32
+ @filemasks = []
33
+ @options_cli['DIR_OR_FILEMASK'].each do |item|
34
+ File.directory?(item) ? @dirs_to_scan << item : @filemasks << item
35
+ end
36
+ @dirs_to_scan = ['.'] if @dirs_to_scan.empty?
37
+ @filemasks = ['*.*'] if @filemasks.empty?
38
+ end
39
+
37
40
  def output_file(file)
38
41
  ftype = File.extname(file).empty? ? '' : File.extname(file).slice(1..-1).downcase
39
42
  @os.output(File.join(File.dirname(file), File.basename(file))) if @file_type.include?(ftype)
data/lib/phmove.rb ADDED
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # (c) ANB Andrew Bizyaev
4
+
5
+ require 'phtools/runner'
6
+
7
+ module PhTools
8
+ class Phmove < Runner
9
+ def self.about
10
+ "moves input files into working folder"
11
+ end
12
+ private
13
+
14
+ def validate_options
15
+ @working_folder = @options_cli['--working_folder'] || ''
16
+ @raw_folder = File.join(@working_folder, 'RAW')
17
+ @video_folder = File.join(@working_folder, 'VIDEO')
18
+ end
19
+
20
+ def process_before
21
+ fail PhTools::Error, "#{@working_folder} does not exist" unless File.exist?(@working_folder)
22
+ fail PhTools::Error, "#{@working_folder} is not a directory" unless File.directory?(@working_folder)
23
+ begin
24
+ Dir.mkdir @raw_folder unless Dir.exist?(@raw_folder)
25
+ Dir.mkdir @video_folder unless Dir.exist?(@video_folder)
26
+ rescue
27
+ raise PhTools::Error, "Unable to make dir inside '#{@working_folder}'"
28
+ end
29
+ end
30
+
31
+ def process_file(ftfile)
32
+ ftfile_out = ftfile.clone
33
+ file_type = ftfile.extname.slice(1..-1).downcase
34
+ case
35
+ when FILE_TYPE_IMAGE_NORMAL.include?(file_type)
36
+ ftfile_out.dirname = @working_folder
37
+ when FILE_TYPE_IMAGE_RAW.include?(file_type)
38
+ ftfile_out.dirname = @raw_folder
39
+ when FILE_TYPE_VIDEO.include?(file_type)
40
+ ftfile_out.dirname = @video_folder
41
+ when FILE_TYPE_AUDIO.include?(file_type)
42
+ ftfile_out.dirname = @working_folder
43
+ end
44
+
45
+ FileUtils.mv(ftfile.filename, ftfile_out.filename) unless ftfile == ftfile_out
46
+ ftfile_out
47
+ rescue SystemCallError => e
48
+ raise PhTools::Error, 'file moving - ' + e.message
49
+ end
50
+ end
51
+ end
@@ -27,10 +27,14 @@ module PhTools
27
27
  @options_cli = Docopt.docopt(usage, version: "v#{PhTools::VERSION}")
28
28
  @file_type = file_type
29
29
  PhTools.debug = true if @options_cli['--debug']
30
- PhTools.puts_error "OPTIONS = #{@options_cli}" if PhTools.debug
31
30
 
32
31
  validate_options
33
32
 
33
+ if PhTools.debug
34
+ STDERR.puts "Instance Variables: "
35
+ STDERR.puts context
36
+ end
37
+
34
38
  rescue Docopt::Exit => e
35
39
  STDERR.puts e.message
36
40
  exit 0
@@ -79,5 +83,11 @@ module PhTools
79
83
 
80
84
  def process_after
81
85
  end
86
+
87
+ def context
88
+ self.instance_variables.map do |item|
89
+ { item => self.instance_variable_get(item) }
90
+ end
91
+ end
82
92
  end
83
93
  end
@@ -1,4 +1,4 @@
1
1
 
2
2
  module PhTools
3
- VERSION = '0.3.0-alpha'
3
+ VERSION = '0.3.0'
4
4
  end
data/lib/phtools.rb CHANGED
@@ -2,13 +2,13 @@
2
2
  # encoding: UTF-8
3
3
  # (c) ANB Andrew Bizyaev
4
4
  require 'phtools/version'
5
- require 'pharrange'
6
5
  require 'phbackup'
7
6
  require 'phclname'
8
7
  require 'phevent'
9
8
  require 'phfixdate'
10
9
  require 'phfixfmd'
11
10
  require 'phls'
11
+ require 'phmove'
12
12
  require 'phmtags'
13
13
  require 'phrename'
14
14
  require 'phtagset'
@@ -19,7 +19,7 @@ module PhTools
19
19
  phtools v#{VERSION} is a bundle of small CLI tools for arranging, renaming, tagging
20
20
  of the photo and video files. Helps to keep your photo-video assets in order.
21
21
  Please run phtools in a terminal via CLI commands:
22
- pharrange\t(#{Phrename::about}),
22
+ phmove\t(#{Phmove::about}),
23
23
  phbackup\t(#{Phbackup::about}),
24
24
  phclname\t(#{Phclname::about}),
25
25
  phevent\t(#{Phevent::about}),
@@ -30,6 +30,7 @@ Please run phtools in a terminal via CLI commands:
30
30
  phrename \t(#{Phrename::about}),
31
31
  phtagset\t(#{Phtagset::about}).
32
32
  For more information run these commands with -h option.
33
+ General info about phtools usage see at https://github.com/AndrewBiz/phtools.git
33
34
  TEXT
34
35
  end
35
36
  end
data/phtools.gemspec CHANGED
@@ -33,7 +33,6 @@ Gem::Specification.new do |spec|
33
33
  spec.add_development_dependency 'cucumber', '~> 2.0'
34
34
  spec.add_development_dependency 'aruba', '~> 0.14'
35
35
  spec.add_development_dependency 'fuubar'
36
- spec.add_development_dependency 'rubocop'
37
36
  spec.add_development_dependency 'guard'
38
37
  spec.add_development_dependency 'guard-rspec'
39
38
  spec.add_development_dependency 'guard-cucumber'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phtools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0.pre.alpha
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Bizyaev
@@ -108,20 +108,6 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: rubocop
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
111
  - !ruby/object:Gem::Dependency
126
112
  name: guard
127
113
  requirement: !ruby/object:Gem::Requirement
@@ -254,6 +240,7 @@ email:
254
240
  - andrew.bizyaev@gmail.com
255
241
  executables:
256
242
  - phls
243
+ - phmove
257
244
  - phtools
258
245
  extensions: []
259
246
  extra_rdoc_files: []
@@ -267,18 +254,20 @@ files:
267
254
  - LICENSE.txt
268
255
  - README.md
269
256
  - Rakefile
257
+ - TODO.md
270
258
  - bin/console
271
259
  - bin/setup
272
260
  - bin/stmux
273
261
  - exe/phls
262
+ - exe/phmove
274
263
  - exe/phtools
275
- - lib/pharrange.rb
276
264
  - lib/phbackup.rb
277
265
  - lib/phclname.rb
278
266
  - lib/phevent.rb
279
267
  - lib/phfixdate.rb
280
268
  - lib/phfixfmd.rb
281
269
  - lib/phls.rb
270
+ - lib/phmove.rb
282
271
  - lib/phmtags.rb
283
272
  - lib/phrename.rb
284
273
  - lib/phtagset.rb
@@ -310,9 +299,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
310
299
  version: 2.0.0
311
300
  required_rubygems_version: !ruby/object:Gem::Requirement
312
301
  requirements:
313
- - - ">"
302
+ - - ">="
314
303
  - !ruby/object:Gem::Version
315
- version: 1.3.1
304
+ version: '0'
316
305
  requirements:
317
306
  - ExifTool by Phil Harvey (http://www.sno.phy.queensu.ca/~phil/exiftool/)
318
307
  rubyforge_project:
data/lib/pharrange.rb DELETED
@@ -1,13 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
- # (c) ANB Andrew Bizyaev
4
-
5
- require 'phtools/runner'
6
-
7
- module PhTools
8
- class Pharrange < Runner
9
- def self.about
10
- "!UNDER CONSTRUCTION!"
11
- end
12
- end
13
- end