loc_mods 0.2.3 → 0.2.5

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.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -0
  3. data/.rubocop_todo.yml +83 -0
  4. data/README.adoc +48 -6
  5. data/lib/loc_mods/abstract.rb +9 -9
  6. data/lib/loc_mods/access_condition.rb +11 -11
  7. data/lib/loc_mods/alternative_name.rb +10 -10
  8. data/lib/loc_mods/area.rb +3 -3
  9. data/lib/loc_mods/cartographic_extension.rb +4 -4
  10. data/lib/loc_mods/cartographics.rb +8 -8
  11. data/lib/loc_mods/city_section.rb +3 -3
  12. data/lib/loc_mods/classification.rb +8 -8
  13. data/lib/loc_mods/cli.rb +48 -80
  14. data/lib/loc_mods/collection.rb +3 -3
  15. data/lib/loc_mods/copy_information.rb +5 -5
  16. data/lib/loc_mods/date.rb +8 -8
  17. data/lib/loc_mods/date_other.rb +4 -4
  18. data/lib/loc_mods/detail.rb +7 -7
  19. data/lib/loc_mods/edition.rb +4 -4
  20. data/lib/loc_mods/enumeration_and_chronology.rb +4 -4
  21. data/lib/loc_mods/extent.rb +4 -4
  22. data/lib/loc_mods/extent_definition.rb +7 -7
  23. data/lib/loc_mods/form.rb +5 -5
  24. data/lib/loc_mods/genre.rb +8 -8
  25. data/lib/loc_mods/geographic_code.rb +6 -6
  26. data/lib/loc_mods/hierarchical_geographic.rb +6 -6
  27. data/lib/loc_mods/hierarchical_part.rb +8 -8
  28. data/lib/loc_mods/holding_simple.rb +2 -2
  29. data/lib/loc_mods/identifier.rb +8 -8
  30. data/lib/loc_mods/item_identifier.rb +4 -4
  31. data/lib/loc_mods/language.rb +9 -9
  32. data/lib/loc_mods/language_term.rb +7 -7
  33. data/lib/loc_mods/location.rb +8 -8
  34. data/lib/loc_mods/name.rb +19 -19
  35. data/lib/loc_mods/name_part.rb +4 -4
  36. data/lib/loc_mods/non_sort.rb +4 -4
  37. data/lib/loc_mods/note.rb +7 -7
  38. data/lib/loc_mods/occupation.rb +6 -6
  39. data/lib/loc_mods/origin_info.rb +10 -10
  40. data/lib/loc_mods/part.rb +10 -10
  41. data/lib/loc_mods/physical_description.rb +10 -10
  42. data/lib/loc_mods/physical_description_note.rb +7 -7
  43. data/lib/loc_mods/physical_location.rb +5 -5
  44. data/lib/loc_mods/place.rb +3 -3
  45. data/lib/loc_mods/place_term.rb +7 -7
  46. data/lib/loc_mods/publisher.rb +6 -6
  47. data/lib/loc_mods/record.rb +4 -4
  48. data/lib/loc_mods/record_content_source.rb +4 -4
  49. data/lib/loc_mods/record_identifier.rb +4 -4
  50. data/lib/loc_mods/record_info.rb +9 -9
  51. data/lib/loc_mods/record_info_note.rb +8 -8
  52. data/lib/loc_mods/region.rb +3 -3
  53. data/lib/loc_mods/related_item.rb +10 -10
  54. data/lib/loc_mods/role.rb +2 -2
  55. data/lib/loc_mods/role_term.rb +4 -4
  56. data/lib/loc_mods/script_term.rb +4 -4
  57. data/lib/loc_mods/string_plus_language.rb +6 -6
  58. data/lib/loc_mods/string_plus_language_plus_authority.rb +6 -6
  59. data/lib/loc_mods/string_plus_language_plus_supplied.rb +4 -4
  60. data/lib/loc_mods/subject.rb +15 -15
  61. data/lib/loc_mods/subject_name.rb +14 -14
  62. data/lib/loc_mods/subject_title_info.rb +16 -16
  63. data/lib/loc_mods/table_of_contents.rb +9 -9
  64. data/lib/loc_mods/target_audience.rb +5 -5
  65. data/lib/loc_mods/temporal.rb +5 -5
  66. data/lib/loc_mods/text.rb +5 -5
  67. data/lib/loc_mods/title_info.rb +22 -22
  68. data/lib/loc_mods/type_of_resource.rb +8 -8
  69. data/lib/loc_mods/url.rb +8 -8
  70. data/lib/loc_mods/version.rb +1 -1
  71. data/lib/loc_mods.rb +7 -6
  72. data/references/allrecords-MODS.xml +1 -1
  73. metadata +5 -6
  74. data/lib/loc_mods/base_mapper.rb +0 -26
  75. data/lib/loc_mods/comparable_mapper.rb +0 -110
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b206d76220e77a18fd6609c3f7646eaf8fb836ac2d69a7d6da019db5820f24d
4
- data.tar.gz: ffd23bb7508ad1fef1e0b165eb07620fc0a2420b6c436ac34cec8208affb6463
3
+ metadata.gz: a2a4762188e137e5ea3515cbff8dcbfa6e2749c7eb1ca4921d230e20c2c066db
4
+ data.tar.gz: a510dd995107ef4b33dabcc0c8e9658948e3c4d7474d50fd2cbd8d2eaf1b7e31
5
5
  SHA512:
