lib/cocina/generator/vocab.rb in cocina-models-0.54.0 vs lib/cocina/generator/vocab.rb in cocina-models-0.55.0
- old
+ new
@@ -31,26 +31,43 @@
private
attr_reader :schemas
- # rubocop:disable Style/MultilineBlockChain
+ BASE = 'http://cocina.sul.stanford.edu/models/'
+
def vocabs
- schemas.values.map do |schema|
- type_property = schema.properties['type']
- type_property.nil? ? [] : type_property.enum.to_a
- end
- .flatten
- .uniq
- .sort
- .filter { |vocab| vocab.start_with?('http://cocina.sul.stanford.edu/models') }
+ type_properties = schemas.values.map { |schema| schema.properties['type'] }.compact
+ type_properties.map(&:enum).flat_map(&:to_a)
+ .filter { |vocab| vocab.start_with?(BASE) }
+ .uniq
+ .sort
end
- # rubocop:enable Style/MultilineBlockChain
def vocab_methods
- # Note special handling of 3d
- vocabs.map do |vocab|
- name = vocab[38, vocab.size - 45].gsub('-', '_').gsub('3d', 'three_dimensional')
+ names = vocabs.each_with_object({}) do |vocab, object|
+ # Note special handling of 3d
+ namespaced = vocab.delete_prefix(BASE).delete_suffix('.jsonld')
+ .gsub('-', '_').gsub('3d', 'three_dimensional')
+ namespace, name = namespaced.include?('/') ? namespaced.split('/') : [:root, namespaced]
+ object[namespace] ||= {}
+ object[namespace][name] = vocab
+ end
+ draw_namespaced_methods(names)
+ end
+
+ def draw_namespaced_methods(names)
+ names.flat_map do |namespace, methods|
+ [].tap do |items|
+ items << "class #{namespace.capitalize}" unless namespace == :root
+ items << draw_ruby_methods(methods)
+ items << 'end' unless namespace == :root
+ end
+ end.join("\n")
+ end
+
+ def draw_ruby_methods(methods)
+ methods.map do |name, vocab|
<<~RUBY
def self.#{name}
"#{vocab}"
end