png_conform 0.1.1 → 0.1.2

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.
@@ -1,54 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "critical/ihdr_validator"
4
- require_relative "critical/plte_validator"
5
- require_relative "critical/idat_validator"
6
- require_relative "critical/iend_validator"
7
- require_relative "ancillary/text_validator"
8
- require_relative "ancillary/ztxt_validator"
9
- require_relative "ancillary/itxt_validator"
10
- require_relative "ancillary/gama_validator"
11
- require_relative "ancillary/chrm_validator"
12
- require_relative "ancillary/srgb_validator"
13
- require_relative "ancillary/sbit_validator"
14
- require_relative "ancillary/bkgd_validator"
15
- require_relative "ancillary/iccp_validator"
16
- require_relative "ancillary/hist_validator"
17
- require_relative "ancillary/splt_validator"
18
- require_relative "ancillary/trns_validator"
19
- require_relative "ancillary/phys_validator"
20
- require_relative "ancillary/time_validator"
21
- require_relative "ancillary/offs_validator"
22
- require_relative "ancillary/pcal_validator"
23
- require_relative "ancillary/scal_validator"
24
- require_relative "ancillary/ster_validator"
25
- require_relative "ancillary/cicp_validator"
26
- require_relative "ancillary/mdcv_validator"
27
- require_relative "apng/actl_validator"
28
- require_relative "apng/fctl_validator"
29
- require_relative "apng/fdat_validator"
30
- require_relative "mng/mhdr_validator"
31
- require_relative "mng/mend_validator"
32
- require_relative "mng/dhdr_validator"
33
- require_relative "mng/fram_validator"
34
- require_relative "mng/defi_validator"
35
- require_relative "mng/back_validator"
36
- require_relative "mng/loop_validator"
37
- require_relative "mng/endl_validator"
38
- require_relative "mng/term_validator"
39
- require_relative "mng/save_validator"
40
- require_relative "mng/seek_validator"
41
- require_relative "mng/move_validator"
42
- require_relative "mng/clip_validator"
43
- require_relative "mng/show_validator"
44
- require_relative "mng/clon_validator"
45
- require_relative "mng/disc_validator"
46
- require_relative "jng/jhdr_validator"
47
- require_relative "jng/jdat_validator"
48
- require_relative "jng/jsep_validator"
49
-
50
3
  module PngConform
51
4
  module Validators
5
+ # Define validator category modules upfront for proper namespace resolution
6
+ module Critical; end
7
+ module Ancillary; end
8
+ module Apng; end
9
+ module Mng; end
10
+ module Jng; end
11
+
52
12
  # Registry of chunk types to their corresponding validator classes
53
13
  #
54
14
  # This class maintains a mapping between PNG chunk type codes and
@@ -62,85 +22,100 @@ module PngConform
62
22
  # - Palette support (hIST, sPLT, tRNS)
63
23
  # - Metadata (pHYs, tIME, oFFs, pCAL, sCAL, sTER)
64
24
  # - PNG 3rd edition (cICP, mDCv)
25
+ # - Apple extensions (iDOT)
65
26
  # - APNG (acTL, fcTL, fdAT)
66
27
  # - MNG (MHDR, MEND, DHDR, FRAM, DEFI, BACK, LOOP, ENDL, etc.)
67
28
  # - JNG (JHDR, JDAT, JSEP)
68
29
  #
30
+ # Validators are loaded lazily on-demand to improve startup performance.
31
+ #
69
32
  class ChunkRegistry