6
- metadata.gz: 9f56bbb4bfdab2dd2820ef67d94461ac5caa47d62937762a5cbeacbea8e70497c75968d92b3ce23f5d7e79f6a737c98c43058d6e11b774d0777340f040808fea
7
- data.tar.gz: 0ac7feedcebe5df178f6ad313ba811004de126c82adc0f5289f44b43212a26ef2acfa3f09a45afa9cd4b158b7b4ef97976413ac357b4eb11749ab227c801a168
6
+ metadata.gz: 410d05bac6bde6ad26693359a2331c7b93ba4abcdabed33ad51f3f25dd9c08491be258ff0c9c2f4752f9b323cfd9b60102193af4535d30e92b7297679892439a
7
+ data.tar.gz: a70f2deb4dff1d8fd8f119e2d78b40330444caffa5f3d47fc6939ba51241a47fcbaf47eda8a64f35b002d7c7660c7f9c97debceda0c9019e2d8c7a13870785e2
data/.rubocop.yml CHANGED
@@ -1,3 +1,5 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
1
3
  AllCops:
2
4
  TargetRubyVersion: 3.0
3
5
 
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,83 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2024-08-15 09:25:52 UTC using RuboCop version 1.65.1.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1
10
+ # Configuration parameters: Severity, Include.
11
+ # Include: **/*.gemspec
12
+ Gemspec/RequiredRubyVersion:
13
+ Exclude:
14
+ - 'loc_mods.gemspec'
15
+
16
+ # Offense count: 4
17
+ # Configuration parameters: AllowedMethods.
18
+ # AllowedMethods: enums
19
+ Lint/ConstantDefinitionInBlock:
20
+ Exclude:
21
+ - 'spec/loc_mods/collection_spec.rb'
22
+
23
+ # Offense count: 8
24
+ # Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
25
+ Metrics/AbcSize:
26
+ Max: 50
27
+
28
+ # Offense count: 2
29
+ # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
30
+ # AllowedMethods: refine
31
+ Metrics/BlockLength:
32
+ Max: 66
33
+
34
+ # Offense count: 1
35
+ # Configuration parameters: CountComments, CountAsOne.
36
+ Metrics/ClassLength:
37
+ Max: 253
38
+
39
+ # Offense count: 6
40
+ # Configuration parameters: AllowedMethods, AllowedPatterns.
41
+ Metrics/CyclomaticComplexity:
42
+ Max: 15
43
+
44
+ # Offense count: 10
45
+ # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
46
+ Metrics/MethodLength:
47
+ Max: 43
48
+
49
+ # Offense count: 5
50
+ # Configuration parameters: AllowedMethods, AllowedPatterns.
51
+ Metrics/PerceivedComplexity:
52
+ Max: 17
53
+
54
+ # Offense count: 1
55
+ # Configuration parameters: ForbiddenDelimiters.
56
+ # ForbiddenDelimiters: (?i-mx:(^|\s)(EO[A-Z]{1}|END)(\s|$))
57
+ Naming/HeredocDelimiterNaming:
58
+ Exclude:
59
+ - 'bin/update-nist-mods'
60
+
61
+ # Offense count: 1
62
+ Security/Open:
63
+ Exclude:
64
+ - 'bin/update-nist-mods'
65
+
66
+ # Offense count: 65
67
+ # Configuration parameters: AllowedConstants.
68
+ Style/Documentation:
69
+ Enabled: false
70
+
71
+ # Offense count: 1
72
+ # Configuration parameters: AllowedMethods.
73
+ # AllowedMethods: respond_to_missing?
74
+ Style/OptionalBooleanParameter:
75
+ Exclude:
76
+ - 'lib/loc_mods/comparable_mapper.rb'
77
+
78
+ # Offense count: 1
79
+ # This cop supports safe autocorrection (--autocorrect).
80
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns.
81
+ # URISchemes: http, https
82
+ Layout/LineLength:
83
+ Max: 126
data/README.adoc CHANGED
@@ -28,15 +28,44 @@ LocMods::Collection.from_xml(File.read("reference/allrecords-MODS.xml"))
28
28
 
