phtools 0.1.3 → 0.2.4

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: 998582dae8dbeee3d7c85f4cd2d0f9c14e95e6ba
4
- data.tar.gz: faaf2914ce1a47e80f3073c34c43f1c4d82b9ec1
3
+ metadata.gz: f2b4a9e0f8e817daa66178993aa0d7338cc4640f
4
+ data.tar.gz: d5ebce5d0aa61183a4e018ae04c2d59b20673980
5
5
  SHA512:
6
- metadata.gz: 5c35a0c6b213ad620bc4b5c415e15c1b9112e65763e5abe9c556366689fb07055916fa0b43c664854080a6aac31e958a942ee5fe7925891fcb53e7ebf8e0dc42
7
- data.tar.gz: e04e6748f214094502ebaacdd96834c50e07f1171ea83b5f95e82e0aca59e3c8911b68346210e3192a75ba5f5ba33106eea919c83ca89629dcfe38725f3652f2
6
+ metadata.gz: bb219b0a0dca4df74ce3ac11af40ce59893076a6c8c0c353d14e4951c97233aad4da2f50fb0cde74c26042aca13dc14fccc4ce60fad66c1d03ea2f1cf39960c6
7
+ data.tar.gz: 702e6dd55560a82cc537589a830c610f17c90be5f03ff4c2c6347b364f8f0ca31af867e9722bf63332da4b90fdb959d13031c657586857625bcf8b3bc5659684
data/exe/phls 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} scans given directories and
15
+ generates list of files to standard output.
16
+ In short it acts like a smart 'ls' command (or 'dir' in Windows).
17
+ It is a good starting point for all other phtools to be used with pipes.
18
+ phtools friendly files: #{file_type * ','}
19
+
20
+ Example: #{tool_name} -r abc |ftclname => recursively scans 'abc' dir and
21
+ sends all found phtools friendly files to ftclname command.
22
+
23
+ Usage:
24
+ #{tool_name} [-D] [-r] [DIR_OR_FILE...]
25
+ #{tool_name} -h | --help
26
+ #{tool_name} -v | --version
27
+
28
+ Options:
29
+ -D --debug Turn on debugging (verbose) mode
30
+ -r --recursive Recursively scan directories
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/pharrange.rb ADDED
@@ -0,0 +1,13 @@
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
data/lib/phbackup.rb ADDED
@@ -0,0 +1,13 @@
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 Phbackup < Runner
9
+ def self.about
10
+ "!UNDER CONSTRUCTION!"
11
+ end
12
+ end
13
+ end
data/lib/phclname.rb ADDED
@@ -0,0 +1,13 @@
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 Phclname < Runner
9
+ def self.about
10
+ "!UNDER CONSTRUCTION!"
11
+ end
12
+ end
13
+ end
data/lib/phevent.rb ADDED
@@ -0,0 +1,13 @@
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 Phevent < Runner
9
+ def self.about
10
+ "!UNDER CONSTRUCTION!"
11
+ end
12
+ end
13
+ end
data/lib/phfixdate.rb ADDED
@@ -0,0 +1,13 @@
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 Phfixdate < Runner
9
+ def self.about
10
+ "!UNDER CONSTRUCTION!"
11
+ end
12
+ end
13
+ end
data/lib/phfixfmd.rb ADDED
@@ -0,0 +1,13 @@
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 Phfixfmd < Runner
9
+ def self.about
10
+ "!UNDER CONSTRUCTION!"
11
+ end
12
+ end
13
+ end
data/lib/phls.rb ADDED
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # (c) ANB Andrew Bizyaev
4
+
5
+ require 'phtools/runner'
6
+
7
+ module PhTools
8
+ # list generation
9
+ class Phls < Runner
10
+ def self.about
11
+ %Q{generates list of phtools friendly files}
12
+ end
13
+
14
+ def run!
15
+ @options_cli['DIR_OR_FILE'] = ['.'] if @options_cli['DIR_OR_FILE'].empty?
16
+ @options_cli['DIR_OR_FILE'].each do |item|
17
+ if File.exist?(item)
18
+ File.directory?(item) ? output_dir(item) : output_file(item)
19
+ end
20
+ end
21
+
22
+ rescue SignalException
23
+ PhTools.puts_error 'EXIT on user interrupt Ctrl-C'
24
+ exit 1
25
+ rescue => e
26
+ PhTools.puts_error "FATAL: #{e.message}", e
27
+ exit 1
28
+ end
29
+
30
+ private
31
+
32
+ def output_dir(item)
33
+ fmask = File.join(item, @options_cli['--recursive'] ? '**' : '',
34
+ "{#{@file_type.map { |i| "*.#{i}" } * ','}}")
35
+ files_to_process = Dir.glob(fmask, File::FNM_CASEFOLD |
36
+ File::FNM_DOTMATCH)
37
+ files_to_process.each { |f| output_file(f) }
38
+ end
39
+
40
+ def output_file(file)
41
+ @os.output(File.join(File.dirname(file), File.basename(file))) if
42
+ @file_type.include?(File.extname(file).slice(1..-1).downcase)
43
+ end
44
+ end
45
+ end
data/lib/phmtags.rb ADDED
@@ -0,0 +1,13 @@
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 Phmtags < Runner
9
+ def self.about
10
+ "!UNDER CONSTRUCTION!"
11
+ end
12
+ end
13
+ end
data/lib/phrename.rb ADDED
@@ -0,0 +1,13 @@
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 Phrename < Runner
9
+ def self.about
10
+ "!UNDER CONSTRUCTION!"
11
+ end
12
+ end
13
+ end
data/lib/phtagset.rb ADDED
@@ -0,0 +1,13 @@
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 Phtagset < Runner
9
+ def self.about
10
+ "!UNDER CONSTRUCTION!"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # (c) ANB Andrew Bizyaev
4
+
5
+ require 'nesty'
6
+
7
+ # Foto tools
8
+ module PhTools
9
+ @debug = false
10
+ def self.debug=(val)
11
+ @debug = val
12
+ end
13
+
14
+ def self.debug
15
+ @debug
16
+ end
17
+
18
+ def self.puts_error(msg, e = nil)
19
+ prefix = File.basename($PROGRAM_NAME, '.rb')
20
+ STDERR.puts "#{prefix}: #{msg}"
21
+ if @debug && !e.nil?
22
+ if e.respond_to?(:cause) && !e.cause.nil?
23
+ STDERR.puts "#{prefix}: CAUSE: #{e.cause} - #{e.cause.message}"
24
+ end
25
+ e.backtrace.each do |b|
26
+ STDERR.puts "#{prefix}: BACKTRACE: #{b}"
27
+ end
28
+ end
29
+ end
30
+
31
+ class Error < Nesty::NestedStandardError; end
32
+ class ExiftoolTagger < Error; end
33
+ end
@@ -0,0 +1,226 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # (c) ANB Andrew Bizyaev
4
+
5
+ require 'phtools/error'
6
+ require 'date'
7
+ require 'fileutils'
8
+
9
+ # Foto tools
10
+ module PhTools
11
+ # media type constants
12
+ FILE_TYPE_IMAGE_NORMAL = %w{jpg jpeg tif tiff png}
13
+ FILE_TYPE_IMAGE_RAW = %w{orf arw dng}
14
+ FILE_TYPE_IMAGE = FILE_TYPE_IMAGE_NORMAL + FILE_TYPE_IMAGE_RAW
15
+ FILE_TYPE_VIDEO = %w{avi mp4 mpg mts dv mov mkv m2t m2ts}
16
+ FILE_TYPE_AUDIO = %w{wav}
17
+
18
+ # phtools file name operations
19
+ class FTFile
20
+ include Comparable
21
+
22
+ # filename constants
23
+ NICKNAME_MIN_SIZE = 3
24
+ NICKNAME_MAX_SIZE = 6
25
+ NICKNAME_SIZE = 3 # should be in range of MIN and MAX
26
+ ZERO_DATE = DateTime.new(0)
27
+
28
+ def self.validate_file!(filename, file_type)
29
+ fail PhTools::Error, 'does not exist' unless
30
+ filename && File.exist?(filename)
31
+ fail PhTools::Error, 'not a file' if File.directory?(filename)
32
+ fail PhTools::Error, 'no permission to write' unless
33
+ File.writable_real?(filename)
34
+ fail PhTools::Error, 'unsupported type' unless
35
+ file_type.include?(File.extname(filename).slice(1..-1).downcase)
36
+ end
37
+
38
+ def self.validate_author(author)
39
+ case
40
+ when author.size != NICKNAME_SIZE
41
+ return [false, "'#{author}' wrong author size, should be #{NICKNAME_SIZE} chars long"]
42
+ when /[-_\s]/.match(author)
43
+ return [false, "'#{author}' author should not contain spaces [_- ]"]
44
+ when /[\d]/.match(author)
45
+ return [false, "'#{author}' author should not contain digits"]
46
+ when /[\W]/.match(author)
47
+ return [false, "'#{author}' author should contain only ASCII chars"]
48
+ end
49
+ [true, '']
50
+ end
51
+
52
+ attr_reader :filename, :dirname, :extname, :basename, :basename_part,
53
+ :basename_clean, :date_time, :author
54
+
55
+ def initialize(filename)
56
+ set_state(filename)
57
+ end
58
+
59
+ def to_s
60
+ "#{@filename}"
61
+ end
62
+
63
+ def <=>(other)
64
+ @filename <=> other.filename
65
+ end
66
+
67
+ def basename_standard(basename_clean: @basename_clean,
68
+ date_time: @date_time,
69
+ author: @author)
70
+ %Q{#{date_time.strftime('%Y%m%d-%H%M%S')}_#{(author.upcase + "XXXXXX")[0, NICKNAME_SIZE]} #{basename_clean}}
71
+ end
72
+
73
+ def basename_is_standard?
74
+ @basename == basename_standard
75
+ end
76
+
77
+ def standardize(dirname: @dirname, basename_clean: @basename_clean,
78
+ extname: @extname, date_time: @date_time,
79
+ author: @author)
80
+ File.join(dirname,
81
+ basename_standard(basename_clean: basename_clean,
82
+ date_time: date_time,
83
+ author: author) + extname)
84
+ end
85
+
86
+ def standardize!(dirname: @dirname, basename_clean: @basename_clean,
87
+ extname: @extname, date_time: @date_time,
88
+ author: @author)
89
+
90
+ filename = standardize(dirname: dirname, basename_clean: basename_clean,
91
+ extname: extname, date_time: date_time,
92
+ author: author)
93
+ set_state(filename)
94
+ filename
95
+ end
96
+
97
+ def cleanse(dirname: @dirname, basename_clean: @basename_clean,
98
+ extname: @extname)
99
+ File.join(dirname, basename_clean + extname)
100
+ end
101
+
102
+ def cleanse!(dirname: @dirname, basename_clean: @basename_clean,
103
+ extname: @extname)
104
+ filename = cleanse(dirname: dirname, basename_clean: basename_clean,
105
+ extname: extname)
106
+ set_state(filename)
107
+ filename
108
+ end
109
+
110
+ def dirname=(dirname = @dirname)
111
+ @dirname = dirname
112
+ @filename = File.join(@dirname, @basename + @extname)
113
+ end
114
+
115
+ def date_time_ok?
116
+ @date_time != ZERO_DATE
117
+ end
118
+
119
+ def date_time_to_time
120
+ Time.new(@date_time.year, @date_time.month, @date_time.day,
121
+ @date_time.hour, @date_time.min, @date_time.sec)
122
+ # no use of @date_time.zone - assuming file's timezone always
123
+ # equals to photografer's computer timezone
124
+ end
125
+
126
+ private
127
+
128
+ def set_state(filename)
129
+ @dirname = File.dirname(filename)
130
+ @extname = File.extname(filename)
131
+ @basename = File.basename(filename, @extname)
132
+ @filename = File.join(@dirname, @basename + @extname)
133
+ parse_basename
134
+ @basename_clean = @basename_part[:clean]
135
+ @date_time = reveal_date_time
136
+ @author = @basename_part[:author] || ''
137
+ end
138
+
139
+ def reveal_date_time
140
+ date = @basename_part[:date]
141
+ time = @basename_part[:time]
142
+ strptime_template = ''
143
+ strptime_string = ''
144
+ case date.size
145
+ when 4 # expecting Year e.g.2001
146
+ strptime_template += '%Y'
147
+ strptime_string += date
148
+ when 8 # expecting YYmmdd e.g.20010101
149
+ strptime_template += '%Y%m%d'
150
+ strptime_string += date
151
+ end
152
+ case time.size
153
+ when 4 # expecting HHMM e.g. 1025
154
+ strptime_template += '%H%M'
155
+ strptime_string += time
156
+ when 6 # expecting YHHMMSS e.g.102559
157
+ strptime_template += '%H%M%S'
158
+ strptime_string += time
159
+ end
160
+
161
+ return ZERO_DATE if strptime_string.empty?
162
+ DateTime.strptime(strptime_string, strptime_template)
163
+
164
+ rescue ArgumentError
165
+ return ZERO_DATE
166
+ end
167
+
168
+ def parse_basename
169
+ default = { prefix: '', clean: '', date: '',
170
+ time: '', author: '', id: '', flags: '' }
171
+ case @basename
172
+ # check YYYYmmdd-HHMMSS_AUT[ID]{FLAGS}cleanname
173
+ when /^(?<prefix>(?<date>\d{8})-(?<time>\d{6})_(?<author>\w{#{NICKNAME_MIN_SIZE},#{NICKNAME_MAX_SIZE}})\[(?<id>.*)\]\{(?<flags>.*)\})(?<clean>.*)/
174
+ @basename_part = default.merge(prefix: Regexp.last_match(:prefix),
175
+ clean: Regexp.last_match(:clean),
176
+ date: Regexp.last_match(:date),
177
+ time: Regexp.last_match(:time),
178
+ author: Regexp.last_match(:author),
179
+ id: Regexp.last_match(:id),
180
+ flags: Regexp.last_match(:flags))
181
+
182
+ # check YYYYmmdd-HHMMSS_AUT[ID]cleanname
183
+ when /^(?<prefix>(?<date>\d{8})-(?<time>\d{6})_(?<author>\w{#{NICKNAME_MIN_SIZE},#{NICKNAME_MAX_SIZE}})\[(?<id>.*)\])(?<clean>.*)/
184
+ @basename_part = default.merge(prefix: Regexp.last_match(:prefix),
185
+ clean: Regexp.last_match(:clean),
186
+ date: Regexp.last_match(:date),
187
+ time: Regexp.last_match(:time),
188
+ author: Regexp.last_match(:author),
189
+ id: Regexp.last_match(:id))
190
+ # STANDARD template
191
+ # check YYYYmmdd-HHMMSS_AUT cleanname
192
+ when /^(?<prefix>(?<date>\d{8})-(?<time>\d{6})_(?<author>\w{#{NICKNAME_MIN_SIZE},#{NICKNAME_MAX_SIZE}})[-\s_])(?<clean>.*)/
193
+ @basename_part = default.merge(prefix: Regexp.last_match(:prefix),
194
+ clean: Regexp.last_match(:clean),
195
+ date: Regexp.last_match(:date),
196
+ time: Regexp.last_match(:time),
197
+ author: Regexp.last_match(:author))
198
+ # check if name = YYYYmmdd-HHMM_AAA_name
199
+ when /^(?<prefix>(?<date>\d{8})-(?<time>\d{4})[-\s_](?<author>\w{#{NICKNAME_MIN_SIZE},#{NICKNAME_MAX_SIZE}})[-\s_])(?<clean>.*)/
200
+ @basename_part = default.merge(prefix: Regexp.last_match(:prefix),
201
+ clean: Regexp.last_match(:clean),
202
+ date: Regexp.last_match(:date),
203
+ time: Regexp.last_match(:time),
204
+ author: Regexp.last_match(:author))
205
+ # check if name = YYYYmmdd-HHMM_name
206
+ when /^(?<prefix>(?<date>\d{8})-(?<time>\d{4})[-\s_])(?<clean>.*)/
207
+ @basename_part = default.merge(prefix: Regexp.last_match(:prefix),
208
+ clean: Regexp.last_match(:clean),
209
+ date: Regexp.last_match(:date),
210
+ time: Regexp.last_match(:time))
211
+ # check if name = YYYYmmdd_name
212
+ when /^(?<prefix>(?<date>\d{8})[-\s_])(?<clean>.*)/
213
+ @basename_part = default.merge(prefix: Regexp.last_match(:prefix),
214
+ clean: Regexp.last_match(:clean),
215
+ date: Regexp.last_match(:date))
216
+ # check if name = YYYY_name
217
+ when /^(?<prefix>(?<date>\d{4})[-\s_])(?<clean>.*)/
218
+ @basename_part = default.merge(prefix: Regexp.last_match(:prefix),
219
+ clean: Regexp.last_match(:clean),
220
+ date: Regexp.last_match(:date))
221
+ else
222
+ @basename_part = default.merge(clean: @basename)
223
+ end
224
+ end
225
+ end
226
+ end
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # (c) ANB Andrew Bizyaev
4
+
5
+ require 'phtools/version'
6
+ require 'phtools/utils/ruby_version.rb'
7
+ require 'phtools/utils/os_win.rb'
8
+ require 'phtools/utils/os_unix.rb'
9
+ require 'phtools/error.rb'
10
+ require 'phtools/ph_file.rb'
11
+ require 'docopt'
12
+
13
+ # Foto Tools
14
+ module PhTools
15
+ # Main class processing input stream
16
+ class Runner
17
+ def initialize(usage, file_type = [])
18
+ case Utils.os
19
+ when :windows
20
+ # workaround for win32
21
+ ARGV.map! { |a| a.encode('utf-8', 'filesystem') }
22
+ @os = Utils::OSWin.new
23
+ else
24
+ @os = Utils::OSUnix.new
25
+ end
26
+ @tool_name = File.basename($PROGRAM_NAME)
27
+ @options_cli = Docopt.docopt(usage, version: "v#{PhTools::VERSION}")
28
+ @file_type = file_type
29
+ PhTools.debug = true if @options_cli['--debug']
30
+ PhTools.puts_error "OPTIONS = #{@options_cli}" if PhTools.debug
31
+
32
+ validate_options
33
+
34
+ rescue Docopt::Exit => e
35
+ STDERR.puts e.message
36
+ exit 0
37
+ rescue => e
38
+ PhTools.puts_error "FATAL: #{e.message}", e
39
+ exit 1
40
+ end
41
+
42
+ def run!
43
+ return if STDIN.tty?
44
+ ARGV.clear
45
+ process_before
46
+
47
+ ARGF.each_line do |line|
48
+ filename = line.chomp
49
+ begin
50
+ FTFile.validate_file!(filename, @file_type)
51
+ ftfile = FTFile.new(filename)
52
+ @os.output process_file(ftfile)
53
+ rescue PhTools::Error => e
54
+ PhTools.puts_error "ERROR: '#{filename}' - #{e.message}", e
55
+ end
56
+ end
57
+
58
+ process_after
59
+
60
+ rescue SignalException
61
+ PhTools.puts_error 'EXIT on user interrupt Ctrl-C'
62
+ exit 1
63
+ rescue => e
64
+ PhTools.puts_error "FATAL: #{e.message}", e
65
+ exit 1
66
+ end
67
+
68
+ private
69
+
70
+ def validate_options
71
+ end
72
+
73
+ def process_before
74
+ end
75
+
76
+ def process_file(file)
77
+ file
78
+ end
79
+
80
+ def process_after
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # (c) ANB Andrew Bizyaev
4
+
5
+ require 'rbconfig'
6
+
7
+ # foto tools
8
+ module Utils
9
+ # determine OS
10
+ def self.os(os_string = RbConfig::CONFIG['host_os'])
11
+ case os_string
12
+ when /darwin/i then :macosx
13
+ when /linux/i then :linux
14
+ when /mswin|mingw|w32/i then :windows
15
+ else :unknown
16
+ end
17
+ end
18
+
19
+ # OS specific output implementation
20
+ class OS
21
+ def output(message)
22
+ STDOUT.puts prepare(message)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # (c) ANB Andrew Bizyaev
4
+ require 'phtools/utils/os'
5
+
6
+ module Utils
7
+ # Unix specific functions
8
+ class OSUnix < OS
9
+ private
10
+
11
+ def prepare(message)
12
+ message.to_s
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # (c) ANB Andrew Bizyaev
4
+
5
+ require 'phtools/utils/os'
6
+
7
+ module Utils
8
+ # OS platfor related logic
9
+ class OSWin < OS
10
+
11
+ private
12
+
13
+ def prepare(message)
14
+ message.to_s.gsub(/#{"/"}/, '\\')
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ # (c) ANB Andrew Bizyaev
4
+
5
+ RUBY_VERSION_WANTED = '2.0.0'
6
+
7
+ begin
8
+ fail "Ruby version must be >= #{RUBY_VERSION_WANTED}" if
9
+ RUBY_VERSION < RUBY_VERSION_WANTED
10
+ rescue => e
11
+ STDERR.puts e.message
12
+ exit 1
13
+ end
@@ -1,4 +1,4 @@
1
1
 
2
2
  module PhTools
3
- VERSION = '0.1.3'
3
+ VERSION = '0.2.4'
4
4
  end
data/lib/phtools.rb CHANGED
@@ -1,10 +1,35 @@
1
1
  #!/usr/bin/env ruby
2
2
  # encoding: UTF-8
3
3
  # (c) ANB Andrew Bizyaev
4
- require "phtools/version"
4
+ require 'phtools/version'
5
+ require 'pharrange'
6
+ require 'phbackup'
7
+ require 'phclname'
8
+ require 'phevent'
9
+ require 'phfixdate'
10
+ require 'phfixfmd'
11
+ require 'phls'
12
+ require 'phmtags'
13
+ require 'phrename'
14
+ require 'phtagset'
5
15
 
6
16
  module PhTools
7
17
  def self.about
8
- %Q{\nphtools v#{PhTools::VERSION} is a bundle of small CLI tools for arranging, renaming, tagging of the photo and video files. Helps to keep your photo-video assets in order. \nPlease run phtools in a terminal via CLI commands: phls, phrename, phbackup, pharrange, phclname, phevent, phfixdate, phfixmd, phmtags, phtagset.\nFor more information run these commands with -h option.}
18
+ about = <<TEXT
19
+ phtools v#{VERSION} is a bundle of small CLI tools for arranging, renaming, tagging
20
+ of the photo and video files. Helps to keep your photo-video assets in order.
21
+ Please run phtools in a terminal via CLI commands:
22
+ pharrange\t(#{Phrename::about}),
23
+ phbackup\t(#{Phbackup::about}),
24
+ phclname\t(#{Phclname::about}),
25
+ phevent\t(#{Phevent::about}),
26
+ phfixdate\t(#{Phfixdate::about}),
27
+ phfixmd\t(#{Phfixfmd::about}),
28
+ phls\t(#{Phls::about}),
29
+ phmtags\t(#{Phmtags::about}),
30
+ phrename \t(#{Phrename::about}),
31
+ phtagset\t(#{Phtagset::about}).
32
+ For more information run these commands with -h option.
33
+ TEXT
9
34
  end
10
35
  end
data/phtools.gemspec CHANGED
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency 'rspec', '~> 2.9'
32
32
  spec.add_development_dependency 'rspec-its', '~> 1.0'
33
33
  spec.add_development_dependency 'cucumber', '~> 1.3'
34
- spec.add_development_dependency 'aruba', '~> 0.6.0'
34
+ spec.add_development_dependency 'aruba', '~> 0.14'
35
35
  spec.add_development_dependency 'fuubar'
36
36
  spec.add_development_dependency 'rubocop'
37
37
  spec.add_development_dependency 'pry'
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.1.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Bizyaev
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.6.0
89
+ version: '0.14'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.6.0
96
+ version: '0.14'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: fuubar
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -211,6 +211,7 @@ description: A bundle of small CLI tools for arranging, renaming, tagging of the
211
211
  email:
212
212
  - andrew.bizyaev@gmail.com
213
213
  executables:
214
+ - phls
214
215
  - phtools
215
216
  extensions: []
216
217
  extra_rdoc_files: []
@@ -226,8 +227,26 @@ files:
226
227
  - bin/console
227
228
  - bin/setup
228
229
  - bin/stmux
230
+ - exe/phls
229
231
  - exe/phtools
232
+ - lib/pharrange.rb
233
+ - lib/phbackup.rb
234
+ - lib/phclname.rb
235
+ - lib/phevent.rb
236
+ - lib/phfixdate.rb
237
+ - lib/phfixfmd.rb
238
+ - lib/phls.rb
239
+ - lib/phmtags.rb
240
+ - lib/phrename.rb
241
+ - lib/phtagset.rb
230
242
  - lib/phtools.rb
243
+ - lib/phtools/error.rb
244
+ - lib/phtools/ph_file.rb
245
+ - lib/phtools/runner.rb
246
+ - lib/phtools/utils/os.rb
247
+ - lib/phtools/utils/os_unix.rb
248
+ - lib/phtools/utils/os_win.rb
249
+ - lib/phtools/utils/ruby_version.rb
231
250
  - lib/phtools/version.rb
232
251
  - phtools.gemspec
233
252
  homepage: https://github.com/AndrewBiz/phtools.git