loc_mods 0.2.3 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
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"