29
29
  === Command line interface
30
30
 
31
- LocMods provides a command-line interface (CLI) for various operations. The main
32
- executable is `loc-mods`.
31
+ LocMods provides a command-line interface (CLI) for various operations.
32
+
33
+ The main executable is `loc-mods`.
34
+
35
+ [source,shell]
36
+ ----
37
+ Commands:
38
+ loc-mods detect-duplicates PATH... # Detect duplicate records in MODS XML files or directories
39
+ loc-mods help [COMMAND] # Describe available commands or one specific command
40
+ ----
41
+
42
+
43
+
33
44
 
34
45
  ==== Detect duplicates
35
46
 
36
47
  The `detect-duplicates` command allows you to find duplicate MODS records based
37
48
  on using a "primary ID" that is their DOI (Digital Object Identifier).
38
49
 
50
+ NOTE: The library assumes that every record has a DOI. If that is not the case,
51
+ another way to setting the primary key needs to be defined.
52
+
53
+ Usage:
54
+
55
+ [source,shell]
56
+ ----
39
57
  Usage:
58
+ loc-mods detect-duplicates PATH...
59
+
60
+ Options:
61
+ [--show-unchanged], [--no-show-unchanged] # Show unchanged attributes in the diff output
62
+ # Default: false
63
+ [--highlight-diff], [--no-highlight-diff] # Highlight only the differences
64
+ # Default: false
65
+ [--color=COLOR] # Use colors in the diff output (auto, on, off)
66
+ # Default: auto
67
+ # Possible values: auto, on, off
68
+ ----
40
69
 
41
70
  [source,shell]
42
71
  ----
@@ -45,15 +74,28 @@ $ loc-mods detect-duplicates [OPTIONS] <file_or_directory_path>
45
74
 
46
75
  Options:
47
76
 
48
- * `-r, --recursive`: Search for MODS files recursively in subdirectories.
49
- * `-v, --verbose`: Display more detailed output.
50
- * `-o, --output FILE`: Write the results to a file instead of stdout.
77
+ `--show-unchanged`::
78
+ (default: `false`)
79
+ Show attributes of both objects even when they were not changed.
80
+
81
+ `--highlight-diff`::
82
+ (default: `false`)
83
+ Highlight values only when they differ between two records.
84
+
85
+ `--color=COLOR`::
86
+ (default: `auto`) Use colors in the diff output. Values:
87
+
88
+ `auto`::: the CLI will detect whether the terminal supports colors and display
89
+ with colors if it does.
90
+ `on`::: the CLI will always display with colors.
91
+ `off`::: the CLI will never display with colors.
92
+
51
93
 
52
94
  Example:
53
95
 
54
96
  [source,shell]
55
97
  ----