70
- # Map of chunk type codes to validator classes
71
- VALIDATORS = {
33
+ # Map of chunk type codes to validator file paths and class names
34
+ # Format: [file_path, module_path, class_name]
35
+ VALIDATOR_PATHS = {
72
36
  # Critical chunks
73
- "IHDR" => Critical::IhdrValidator,
74
- "PLTE" => Critical::PlteValidator,
75
- "IDAT" => Critical::IdatValidator,
76
- "IEND" => Critical::IendValidator,
37
+ "IHDR" => ["critical/ihdr_validator", "Critical", "IhdrValidator"],
38
+ "PLTE" => ["critical/plte_validator", "Critical", "PlteValidator"],
39
+ "IDAT" => ["critical/idat_validator", "Critical", "IdatValidator"],
40
+ "IEND" => ["critical/iend_validator", "Critical", "IendValidator"],
77
41
 
78
42
  # Text chunks
79
- "tEXt" => Ancillary::TextValidator,
80
- "zTXt" => Ancillary::ZtxtValidator,
81
- "iTXt" => Ancillary::ItxtValidator,
43
+ "tEXt" => ["ancillary/text_validator", "Ancillary", "TextValidator"],
44
+ "zTXt" => ["ancillary/ztxt_validator", "Ancillary", "ZtxtValidator"],
45
+ "iTXt" => ["ancillary/itxt_validator", "Ancillary", "ItxtValidator"],
82
46
 
83
47
  # Color management
84
- "gAMA" => Ancillary::GamaValidator,
85
- "cHRM" => Ancillary::ChrmValidator,
86
- "sRGB" => Ancillary::SrgbValidator,
87
- "sBIT" => Ancillary::SbitValidator,
88
- "bKGD" => Ancillary::BkgdValidator,
89
- "iCCP" => Ancillary::IccpValidator,
48
+ "gAMA" => ["ancillary/gama_validator", "Ancillary", "GamaValidator"],
49
+ "cHRM" => ["ancillary/chrm_validator", "Ancillary", "ChrmValidator"],
50
+ "sRGB" => ["ancillary/srgb_validator", "Ancillary", "SrgbValidator"],
51
+ "sBIT" => ["ancillary/sbit_validator", "Ancillary", "SbitValidator"],
52
+ "bKGD" => ["ancillary/bkgd_validator", "Ancillary", "BkgdValidator"],
53
+ "iCCP" => ["ancillary/iccp_validator", "Ancillary", "IccpValidator"],
90
54
 
91
55
  # Palette support
92
- "hIST" => Ancillary::HistValidator,
93
- "sPLT" => Ancillary::SpltValidator,
94
- "tRNS" => Ancillary::TrnsValidator,
56
+ "hIST" => ["ancillary/hist_validator", "Ancillary", "HistValidator"],
57
+ "sPLT" => ["ancillary/splt_validator", "Ancillary", "SpltValidator"],
58
+ "tRNS" => ["ancillary/trns_validator", "Ancillary", "TrnsValidator"],
95
59
 
96
60
  # Metadata
97
- "pHYs" => Ancillary::PhysValidator,
98
- "tIME" => Ancillary::TimeValidator,
99
- "oFFs" => Ancillary::OffsValidator,
100
- "pCAL" => Ancillary::PcalValidator,
101
- "sCAL" => Ancillary::ScalValidator,
102
- "sTER" => Ancillary::SterValidator,
61
+ "pHYs" => ["ancillary/phys_validator", "Ancillary", "PhysValidator"],
62
+ "tIME" => ["ancillary/time_validator", "Ancillary", "TimeValidator"],
63
+ "oFFs" => ["ancillary/offs_validator", "Ancillary", "OffsValidator"],
64
+ "pCAL" => ["ancillary/pcal_validator", "Ancillary", "PcalValidator"],
65
+ "sCAL" => ["ancillary/scal_validator", "Ancillary", "ScalValidator"],
66
+ "sTER" => ["ancillary/ster_validator", "Ancillary", "SterValidator"],
103
67
 
104
68
  # PNG 3rd edition
105
- "cICP" => Ancillary::CicpValidator,
106
- "mDCv" => Ancillary::MdcvValidator,
69
+ "cICP" => ["ancillary/cicp_validator", "Ancillary", "CicpValidator"],
70
+ "mDCv" => ["ancillary/mdcv_validator", "Ancillary", "MdcvValidator"],
71
+
72
+ # Apple extensions
73
+ "iDOT" => ["ancillary/idot_validator", "Ancillary", "IdotValidator"],
107
74
 
108
75
  # APNG (Animated PNG)
109
- "acTL" => Apng::ActlValidator,
110
- "fcTL" => Apng::FctlValidator,
111
- "fdAT" => Apng::FdatValidator,
76
+ "acTL" => ["apng/actl_validator", "Apng", "ActlValidator"],
77
+ "fcTL" => ["apng/fctl_validator", "Apng", "FctlValidator"],
78
+ "fdAT" => ["apng/fdat_validator", "Apng", "FdatValidator"],
112
79
 
113
80
  # MNG (Multiple-image Network Graphics)
114
- "MHDR" => Mng::MhdrValidator,
115
- "MEND" => Mng::MendValidator,
116
- "DHDR" => Mng::DhdrValidator,
117
- "FRAM" => Mng::FramValidator,
118
- "DEFI" => Mng::DefiValidator,
119
- "BACK" => Mng::BackValidator,
120
- "LOOP" => Mng::LoopValidator,
121
- "ENDL" => Mng::EndlValidator,
122
- "TERM" => Mng::TermValidator,
123
- "SAVE" => Mng::SaveValidator,
124
- "SEEK" => Mng::SeekValidator,
125
- "MOVE" => Mng::MoveValidator,
126
- "CLIP" => Mng::ClipValidator,
127
- "SHOW" => Mng::ShowValidator,
128
- "CLON" => Mng::ClonValidator,
129
- "DISC" => Mng::DiscValidator,
81
+ "MHDR" => ["mng/mhdr_validator", "Mng", "MhdrValidator"],
82
+ "MEND" => ["mng/mend_validator", "Mng", "MendValidator"],
83
+ "DHDR" => ["mng/dhdr_validator", "Mng", "DhdrValidator"],
84
+ "FRAM" => ["mng/fram_validator", "Mng", "FramValidator"],
85
+ "DEFI" => ["mng/defi_validator", "Mng", "DefiValidator"],
86
+ "BACK" => ["mng/back_validator", "Mng", "BackValidator"],
87
+ "LOOP" => ["mng/loop_validator", "Mng", "LoopValidator"],
88
+ "ENDL" => ["mng/endl_validator", "Mng", "EndlValidator"],
89
+ "TERM" => ["mng/term_validator", "Mng", "TermValidator"],
90
+ "SAVE" => ["mng/save_validator", "Mng", "SaveValidator"],
91
+ "SEEK" => ["mng/seek_validator", "Mng", "SeekValidator"],
92
+ "MOVE" => ["mng/move_validator", "Mng", "MoveValidator"],
93
+ "CLIP" => ["mng/clip_validator", "Mng", "ClipValidator"],
94
+ "SHOW" => ["mng/show_validator", "Mng", "ShowValidator"],
95
+ "CLON" => ["mng/clon_validator", "Mng", "ClonValidator"],
96
+ "DISC" => ["mng/disc_validator", "Mng", "DiscValidator"],
130
97
 
131
98
  # JNG (JPEG Network Graphics)
132
- "JHDR" => Jng::JhdrValidator,
133
- "JDAT" => Jng::JdatValidator,
134
- "JSEP" => Jng::JsepValidator,
99
+ "JHDR" => ["jng/jhdr_validator", "Jng", "JhdrValidator"],
100
+ "JDAT" => ["jng/jdat_validator", "Jng", "JdatValidator"],
101
+ "JSEP" => ["jng/jsep_validator", "Jng", "JsepValidator"],
135
102
  }.freeze
136
103
 
137
104
  class << self
138
- # Get validator class for a chunk type
105
+ # Get validator class for a chunk type (with lazy loading)
139
106
  #
140
107
  # @param chunk_type [String] Four-character chunk type code
141
108
  # @return [Class, nil] Validator class or nil if not found
142
109
  def validator_for(chunk_type)
143
- VALIDATORS[chunk_type]
110
+ # Return cached validator if already loaded
111
+ return loaded_validators[chunk_type] if loaded_validators.key?(chunk_type)
112
+
113
+ # Check if validator path exists
114
+ validator_info = VALIDATOR_PATHS[chunk_type]
115
+ return nil unless validator_info
116
+
117
+ # Load validator on-demand
118
+ load_validator(chunk_type, validator_info)
144
119
  end
145
120
 
146
121
  # Check if a validator exists for a chunk type
@@ -148,14 +123,14 @@ module PngConform
148
123
  # @param chunk_type [String] Four-character chunk type code
149
124
  # @return [Boolean] True if validator exists
150
125
  def validator_exists?(chunk_type)
151
- VALIDATORS.key?(chunk_type)
126
+ VALIDATOR_PATHS.key?(chunk_type)
152
127
  end
153
128
 
154
129
  # Get all registered chunk types
155
130
  #
156
131
  # @return [Array<String>] List of chunk type codes
157
132
  def chunk_types
158
- VALIDATORS.keys
133
+ VALIDATOR_PATHS.keys
159
134
  end
160
135
 
161
136
  # Get validators by category
@@ -164,34 +139,34 @@ module PngConform
164
139
  # (:critical, :text, :color, :palette, :metadata, :png3)
165
140
  # @return [Hash] Map of chunk types to validators in category
166
141
  def validators_by_category(category)
167
- case category
168
- when :critical
169
- VALIDATORS.select { |k, _| %w[IHDR PLTE IDAT IEND].include?(k) }
170
- when :text
171
- VALIDATORS.select { |k, _| %w[tEXt zTXt iTXt].include?(k) }
172
- when :color
173
- VALIDATORS.select do |k, _|
174
- %w[gAMA cHRM sRGB sBIT bKGD iCCP].include?(k)
175
- end
176
- when :palette
177
- VALIDATORS.select { |k, _| %w[hIST sPLT tRNS].include?(k) }
178
- when :metadata
179
- VALIDATORS.select do |k, _|
180
- %w[pHYs tIME oFFs pCAL sCAL sTER].include?(k)
181
- end
182
- when :png3
183
- VALIDATORS.select { |k, _| %w[cICP mDCv].include?(k) }
184
- when :apng
185
- VALIDATORS.select { |k, _| %w[acTL fcTL fdAT].include?(k) }
186
- when :mng
187
- VALIDATORS.select do |k, _|
188
- %w[MHDR MEND DHDR FRAM DEFI BACK LOOP ENDL TERM SAVE SEEK
189
- MOVE CLIP SHOW CLON DISC].include?(k)
190
- end
191
- when :jng
192
- VALIDATORS.select { |k, _| %w[JHDR JDAT JSEP].include?(k) }
193
- else
194
- {}
142
+ chunk_types = case category
143
+ when :critical
144
+ %w[IHDR PLTE IDAT IEND]
145
+ when :text
146
+ %w[tEXt zTXt iTXt]
147
+ when :color
148
+ %w[gAMA cHRM sRGB sBIT bKGD iCCP]
149
+ when :palette
150
+ %w[hIST sPLT tRNS]
151
+ when :metadata
152
+ %w[pHYs tIME oFFs pCAL sCAL sTER]
153
+ when :png3
154
+ %w[cICP mDCv]
155
+ when :apng
156
+ %w[acTL fcTL fdAT]
157
+ when :mng
158
+ %w[MHDR MEND DHDR FRAM DEFI BACK LOOP ENDL TERM SAVE SEEK
159
+ MOVE CLIP SHOW CLON DISC]
160
+ when :jng
161
+ %w[JHDR JDAT JSEP]
162
+ else
163
+ []
164
+ end
165
+
166
+ # Load validators for this category
167
+ chunk_types.each_with_object({}) do |chunk_type, result|
168
+ validator = validator_for(chunk_type)
169
+ result[chunk_type] = validator if validator
195
170
  end
196
171
  end
197
172
 
@@ -199,7 +174,7 @@ module PngConform
199
174
  #
200
175
  # @return [Integer] Number of registered validators
201
176
  def count
202
- VALIDATORS.size
177
+ VALIDATOR_PATHS.size
203
178
  end
204
179
 
205
180
  # Create validator instance for a chunk
@@ -213,6 +188,34 @@ module PngConform
213
188
 
214
189
  validator_class.new(chunk, context)
215
190
  end
191
+
192
+ private
193
+
194
+ # Cache for loaded validator classes
195
+ def loaded_validators
196
+ @loaded_validators ||= {}
197
+ end
198
+
199
+ # Load a validator class on-demand
200
+ #
201
+ # @param chunk_type [String] Chunk type code
202
+ # @param validator_info [Array] [file_path, module_name, class_name]
203
+ # @return [Class, nil] Loaded validator class
204
+ def load_validator(chunk_type, validator_info)
205
+ file_path, module_name, class_name = validator_info
206
+
207
+ # Require the validator file
208
+ require_relative file_path
209
+
210
+ # Resolve the constant (e.g., Critical::IhdrValidator)
211
+ validator_class = Validators.const_get(module_name).const_get(class_name)
212
+
213
+ # Cache and return
214
+ loaded_validators[chunk_type] = validator_class
215
+ rescue NameError, LoadError => e
216
+ warn "Failed to load validator for #{chunk_type}: #{e.message}"
217
+ loaded_validators[chunk_type] = nil
218
+ end
216
219
  end
217
220
  end
218
221
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PngConform
4
- VERSION = "0.1.1"
4
+ VERSION = "0.1.2"
5
5
  end
data/lib/png_conform.rb CHANGED
@@ -40,60 +40,21 @@ module PngConform
40
40
  require_relative "png_conform/models/validation_result"
41
41
  require_relative "png_conform/models/file_analysis"
42
42
 
43
- # Load validators (Phase 4 & 5 - implemented)
43
+ # Load base validator and registry (Phase 4 optimization: lazy validator loading)
44
+ # All validators are loaded on-demand by chunk_registry
44
45
  require_relative "png_conform/validators/base_validator"
45
-
46
- # Critical validators
47
- require_relative "png_conform/validators/critical/ihdr_validator"
48
- require_relative "png_conform/validators/critical/plte_validator"
49
- require_relative "png_conform/validators/critical/idat_validator"
50
- require_relative "png_conform/validators/critical/iend_validator"
51
-
52
- # Ancillary validators
53
- require_relative "png_conform/validators/ancillary/gama_validator"
54
- require_relative "png_conform/validators/ancillary/trns_validator"
55
- require_relative "png_conform/validators/ancillary/chrm_validator"
56
- require_relative "png_conform/validators/ancillary/srgb_validator"
57
- require_relative "png_conform/validators/ancillary/iccp_validator"
58
- require_relative "png_conform/validators/ancillary/text_validator"
59
- require_relative "png_conform/validators/ancillary/ztxt_validator"
60
- require_relative "png_conform/validators/ancillary/itxt_validator"
61
- require_relative "png_conform/validators/ancillary/bkgd_validator"
62
- require_relative "png_conform/validators/ancillary/phys_validator"
63
- require_relative "png_conform/validators/ancillary/sbit_validator"
64
- require_relative "png_conform/validators/ancillary/splt_validator"
65
- require_relative "png_conform/validators/ancillary/hist_validator"
66
- require_relative "png_conform/validators/ancillary/time_validator"
67
- require_relative "png_conform/validators/ancillary/offs_validator"
68
- require_relative "png_conform/validators/ancillary/pcal_validator"
69
- require_relative "png_conform/validators/ancillary/scal_validator"
70
- require_relative "png_conform/validators/ancillary/ster_validator"
71
- require_relative "png_conform/validators/ancillary/cicp_validator"
72
- require_relative "png_conform/validators/ancillary/mdcv_validator"
46
+ require_relative "png_conform/validators/chunk_registry"
73
47
 
74
48
  # Load services (Phase 9 - implemented)
75
- require_relative "png_conform/validators/chunk_registry"
76
49
  require_relative "png_conform/services/validation_service"
77
50
  require_relative "png_conform/services/profile_manager"
78
51
 
79
52
  # Load analyzers (Phase 13 - Quick Win features)
80
- require_relative "png_conform/analyzers/optimization_analyzer"
81
- require_relative "png_conform/analyzers/metrics_analyzer"
82
- require_relative "png_conform/analyzers/resolution_analyzer"
83
- require_relative "png_conform/analyzers/comparison_analyzer"
53
+ # Analyzers are lazy-loaded on-demand in validation_service.rb (Phase 3 optimization)
54
+ # No upfront loading needed here
84
55
 
85
- # Load reporters (Phase 10 & 7 - implemented)
86
- require_relative "png_conform/reporters/visual_elements"
87
- require_relative "png_conform/reporters/base_reporter"
88
- require_relative "png_conform/reporters/summary_reporter"
89
- require_relative "png_conform/reporters/verbose_reporter"
90
- require_relative "png_conform/reporters/very_verbose_reporter"
91
- require_relative "png_conform/reporters/quiet_reporter"
92
- require_relative "png_conform/reporters/palette_reporter"
93
- require_relative "png_conform/reporters/text_reporter"
94
- require_relative "png_conform/reporters/color_reporter"
95
- require_relative "png_conform/reporters/yaml_reporter"
96
- require_relative "png_conform/reporters/json_reporter"
56
+ # Load reporter factory only (Phase 2 optimization: lazy reporter loading)
57
+ # Individual reporters are loaded on-demand by the factory
97
58
  require_relative "png_conform/reporters/reporter_factory"
98
59
 
99
60
  # Load CLI (Phase 11 - implemented)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: png_conform
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-11-17 00:00:00.000000000 Z
11
+ date: 2025-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bindata
@@ -76,11 +76,27 @@ files:
76
76
  - README.adoc
77
77
  - Rakefile
78
78
  - SECURITY.md
79
+ - benchmarks/README.adoc
80
+ - benchmarks/config/default.yml
81
+ - benchmarks/config/full.yml
82
+ - benchmarks/config/quick.yml
83
+ - benchmarks/direct_validation.rb
84
+ - benchmarks/lib/benchmark_runner.rb
85
+ - benchmarks/lib/metrics_collector.rb
86
+ - benchmarks/lib/png_conform_runner.rb
87
+ - benchmarks/lib/pngcheck_runner.rb
88
+ - benchmarks/lib/report_generator.rb
89
+ - benchmarks/lib/tool_runner.rb
90
+ - benchmarks/profile_loading.rb
91
+ - benchmarks/profile_validation.rb
92
+ - benchmarks/results/.gitkeep
93
+ - benchmarks/run_benchmark.rb
79
94
  - docs/ARCHITECTURE.adoc
80
95
  - docs/CHUNK_TYPES.adoc
81
96
  - docs/CLI_OPTIONS.adoc
82
97
  - docs/COMPATIBILITY.adoc
83
98
  - examples/README.adoc
99
+ - examples/README.md
84
100
  - examples/advanced_usage.rb
85
101
  - examples/basic_usage.rb
86
102
  - exe/png_conform
@@ -128,6 +144,7 @@ files:
128
144
  - lib/png_conform/validators/ancillary/gama_validator.rb
129
145
  - lib/png_conform/validators/ancillary/hist_validator.rb
130
146
  - lib/png_conform/validators/ancillary/iccp_validator.rb
147
+ - lib/png_conform/validators/ancillary/idot_validator.rb
131
148
  - lib/png_conform/validators/ancillary/itxt_validator.rb
132
149
  - lib/png_conform/validators/ancillary/mdcv_validator.rb
133
150
  - lib/png_conform/validators/ancillary/offs_validator.rb