phtools 0.10.0 → 0.11.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +43 -0
- data/.rubocop_todo.yml +373 -0
- data/Guardfile +6 -3
- data/History.md +4 -0
- data/TODO.md +2 -0
- data/exe/phbackup +2 -1
- data/exe/phfixdto +2 -1
- data/exe/phfixfmd +2 -1
- data/exe/phgettags +2 -1
- data/exe/phls +2 -1
- data/exe/phmove +6 -3
- data/exe/phrename +2 -1
- data/exe/phtools +3 -1
- data/lib/phbackup.rb +2 -2
- data/lib/phevent.rb +2 -1
- data/lib/phfixdto.rb +4 -3
- data/lib/phfixfmd.rb +2 -2
- data/lib/phgettags.rb +7 -7
- data/lib/phls.rb +5 -6
- data/lib/phmove.rb +12 -21
- data/lib/phrename.rb +7 -6
- data/lib/phtagset.rb +2 -1
- data/lib/phtools/error.rb +2 -1
- data/lib/phtools/exif_tagger/error.rb +1 -0
- data/lib/phtools/exif_tagger/tag_collection.rb +17 -14
- data/lib/phtools/exif_tagger/tag_writer.rb +8 -7
- data/lib/phtools/exif_tagger/tags/_tag.rb +92 -37
- data/lib/phtools/exif_tagger/tags/_tag_array_of_strings.rb +35 -0
- data/lib/phtools/exif_tagger/tags/_tag_date.rb +25 -27
- data/lib/phtools/exif_tagger/tags/_tag_hash_of_strings.rb +39 -0
- data/lib/phtools/exif_tagger/tags/_tag_string.rb +32 -0
- data/lib/phtools/exif_tagger/tags/city.rb +7 -21
- data/lib/phtools/exif_tagger/tags/coded_character_set.rb +6 -21
- data/lib/phtools/exif_tagger/tags/collections.rb +20 -26
- data/lib/phtools/exif_tagger/tags/copyright.rb +6 -22
- data/lib/phtools/exif_tagger/tags/country.rb +6 -23
- data/lib/phtools/exif_tagger/tags/country_code.rb +5 -21
- data/lib/phtools/exif_tagger/tags/create_date.rb +17 -13
- data/lib/phtools/exif_tagger/tags/creator.rb +14 -25
- data/lib/phtools/exif_tagger/tags/date_time_original.rb +18 -13
- data/lib/phtools/exif_tagger/tags/gps_created.rb +21 -44
- data/lib/phtools/exif_tagger/tags/image_unique_id.rb +12 -27
- data/lib/phtools/exif_tagger/tags/keywords.rb +15 -27
- data/lib/phtools/exif_tagger/tags/location.rb +6 -23
- data/lib/phtools/exif_tagger/tags/modify_date.rb +8 -8
- data/lib/phtools/exif_tagger/tags/state.rb +6 -23
- data/lib/phtools/exif_tagger/tags/world_region.rb +6 -22
- data/lib/phtools/exif_tagger/tags.rb +2 -1
- data/lib/phtools/exif_tagger.rb +1 -0
- data/lib/phtools/ph_file.rb +35 -14
- data/lib/phtools/runner.rb +4 -4
- data/lib/phtools/utils.rb +1 -0
- data/lib/phtools/version.rb +2 -1
- data/lib/phtools.rb +11 -9
- metadata +7 -2
@@ -1,46 +1,34 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
# encoding: UTF-8
|
3
4
|
# (c) ANB Andrew Bizyaev
|
4
5
|
|
5
|
-
require_relative '
|
6
|
+
require_relative '_tag_array_of_strings'
|
6
7
|
|
7
8
|
module ExifTagger
|
8
9
|
module Tag
|
9
10
|
# MWG:Keywords, string[0,64]+, List of Strings
|
10
|
-
#
|
11
|
-
|
11
|
+
# IPTC:Keywords, XMP-dc:Subject
|
12
|
+
# exiftool types:
|
13
|
+
# Keywords = Array ["aaa", "bbb"] OR String "aaa"
|
14
|
+
# Subject = Array ["aaa", "bbb"] OR String "aaa"
|
15
|
+
|
16
|
+
class Keywords < TagArrayOfStrings
|
12
17
|
MAX_BYTESIZE = 64
|
13
|
-
EXIFTOOL_TAGS = %w(Keywords Subject)
|
18
|
+
EXIFTOOL_TAGS = %w(Keywords Subject).freeze
|
14
19
|
|
15
|
-
|
16
|
-
super(Array(value_raw).flatten.map { |i| i.to_s })
|
17
|
-
end
|
20
|
+
private
|
18
21
|
|
19
|
-
def
|
22
|
+
def validate_vs_previous
|
20
23
|
@warnings = []
|
21
24
|
@warnings.freeze
|
22
25
|
end
|
23
26
|
|
24
|
-
private
|
25
|
-
|
26
|
-
def validate
|
27
|
-
@value.each do |v|
|
28
|
-
bsize = v.bytesize
|
29
|
-
if bsize > MAX_BYTESIZE
|
30
|
-
@errors << %{#{tag_name}: '#{v}' } +
|
31
|
-
%{is #{bsize - MAX_BYTESIZE} bytes longer than allowed #{MAX_BYTESIZE}}
|
32
|
-
@value_invalid << v
|
33
|
-
end
|
34
|
-
end
|
35
|
-
@value = @value - @value_invalid
|
36
|
-
end
|
37
|
-
|
38
27
|
def generate_write_script_lines
|
39
|
-
@
|
40
|
-
|
41
|
-
|
42
|
-
@write_script_lines << %
|
43
|
-
@write_script_lines << %Q(-MWG:Keywords+=#{o})
|
28
|
+
@value.each do |o|
|
29
|
+
unless Tag.empty?(o)
|
30
|
+
@write_script_lines << %(-MWG:Keywords-=#{o})
|
31
|
+
@write_script_lines << %(-MWG:Keywords+=#{o})
|
44
32
|
end
|
45
33
|
end
|
46
34
|
end
|
@@ -1,39 +1,22 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
# encoding: UTF-8
|
3
4
|
# (c) ANB Andrew Bizyaev
|
4
5
|
|
5
|
-
require_relative '
|
6
|
+
require_relative '_tag_string'
|
6
7
|
|
7
8
|
module ExifTagger
|
8
9
|
module Tag
|
9
10
|
# MWG:Location, String[0,32]
|
10
|
-
#
|
11
|
-
|
12
|
-
class Location < Tag
|
11
|
+
# IPTC:Sub-location, XMP-iptcCore:Location, XMP-iptcExt:LocationShownSublocation
|
12
|
+
class Location < TagString
|
13
13
|
MAX_BYTESIZE = 32
|
14
|
-
EXIFTOOL_TAGS = %w(Sub-location Location LocationShownSublocation)
|
15
|
-
|
16
|
-
def initialize(value_raw = [])
|
17
|
-
super(value_raw.to_s)
|
18
|
-
end
|
14
|
+
EXIFTOOL_TAGS = %w(Sub-location Location LocationShownSublocation).freeze
|
19
15
|
|
20
16
|
private
|
21
17
|
|
22
|
-
def validate
|
23
|
-
bsize = @value.bytesize
|
24
|
-
if bsize > MAX_BYTESIZE
|
25
|
-
@errors << %{#{tag_name}: '#{@value}' } +
|
26
|
-
%{is #{bsize - MAX_BYTESIZE} bytes longer than allowed #{MAX_BYTESIZE}}
|
27
|
-
@value_invalid << @value
|
28
|
-
@value = ''
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
18
|
def generate_write_script_lines
|
33
|
-
@write_script_lines
|
34
|
-
unless @value.empty?
|
35
|
-
@write_script_lines << %Q(-MWG:Location=#{@value})
|
36
|
-
end
|
19
|
+
@write_script_lines << %(-MWG:Location=#{@value})
|
37
20
|
end
|
38
21
|
end
|
39
22
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
# encoding: UTF-8
|
3
4
|
# (c) ANB Andrew Bizyaev
|
4
5
|
|
@@ -8,18 +9,17 @@ module ExifTagger
|
|
8
9
|
module Tag
|
9
10
|
# -EXIF:ModifyDate=now
|
10
11
|
class ModifyDate < TagDate
|
11
|
-
|
12
|
+
MAX_BYTESIZE = 32
|
13
|
+
EXIFTOOL_TAGS = %w(ModifyDate).freeze
|
12
14
|
|
13
15
|
private
|
14
16
|
|
15
17
|
def generate_write_script_lines
|
16
|
-
@write_script_lines
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
@write_script_lines << %Q(-EXIF:ModifyDate=#{@value.strftime('%F %T')})
|
22
|
-
end
|
18
|
+
@write_script_lines << if @value.is_a?(DateTime)
|
19
|
+
%(-EXIF:ModifyDate=#{@value.strftime('%F %T')})
|
20
|
+
else
|
21
|
+
%(-EXIF:ModifyDate=#{@value})
|
22
|
+
end
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -1,39 +1,22 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
# encoding: UTF-8
|
3
4
|
# (c) ANB Andrew Bizyaev
|
4
5
|
|
5
|
-
require_relative '
|
6
|
+
require_relative '_tag_string'
|
6
7
|
|
7
8
|
module ExifTagger
|
8
9
|
module Tag
|
9
10
|
# MWG:State, String[0,32]
|
10
|
-
#
|
11
|
-
|
12
|
-
class State < Tag
|
11
|
+
# IPTC:Province-State, XMP-photoshop:State, XMP-iptcExt:LocationShownProvinceState
|
12
|
+
class State < TagString
|
13
13
|
MAX_BYTESIZE = 32
|
14
|
-
EXIFTOOL_TAGS = %w(Province-State State LocationShownProvinceState)
|
15
|
-
|
16
|
-
def initialize(value_raw = [])
|
17
|
-
super(value_raw.to_s)
|
18
|
-
end
|
14
|
+
EXIFTOOL_TAGS = %w(Province-State State LocationShownProvinceState).freeze
|
19
15
|
|
20
16
|
private
|
21
17
|
|
22
|
-
def validate
|
23
|
-
bsize = @value.bytesize
|
24
|
-
if bsize > MAX_BYTESIZE
|
25
|
-
@errors << %{#{tag_name}: '#{@value}' } +
|
26
|
-
%{is #{bsize - MAX_BYTESIZE} bytes longer than allowed #{MAX_BYTESIZE}}
|
27
|
-
@value_invalid << @value
|
28
|
-
@value = ''
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
18
|
def generate_write_script_lines
|
33
|
-
@write_script_lines
|
34
|
-
unless @value.empty?
|
35
|
-
@write_script_lines << %Q(-MWG:State=#{@value})
|
36
|
-
end
|
19
|
+
@write_script_lines << %(-MWG:State=#{@value})
|
37
20
|
end
|
38
21
|
end
|
39
22
|
end
|
@@ -1,37 +1,21 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
# encoding: UTF-8
|
3
4
|
# (c) ANB Andrew Bizyaev
|
4
5
|
|
5
|
-
require_relative '
|
6
|
+
require_relative '_tag_string'
|
6
7
|
|
7
8
|
module ExifTagger
|
8
9
|
module Tag
|
9
|
-
#
|
10
|
-
class WorldRegion <
|
10
|
+
# XMP-iptcExt:LocationShownWorldRegion, String
|
11
|
+
class WorldRegion < TagString
|
11
12
|
MAX_BYTESIZE = 64 # No limit in XMP spec
|
12
|
-
EXIFTOOL_TAGS = %w(LocationShownWorldRegion)
|
13
|
-
|
14
|
-
def initialize(value_raw = [])
|
15
|
-
super(value_raw.to_s)
|
16
|
-
end
|
13
|
+
EXIFTOOL_TAGS = %w(LocationShownWorldRegion).freeze
|
17
14
|
|
18
15
|
private
|
19
16
|
|
20
|
-
def validate
|
21
|
-
bsize = @value.bytesize
|
22
|
-
if bsize > MAX_BYTESIZE
|
23
|
-
@errors << %{#{tag_name}: '#{@value}' } +
|
24
|
-
%{is #{bsize - MAX_BYTESIZE} bytes longer than allowed #{MAX_BYTESIZE}}
|
25
|
-
@value_invalid << @value
|
26
|
-
@value = ''
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
17
|
def generate_write_script_lines
|
31
|
-
@write_script_lines
|
32
|
-
unless @value.empty?
|
33
|
-
@write_script_lines << %Q(-XMP-iptcExt:LocationShownWorldRegion=#{@value})
|
34
|
-
end
|
18
|
+
@write_script_lines << %(-XMP:LocationShownWorldRegion=#{@value})
|
35
19
|
end
|
36
20
|
end
|
37
21
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
# encoding: UTF-8
|
3
4
|
# (c) ANB Andrew Bizyaev
|
4
5
|
|
@@ -7,5 +8,5 @@ Dir.glob(File.join(__dir__, 'tags', '*.rb')).each { |f| require_relative f }
|
|
7
8
|
|
8
9
|
# ExifTagger helper methods
|
9
10
|
module ExifTagger
|
10
|
-
TAGS_SUPPORTED = (Tag.constants - [:Tag, :TagDate]).map { |i| i.to_s.underscore.to_sym }
|
11
|
+
TAGS_SUPPORTED = (Tag.constants - [:Tag, :TagArrayOfStrings, :TagHashOfStrings, :TagString, :TagDate]).map { |i| i.to_s.underscore.to_sym }
|
11
12
|
end
|
data/lib/phtools/exif_tagger.rb
CHANGED
data/lib/phtools/ph_file.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
# encoding: UTF-8
|
3
4
|
# (c) ANB Andrew Bizyaev
|
4
5
|
|
@@ -6,14 +7,13 @@ require 'phtools/error'
|
|
6
7
|
require 'date'
|
7
8
|
require 'fileutils'
|
8
9
|
|
9
|
-
# Foto tools
|
10
10
|
module PhTools
|
11
11
|
# media type constants
|
12
|
-
FILE_TYPE_IMAGE_NORMAL = %w
|
13
|
-
FILE_TYPE_IMAGE_RAW = %w
|
12
|
+
FILE_TYPE_IMAGE_NORMAL = %w(jpg jpeg tif tiff png).freeze
|
13
|
+
FILE_TYPE_IMAGE_RAW = %w(orf arw dng).freeze
|
14
14
|
FILE_TYPE_IMAGE = FILE_TYPE_IMAGE_NORMAL + FILE_TYPE_IMAGE_RAW
|
15
|
-
FILE_TYPE_VIDEO = %w
|
16
|
-
FILE_TYPE_AUDIO = %w
|
15
|
+
FILE_TYPE_VIDEO = %w(avi mp4 mpg mts dv mov mkv m2t m2ts 3gp).freeze
|
16
|
+
FILE_TYPE_AUDIO = %w(wav).freeze
|
17
17
|
|
18
18
|
# phtools file name operations
|
19
19
|
class PhFile
|
@@ -26,7 +26,7 @@ module PhTools
|
|
26
26
|
ZERO_DATE = DateTime.new(0)
|
27
27
|
|
28
28
|
def self.validate_file!(filename, file_type)
|
29
|
-
fail PhTools::Error, 'does not exist'
|
29
|
+
fail PhTools::Error, 'does not exist' unless
|
30
30
|
filename && File.exist?(filename)
|
31
31
|
fail PhTools::Error, 'not a file' if File.directory?(filename)
|
32
32
|
fail PhTools::Error, 'no permission to write' unless
|
@@ -49,7 +49,7 @@ module PhTools
|
|
49
49
|
[true, '']
|
50
50
|
end
|
51
51
|
|
52
|
-
attr_reader :filename, :dirname, :extname, :basename, :basename_part,
|
52
|
+
attr_reader :filename, :dirname, :extname, :type, :basename, :basename_part,
|
53
53
|
:basename_clean, :date_time, :author
|
54
54
|
|
55
55
|
def initialize(filename)
|
@@ -57,7 +57,7 @@ module PhTools
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def to_s
|
60
|
-
|
60
|
+
@filename.to_s
|
61
61
|
end
|
62
62
|
|
63
63
|
def <=>(other)
|
@@ -67,13 +67,33 @@ module PhTools
|
|
67
67
|
def basename_standard(basename_clean: @basename_clean,
|
68
68
|
date_time: @date_time,
|
69
69
|
author: @author)
|
70
|
-
%
|
70
|
+
%(#{date_time.strftime('%Y%m%d-%H%M%S')}_#{(author.upcase + 'XXXXXX')[0, NICKNAME_SIZE]} #{basename_clean})
|
71
71
|
end
|
72
72
|
|
73
73
|
def basename_is_standard?
|
74
74
|
@basename == basename_standard
|
75
75
|
end
|
76
76
|
|
77
|
+
def image?
|
78
|
+
FILE_TYPE_IMAGE.include?(@type)
|
79
|
+
end
|
80
|
+
|
81
|
+
def image_normal?
|
82
|
+
FILE_TYPE_IMAGE_NORMAL.include?(@type)
|
83
|
+
end
|
84
|
+
|
85
|
+
def image_raw?
|
86
|
+
FILE_TYPE_IMAGE_RAW.include?(@type)
|
87
|
+
end
|
88
|
+
|
89
|
+
def video?
|
90
|
+
FILE_TYPE_VIDEO.include?(@type)
|
91
|
+
end
|
92
|
+
|
93
|
+
def audio?
|
94
|
+
FILE_TYPE_AUDIO.include?(@type)
|
95
|
+
end
|
96
|
+
|
77
97
|
def standardize(dirname: @dirname, basename_clean: @basename_clean,
|
78
98
|
extname: @extname, date_time: @date_time,
|
79
99
|
author: @author)
|
@@ -100,7 +120,7 @@ module PhTools
|
|
100
120
|
end
|
101
121
|
|
102
122
|
def cleanse!(dirname: @dirname, basename_clean: @basename_clean,
|
103
|
-
|
123
|
+
extname: @extname)
|
104
124
|
filename = cleanse(dirname: dirname, basename_clean: basename_clean,
|
105
125
|
extname: extname)
|
106
126
|
set_state(filename)
|
@@ -119,8 +139,8 @@ module PhTools
|
|
119
139
|
def date_time_to_time
|
120
140
|
Time.new(@date_time.year, @date_time.month, @date_time.day,
|
121
141
|
@date_time.hour, @date_time.min, @date_time.sec)
|
122
|
-
|
123
|
-
|
142
|
+
# no use of @date_time.zone - assuming file's timezone always
|
143
|
+
# equals to photografer's computer timezone
|
124
144
|
end
|
125
145
|
|
126
146
|
private
|
@@ -130,6 +150,7 @@ module PhTools
|
|
130
150
|
@extname = File.extname(filename)
|
131
151
|
@basename = File.basename(filename, @extname)
|
132
152
|
@filename = File.join(@dirname, @basename + @extname)
|
153
|
+
@type = @extname.empty? ? '' : @extname.slice(1..-1).downcase
|
133
154
|
parse_basename
|
134
155
|
@basename_clean = @basename_part[:clean]
|
135
156
|
@date_time = reveal_date_time
|
@@ -166,8 +187,8 @@ module PhTools
|
|
166
187
|
end
|
167
188
|
|
168
189
|
def parse_basename
|
169
|
-
default = { prefix: '', clean: '', date: '',
|
170
|
-
|
190
|
+
default = { prefix: '', clean: '', date: '', time: '', author: '', id: '', flags: '' }
|
191
|
+
|
171
192
|
case @basename
|
172
193
|
# check YYYYmmdd-HHMMSS_AUT[ID]{FLAGS}cleanname
|
173
194
|
when /^(?<prefix>(?<date>\d{8})-(?<time>\d{6})_(?<author>\w{#{NICKNAME_MIN_SIZE},#{NICKNAME_MAX_SIZE}})\[(?<id>.*)\]\{(?<flags>.*)\})(?<clean>.*)/
|
data/lib/phtools/runner.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
# encoding: UTF-8
|
3
4
|
# (c) ANB Andrew Bizyaev
|
4
5
|
|
@@ -9,7 +10,6 @@ require 'phtools/error.rb'
|
|
9
10
|
require 'phtools/ph_file.rb'
|
10
11
|
require 'docopt'
|
11
12
|
|
12
|
-
# Foto Tools
|
13
13
|
module PhTools
|
14
14
|
# Main class processing input stream
|
15
15
|
class Runner
|
@@ -37,7 +37,7 @@ module PhTools
|
|
37
37
|
exit 1
|
38
38
|
ensure
|
39
39
|
if PhTools.debug
|
40
|
-
STDERR.puts
|
40
|
+
STDERR.puts 'Runner Instance Variables: '
|
41
41
|
STDERR.puts context
|
42
42
|
end
|
43
43
|
end
|
@@ -84,8 +84,8 @@ module PhTools
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def context
|
87
|
-
|
88
|
-
{ item =>
|
87
|
+
instance_variables.map do |item|
|
88
|
+
{ item => instance_variable_get(item) }
|
89
89
|
end
|
90
90
|
end
|
91
91
|
end
|
data/lib/phtools/utils.rb
CHANGED
data/lib/phtools/version.rb
CHANGED
data/lib/phtools.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
# encoding: UTF-8
|
3
4
|
# (c) ANB Andrew Bizyaev
|
4
5
|
require 'phtools/version'
|
@@ -18,17 +19,18 @@ module PhTools
|
|
18
19
|
phtools v#{VERSION} is a bundle of small CLI tools for arranging, renaming, tagging
|
19
20
|
of the photo and video files. Helps to keep your photo-video assets in order.
|
20
21
|
Please run phtools in a terminal via CLI commands:
|
21
|
-
phls\t(#{Phls
|
22
|
-
phmove\t(#{Phmove
|
23
|
-
phbackup\t(#{Phbackup
|
24
|
-
phrename\t(#{Phrename
|
25
|
-
phevent\t(#{Phevent
|
26
|
-
phfixdto\t(#{Phfixdto
|
27
|
-
phfixfmd\t(#{Phfixfmd
|
28
|
-
phgettags\t(#{Phgettags
|
29
|
-
phtagset\t(#{Phtagset
|
22
|
+
phls\t(#{Phls.about}),
|
23
|
+
phmove\t(#{Phmove.about}),
|
24
|
+
phbackup\t(#{Phbackup.about}),
|
25
|
+
phrename\t(#{Phrename.about}),
|
26
|
+
phevent\t(#{Phevent.about}),
|
27
|
+
phfixdto\t(#{Phfixdto.about}),
|
28
|
+
phfixfmd\t(#{Phfixfmd.about}),
|
29
|
+
phgettags\t(#{Phgettags.about}),
|
30
|
+
phtagset\t(#{Phtagset.about}).
|
30
31
|
For more information run these commands with -h option.
|
31
32
|
General info about phtools usage see at https://github.com/AndrewBiz/phtools.git
|
32
33
|
TEXT
|
34
|
+
about
|
33
35
|
end
|
34
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: phtools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Bizyaev
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -252,6 +252,8 @@ extra_rdoc_files: []
|
|
252
252
|
files:
|
253
253
|
- ".gitignore"
|
254
254
|
- ".rspec"
|
255
|
+
- ".rubocop.yml"
|
256
|
+
- ".rubocop_todo.yml"
|
255
257
|
- ".travis.yml"
|
256
258
|
- Gemfile
|
257
259
|
- Guardfile
|
@@ -288,7 +290,10 @@ files:
|
|
288
290
|
- lib/phtools/exif_tagger/tag_writer.rb
|
289
291
|
- lib/phtools/exif_tagger/tags.rb
|
290
292
|
- lib/phtools/exif_tagger/tags/_tag.rb
|
293
|
+
- lib/phtools/exif_tagger/tags/_tag_array_of_strings.rb
|
291
294
|
- lib/phtools/exif_tagger/tags/_tag_date.rb
|
295
|
+
- lib/phtools/exif_tagger/tags/_tag_hash_of_strings.rb
|
296
|
+
- lib/phtools/exif_tagger/tags/_tag_string.rb
|
292
297
|
- lib/phtools/exif_tagger/tags/city.rb
|
293
298
|
- lib/phtools/exif_tagger/tags/coded_character_set.rb
|
294
299
|
- lib/phtools/exif_tagger/tags/collections.rb
|