56
- $ loc-mods detect-duplicates -r -v /path/to/mods/files
98
+ $ loc-mods detect-duplicates /path/to/mods/files
57
99
  ----
58
100
 
59
101
  This command will:
@@ -1,16 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_mapper"
3
+ require "lutaml/model"
4
4
 
5
5
  module LocMods
6
- class Abstract < BaseMapper
7
- attribute :content, Shale::Type::String
8
- attribute :display_label, Shale::Type::String
9
- attribute :type, Shale::Type::String
10
- attribute :shareable, Shale::Type::Value
11
- attribute :alt_rep_group, Shale::Type::String
12
- attribute :alt_format, Shale::Type::Value
13
- attribute :content_type, Shale::Type::String
6
+ class Abstract < Lutaml::Model::Serializable
7
+ attribute :content, :string
8
+ attribute :display_label, :string
9
+ attribute :type, :string
10
+ attribute :shareable, :string
11
+ attribute :alt_rep_group, :string
12
+ attribute :alt_format, :string
13
+ attribute :content_type, :string
14
14
 
15
15
  xml do
16
16
  root "abstract"
@@ -1,18 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_mapper"
3
+ require "lutaml/model"
4
4
 
5
5
  module LocMods
6
- class AccessCondition < BaseMapper
7
- attribute :content, Shale::Type::String
8
- attribute :display_label, Shale::Type::String
9
- attribute :lang, Shale::Type::String
10
- attribute :script, Shale::Type::String
11
- attribute :transliteration, Shale::Type::String
12
- attribute :type, Shale::Type::String
13
- attribute :alt_rep_group, Shale::Type::String
14
- attribute :alt_format, Shale::Type::Value
15
- attribute :content_type, Shale::Type::String
6
+ class AccessCondition < Lutaml::Model::Serializable
7
+ attribute :content, :string
8
+ attribute :display_label, :string
9
+ attribute :lang, :string
10
+ attribute :script, :string
11
+ attribute :transliteration, :string
12
+ attribute :type, :string
13
+ attribute :alt_rep_group, :string
14
+ attribute :alt_format, :string
15
+ attribute :content_type, :string
16
16
 
17
17
  xml do
18
18
  root "accessCondition"
@@ -1,23 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_mapper"
3
+ require "lutaml/model"
4
4
 
5
5
  require_relative "identifier"
6
6
  require_relative "name_part"
7
7
  require_relative "role"
8
8
 
9
9
  module LocMods
10
- class AlternativeName < BaseMapper
11
- attribute :lang, Shale::Type::String
12
- attribute :script, Shale::Type::String
13
- attribute :transliteration, Shale::Type::String
14
- attribute :display_label, Shale::Type::String
15
- attribute :alt_type, Shale::Type::String
10
+ class AlternativeName < Lutaml::Model::Serializable
11
+ attribute :lang, :string
12
+ attribute :script, :string
13
+ attribute :transliteration, :string
14
+ attribute :display_label, :string
15
+ attribute :alt_type, :string
16
16
  attribute :name_part, NamePart, collection: true
17
- attribute :display_form, Shale::Type::String, collection: true
18
- attribute :affiliation, Shale::Type::String, collection: true
17
+ attribute :display_form, :string, collection: true
18
+ attribute :affiliation, :string, collection: true
19
19
  attribute :role, Role, collection: true
20
- attribute :description, Shale::Type::String, collection: true
20
+ attribute :description, :string, collection: true
21
21
  attribute :name_identifier, Identifier, collection: true
22
22
 
23
23
  xml do
data/lib/loc_mods/area.rb CHANGED
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_mapper"
3
+ require "lutaml/model"
4
4
 
5
5
  require_relative "hierarchical_part"
6
6
 
7
7
  module LocMods
8
- class Area < BaseMapper
8
+ class Area < Lutaml::Model::Serializable
9
9
  attribute :content, HierarchicalPart
10
- attribute :area_type, Shale::Type::Value
10
+ attribute :area_type, :string
11
11
 
12
12
  xml do
13
13
  root "area"
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_mapper"
3
+ require "lutaml/model"
4
4
 
5
5
  module LocMods
6
- class CartographicExtension < BaseMapper
7
- attribute :content, Shale::Type::String
8
- attribute :display_label, Shale::Type::String
6
+ class CartographicExtension < Lutaml::Model::Serializable
7
+ attribute :content, :string
8
+ attribute :display_label, :string
9
9
 
10
10
  xml do
11
11
  root "cartographicExtension"
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_mapper"
3
+ require "lutaml/model"
4
4
 
5
5
  require_relative "cartographic_extension"
6
6
 
7
7
  module LocMods
8
- class Cartographics < BaseMapper
9
- attribute :authority, Shale::Type::String
10
- attribute :authority_uri, Shale::Type::Value
11
- attribute :value_uri, Shale::Type::Value
12
- attribute :scale, Shale::Type::String
13
- attribute :projection, Shale::Type::String
14
- attribute :coordinates, Shale::Type::String, collection: true
8
+ class Cartographics < Lutaml::Model::Serializable
9
+ attribute :authority, :string
10
+ attribute :authority_uri, :string
11
+ attribute :value_uri, :string
12
+ attribute :scale, :string
13
+ attribute :projection, :string
14
+ attribute :coordinates, :string, collection: true
15
15
  attribute :cartographic_extension, CartographicExtension, collection: true
16
16
 
17
17
  xml do
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_mapper"
3
+ require "lutaml/model"
4
4
 
5
5
  require_relative "hierarchical_part"
6
6
 
7
7
  module LocMods
8
- class CitySection < BaseMapper
8
+ class CitySection < Lutaml::Model::Serializable
9
9
  attribute :content, HierarchicalPart
10
- attribute :city_section_type, Shale::Type::Value
10
+ attribute :city_section_type, :string
11
11
 
12
12
  xml do
13
13
  root "citySection"
@@ -1,15 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_mapper"
3
+ require "lutaml/model"
4
4
 
5
5
  module LocMods
6
- class Classification < BaseMapper
7
- attribute :content, Shale::Type::String
8
- attribute :edition, Shale::Type::String
9
- attribute :display_label, Shale::Type::String
10
- attribute :alt_rep_group, Shale::Type::String
11
- attribute :usage, Shale::Type::Value
12
- attribute :generator, Shale::Type::String
6
+ class Classification < Lutaml::Model::Serializable
7
+ attribute :content, :string
8
+ attribute :edition, :string
9
+ attribute :display_label, :string
10
+ attribute :alt_rep_group, :string
11
+ attribute :usage, :string
12
+ attribute :generator, :string
13
13
 
14
14
  xml do
15
15
  root "classification"
data/lib/loc_mods/cli.rb CHANGED
@@ -1,12 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # lib/loc_mods/cli.rb
4
3
  require "thor"
5
4
  require "loc_mods"
6
5
 
7
6
  module LocMods
8
7
  class Cli < Thor
9
8
  desc "detect-duplicates PATH...", "Detect duplicate records in MODS XML files or directories"
9
+ method_option :show_unchanged, type: :boolean, default: false, desc: "Show unchanged attributes in the diff output"
10
+ method_option :highlight_diff, type: :boolean, default: false, desc: "Highlight only the differences"
11
+ method_option :color, type: :string, enum: %w[auto on off], default: "auto",
12
+ desc: "Use colors in the diff output (auto, on, off)"
10
13
 
11
14
  def detect_duplicates(*paths)
12
15
  all_records = []
@@ -46,12 +49,13 @@ module LocMods
46
49
  puts " Comparison #{index + 1}:"
47
50
  puts " File 1: #{record1[:file]}"
48
51
  puts " File 2: #{record2[:file]}"
49
- differences = record1[:record].compare(record2[:record])
50
- if differences
51
- puts " ----"
52
- print_differences(differences)
53
- puts " ----"
54
- end
52
+ print_differences(
53
+ record1[:record],
54
+ record2[:record],
55
+ options[:show_unchanged],
56
+ options[:highlight_diff],
57
+ color_enabled?
58
+ )
55
59
  puts "\n"
56
60
  end
57
61
  end
@@ -67,87 +71,51 @@ module LocMods
67
71
  end
68
72
  end
69
73
 
70
- def print_differences(differences, prefix = "", path = [])
71
- if differences.is_a?(Comparison)
72
- print_difference(differences, path)
73
- return
74
- end
75
-
76
- # Differences is a Hash here
77
- differences.each do |key, value|
78
- # puts "key #{key}, value #{value}"
79
- current_path = path + [key]
80
- # This is a comparison
81
- if value.is_a?(Comparison)
82
- print_difference(value, path)
83
- next
84
- end
74
+ def print_differences(record1, record2, show_unchanged, highlight_diff, use_colors)
75
+ diff_score, diff_tree = Lutaml::Model::Serialize.diff_with_score(
76
+ record1,
77
+ record2,
78
+ show_unchanged: show_unchanged,
79
+ highlight_diff: highlight_diff,
80
+ use_colors: use_colors,
81
+ indent: " ",
82
+ )
83
+ similarity_percentage = (1 - diff_score) * 100
84
+
85
+ puts " Differences:"
86
+ puts diff_tree
87
+ puts " Similarity score: #{similarity_percentage.round(2)}%"
88
+ end
85
89
 
86
- raise "Differences must be in form of a Hash" unless value.is_a?(Hash)
90
+ def color_enabled?
91
+ case options[:color]
92
+ when "on"
93
+ true
94
+ when "off"
95
+ false
96
+ else
97
+ supports_color?
98
+ end
99
+ end
87
100
 
88
- # This is not array, end here
89
- next unless value.keys.any? do |k|
90
- k.is_a?(Integer) || k == :_array_size_difference
91
- end
101
+ def supports_color?
102
+ return false unless $stdout.tty?
92
103
 
93
- # if value[:_array_size_difference]
94
- # puts " #{format_path(current_path)} [_array_size_difference]:"
95
- # puts " Record 1: #{format_value(value[:_array_size_difference].original)}"
96
- # puts " Record 2: #{format_value(value[:_array_size_difference].updated)}"
97
- # puts
98
- # end
99
-
100
- value.each do |subkey, subvalue|
101
- # if [:self, :other].include?(subkey)
102
- # raise "Subkey is self or other"
103
- # end
104
- # puts "subkey (#{subkey})"
105
- # puts "subvalue #{subvalue}, prefix #{prefix}, current_path + [subkey] #{current_path + [subkey]}"
106
-
107
- if subkey.is_a?(Integer)
108
- print_differences(subvalue, prefix, current_path + [subkey])
109
- else
110
- if subvalue.is_a?(Comparison)
111
- print_difference(subvalue, current_path + [subkey])
112
- next
113
- end
114
-
115
- raise "In an array diff but not an Integer!"
116
- end
117
- end
104
+ if RbConfig::CONFIG["host_os"] =~ /mswin|mingw|cygwin/
105
+ return true if ENV["ANSICON"]
106
+ return true if ENV["ConEmuANSI"] == "ON"
107
+ return true if ENV["TERM"] == "xterm"
118
108
  end
119
- end
120
109
 
121
- def print_difference(value, current_path)
122
- return unless value.original || value.updated
110
+ return true if ENV["COLORTERM"]
123
111
 
124
- puts " #{format_path(current_path)}:"
125
- puts " Record 1: #{format_value(value.original)}"
126
- puts " Record 2: #{format_value(value.updated)}"
127
- puts
128
- end
112
+ term = ENV["TERM"]
113
+ return false if term.nil? || term.empty?
129
114
 
130
- def format_path(path)
131
- path.map.with_index do |part, index|
132
- if index.zero?
133
- part.to_s
134
- elsif part.is_a?(Integer)
135
- "[#{part}]"
136
- else
137
- ".#{part}"
138
- end
139
- end.join
140
- end
115
+ color_terms = %w[ansi color console cygwin gnome konsole kterm
116
+ linux msys putty rxvt screen tmux vt100 xterm]
141
117
 
142
- def format_value(value)
143
- case value
144
- when nil, ComparableNil
145
- "(nil)"
146
- when String
147
- "\"#{value}\""
148
- else
149
- value.to_s
150
- end
118
+ color_terms.any? { |ct| term.include?(ct) }
151
119
  end
152
120
  end
153
121
  end
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_mapper"
3
+ require "lutaml/model"
4
4
 
5
5
  require_relative "record"
6
6
 
7
7
  module LocMods
8
- class Collection < BaseMapper
8
+ class Collection < Lutaml::Model::Serializable
9
9
  attribute :mods, Record, collection: true
10
- attribute :schema_location, Shale::Type::String
10
+ attribute :schema_location, :string
11
11
 
12
12
  xml do
13
13
  root "modsCollection"
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_mapper"
3
+ require "lutaml/model"
4
4
 
5
5
  require_relative "enumeration_and_chronology"
6
6
  require_relative "form"
@@ -8,11 +8,11 @@ require_relative "item_identifier"
8
8
  require_relative "note"
9
9
 
10
10
  module LocMods
11
- class CopyInformation < BaseMapper
11
+ class CopyInformation < Lutaml::Model::Serializable
12
12
  attribute :form, Form
13
- attribute :sub_location, Shale::Type::String, collection: true
14
- attribute :shelf_locator, Shale::Type::String, collection: true
15
- attribute :electronic_locator, Shale::Type::String, collection: true
13
+ attribute :sub_location, :string, collection: true
14
+ attribute :shelf_locator, :string, collection: true
15
+ attribute :electronic_locator, :string, collection: true
16
16
  attribute :note, Note, collection: true
17
17
  attribute :enumeration_and_chronology, EnumerationAndChronology,
18
18
  collection: true
data/lib/loc_mods/date.rb CHANGED
@@ -1,15 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_mapper"
3
+ require "lutaml/model"
4
4
 
5
5
  module LocMods
6
- class Date < BaseMapper
7
- attribute :content, Shale::Type::String
8
- attribute :encoding, Shale::Type::String
9
- attribute :qualifier, Shale::Type::String
10
- attribute :point, Shale::Type::String
11
- attribute :key_date, Shale::Type::Value
12
- attribute :calendar, Shale::Type::String
6
+ class Date < Lutaml::Model::Serializable
7
+ attribute :content, :string
8
+ attribute :encoding, :string
9
+ attribute :qualifier, :string
10
+ attribute :point, :string
11
+ attribute :key_date, :string
12
+ attribute :calendar, :string
13
13
 
14
14
  xml do
15
15
  root "recordChangeDate"
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_mapper"
3
+ require "lutaml/model"
4
4
 
5
5
  require_relative "date"
6
6
 
7
7
  module LocMods
8
- class DateOther < BaseMapper
9
- attribute :content, Shale::Type::String
10
- attribute :type, Shale::Type::String
8
+ class DateOther < Lutaml::Model::Serializable
9
+ attribute :content, :string
10
+ attribute :type, :string
11
11
 
12
12
  xml do
13
13
  root "dateOther"
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_mapper"
3
+ require "lutaml/model"
4
4
 
5
5
  module LocMods
6
- class Detail < BaseMapper
7
- attribute :type, Shale::Type::String
8
- attribute :level, Shale::Type::Integer
9
- attribute :number, Shale::Type::String, collection: true
10
- attribute :caption, Shale::Type::String, collection: true
11
- attribute :title, Shale::Type::String, collection: true
6
+ class Detail < Lutaml::Model::Serializable
7
+ attribute :type, :string
8
+ attribute :level, :integer
9
+ attribute :number, :string, collection: true
10
+ attribute :caption, :string, collection: true
11
+ attribute :title, :string, collection: true
12
12
 
13
13
  xml do
14
14
  root "detail"
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_mapper"
3
+ require "lutaml/model"
4
4
 
5
5
  module LocMods
6
6
  # LocMods::StringPlusLanguagePlusSupplied
7
- class Edition < BaseMapper
8
- attribute :content, Shale::Type::String
9
- attribute :supplied, Shale::Type::String
7
+ class Edition < Lutaml::Model::Serializable
8
+ attribute :content, :string
9
+ attribute :supplied, :string
10
10
 
11
11
  xml do
12
12
  root "edition"