merriam_webster_plus 0.1.0

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 (49) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.byebug_history +256 -0
  4. data/.github/workflows/main.yml +21 -0
  5. data/.gitignore +9 -0
  6. data/.rubocop.yml +10 -0
  7. data/Gemfile +6 -0
  8. data/Gemfile.lock +68 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +93 -0
  11. data/Rakefile +18 -0
  12. data/bin/console +15 -0
  13. data/bin/mwp +4 -0
  14. data/bin/setup +8 -0
  15. data/fixtures/.DS_Store +0 -0
  16. data/fixtures/vcr_cassettes/.DS_Store +0 -0
  17. data/fixtures/vcr_cassettes/empty_api_entries.yml +37 -0
  18. data/fixtures/vcr_cassettes/heteronym_entries.yml +277 -0
  19. data/fixtures/vcr_cassettes/invalid_api_entries.yml +41 -0
  20. data/fixtures/vcr_cassettes/invalid_dictionary_plus_lookup.yml +79 -0
  21. data/fixtures/vcr_cassettes/invalid_endpoint_api_entries.yml +132 -0
  22. data/fixtures/vcr_cassettes/main_entries_dictionary.yml +210 -0
  23. data/fixtures/vcr_cassettes/main_entries_thesaurus.yml +70 -0
  24. data/fixtures/vcr_cassettes/main_entry_dictionary.yml +210 -0
  25. data/fixtures/vcr_cassettes/main_entry_thesaurus.yml +70 -0
  26. data/fixtures/vcr_cassettes/non_heteronym_entries.yml +157 -0
  27. data/fixtures/vcr_cassettes/valid_api_entries.yml +210 -0
  28. data/fixtures/vcr_cassettes/valid_dictionary_plus_lookup.yml +277 -0
  29. data/fixtures/vcr_cassettes/word_medley_primary_entry_population.yml +1384 -0
  30. data/fixtures/vcr_cassettes/word_not_in_dictionary_primary_entry.yml +141 -0
  31. data/fixtures/vcr_cassettes/word_not_in_thesaurus_primary_entry.yml +144 -0
  32. data/lib/.DS_Store +0 -0
  33. data/lib/merriam_webster_plus/.DS_Store +0 -0
  34. data/lib/merriam_webster_plus/client.rb +88 -0
  35. data/lib/merriam_webster_plus/dictionary_entries.rb +41 -0
  36. data/lib/merriam_webster_plus/dictionary_entry.rb +124 -0
  37. data/lib/merriam_webster_plus/dictionary_plus.rb +46 -0
  38. data/lib/merriam_webster_plus/dictionary_sense.rb +57 -0
  39. data/lib/merriam_webster_plus/entry_audio_merger.rb +55 -0
  40. data/lib/merriam_webster_plus/populator.rb +31 -0
  41. data/lib/merriam_webster_plus/primary_entry_finder.rb +41 -0
  42. data/lib/merriam_webster_plus/thesaurus_entries.rb +13 -0
  43. data/lib/merriam_webster_plus/thesaurus_entry.rb +12 -0
  44. data/lib/merriam_webster_plus/thesaurus_sense.rb +47 -0
  45. data/lib/merriam_webster_plus/version.rb +5 -0
  46. data/lib/merriam_webster_plus.rb +9 -0
  47. data/merriam_webster_plus.gemspec +35 -0
  48. data/test_out.csv +11 -0
  49. metadata +219 -0
@@ -0,0 +1,55 @@
1
+ module MerriamWebsterPlus
2
+ class EntryAudioMerger
3
+ attr_reader :dst_entries, :src_entries
4
+
5
+ def initialize(dst_entries:, src_entries:)
6
+ @dst_entries = dst_entries
7
+ @src_entries = src_entries
8
+ end
9
+
10
+ def merged_entries
11
+ heteronym? ? entries_with_multi_audio : entries_with_single_audio
12
+ end
13
+
14
+ private
15
+
16
+ def heteronym?
17
+ audios.size > 1
18
+ end
19
+
20
+ def entries_with_multi_audio
21
+ return remove_ids(dst_entries) if dst_entries == src_entries
22
+
23
+ dst_entries.each do |dst_entry|
24
+ target_uuid = dst_entry[:target_uuid]
25
+ dst_entry[:audio] = src_entries_audio_index[target_uuid]
26
+ end
27
+ remove_ids(dst_entries)
28
+ end
29
+
30
+ def src_entries_audio_index
31
+ indexed_audio = {}
32
+ src_entries.each do |src_entry|
33
+ indexed_audio[src_entry[:uuid]] ||= src_entry[:audio]
34
+ end
35
+ indexed_audio
36
+ end
37
+
38
+ def entries_with_single_audio
39
+ dst_entries.map { |dst_entry| dst_entry[:audio] = src_audio }
40
+ remove_ids(dst_entries)
41
+ end
42
+
43
+ def src_audio
44
+ audios.first
45
+ end
46
+
47
+ def audios
48
+ src_entries.map { |entry| entry.slice(:audio)[:audio] }.compact.uniq
49
+ end
50
+
51
+ def remove_ids(entries)
52
+ entries.map { |entry| entry.except(:uuid, :target_uuid) }
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,31 @@
1
+ require "merriam_webster_plus/dictionary_plus"
2
+
3
+ module MerriamWebsterPlus
4
+ class Populator
5
+ attr_reader :lookupper, :src_dir, :dst_dir
6
+
7
+ def initialize(lookupper:, src_dir:, dst_dir:)
8
+ @lookupper = lookupper
9
+ @src_dir = src_dir
10
+ @dst_dir = dst_dir
11
+ end
12
+
13
+ def populate
14
+ csv_out = CSV.open(dst_dir, "wb", write_headers: true, headers: src_headers)
15
+
16
+ CSV.foreach(src_dir, headers: true, header_converters: :symbol) do |src_row|
17
+ entry = lookupper.new(word: src_row[0]).primary_entry
18
+ entry ? (csv_out << entry.values) : (csv_out << src_row)
19
+ rescue StandardError
20
+ csv_out << src_row
21
+ end
22
+ csv_out.close
23
+ end
24
+
25
+ private
26
+
27
+ def src_headers
28
+ CSV.foreach(src_dir).first
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,41 @@
1
+ module MerriamWebsterPlus
2
+ class PrimaryEntryFinder
3
+ attr_reader :primary_src_entries, :secondary_src_entries, :tertiary_src_entries
4
+
5
+ def initialize(primary_src_entries:, secondary_src_entries:, tertiary_src_entries:)
6
+ @primary_src_entries = primary_src_entries
7
+ @secondary_src_entries = secondary_src_entries
8
+ @tertiary_src_entries = tertiary_src_entries
9
+ end
10
+
11
+ def primary_entry
12
+ first_complete_entry(primary_src_entries) ||
13
+ first_complete_entry(secondary_src_entries) ||
14
+ first_entry(tertiary_src_entries)
15
+ end
16
+
17
+ private
18
+
19
+ def first_complete_entry(entries)
20
+ entries.each do |entry|
21
+ entry[:senses]&.each do |sense_section|
22
+ sense = sense_section&.dig(1)
23
+ return singled_entry(entry: entry, sense: sense) if !sense[:example].nil? && !sense[:definition].nil?
24
+ end
25
+ end
26
+ nil
27
+ end
28
+
29
+ def first_entry(entries)
30
+ singled_entry(entry: entries.first, sense: entries&.dig(0, :senses, 0)&.dig(1))
31
+ end
32
+
33
+ def singled_entry(entry:, sense:)
34
+ { word: entry[:word],
35
+ class: entry[:class],
36
+ definition: sense&.dig(:definition),
37
+ example: sense&.dig(:example),
38
+ audio: entry[:audio] }
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,13 @@
1
+ require "merriam_webster_plus/client"
2
+ require "merriam_webster_plus/thesaurus_entry"
3
+
4
+ module MerriamWebsterPlus
5
+ class ThesaurusEntries < DictionaryEntries
6
+ private
7
+
8
+ def title_post_initialize
9
+ @api_entries = MerriamWebsterPlus::Client.new(word: word, title: :collegiate_thesaurus).api_entries
10
+ @entry_parser = ThesaurusEntry
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ require "merriam_webster_plus/dictionary_entry"
2
+ require "merriam_webster_plus/thesaurus_sense"
3
+
4
+ module MerriamWebsterPlus
5
+ class ThesaurusEntry < DictionaryEntry
6
+ private
7
+
8
+ def title_post_initialize
9
+ @sense_parser = ThesaurusSense
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,47 @@
1
+ module MerriamWebsterPlus
2
+ class ThesaurusSense < DictionarySense
3
+ def primary_sense
4
+ {
5
+ definition: definition,
6
+ synonyms: synonyms,
7
+ synonyms_and_near_synonyms: synonyms_and_near_synonyms,
8
+ related_words: related_words,
9
+ synonymous_phrases: synonymous_phrases,
10
+ near_antonyms: near_antonyms,
11
+ antonyms: antonyms,
12
+ antonyms_and_near_antonyms: antonyms_and_near_antonyms,
13
+ example: example_sentence
14
+ }.compact
15
+ end
16
+
17
+ private
18
+
19
+ def synonyms
20
+ sense&.dig(:syn_list, 0)&.map { |word_obj| word_obj&.dig(:wd) }&.join(", ")
21
+ end
22
+
23
+ def synonyms_and_near_synonyms
24
+ sense&.dig(:sim_list, 0)&.map { |word_obj| word_obj&.dig(:wd) }&.join(", ")
25
+ end
26
+
27
+ def related_words
28
+ sense&.dig(:rel_list, 0)&.map { |word_obj| word_obj&.dig(:wd) }&.join(", ")
29
+ end
30
+
31
+ def synonymous_phrases
32
+ sense&.dig(:phrase_list, 0)&.map { |word_obj| word_obj&.dig(:wd) }&.join(", ")
33
+ end
34
+
35
+ def near_antonyms
36
+ sense&.dig(:near_list, 0)&.map { |word_obj| word_obj&.dig(:wd) }&.join(", ")
37
+ end
38
+
39
+ def antonyms
40
+ sense&.dig(:ant_list, 0)&.map { |word_obj| word_obj&.dig(:wd) }&.join(", ")
41
+ end
42
+
43
+ def antonyms_and_near_antonyms
44
+ sense&.dig(:opp_list, 0)&.map { |word_obj| word_obj&.dig(:wd) }&.join(", ")
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MerriamWebsterPlus
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "merriam_webster_plus/dictionary_plus"
4
+ require "merriam_webster_plus/version"
5
+
6
+ module MerriamWebsterPlus
7
+ class Error < StandardError; end
8
+ # Your code goes here...
9
+ end
@@ -0,0 +1,35 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "merriam_webster_plus/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "merriam_webster_plus"
7
+ spec.version = MerriamWebsterPlus::VERSION
8
+ spec.authors = ["Christopher J. Corona"]
9
+ spec.email = ["CRiSToBaLZ@users.noreply.github.com"]
10
+
11
+ spec.summary = "Easily get word definitions, synonyms/antonyms, usage examples, audio pronunciations, and more! Backed by Merriam-Webster API."
12
+ spec.description = spec.summary
13
+ spec.homepage = "https://github.com/CRiSToBaLZ/merriam_webster_plus"
14
+ spec.license = "MIT"
15
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
16
+
17
+ # Specify which files should be added to the gem when it is released.
18
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
21
+ end
22
+
23
+ spec.executables = ["mwp"]
24
+ spec.require_paths = ["lib"]
25
+
26
+ spec.add_dependency "bundler", "~> 2.3"
27
+ spec.add_dependency "httparty"
28
+ spec.add_dependency "json"
29
+ spec.add_dependency "minitest"
30
+ spec.add_dependency "minitest-stub-const"
31
+ spec.add_dependency "rake"
32
+ spec.add_dependency "rubocop"
33
+ spec.add_dependency "vcr"
34
+ spec.add_dependency "webmock"
35
+ end
data/test_out.csv ADDED
@@ -0,0 +1,11 @@
1
+ word,part_of_speech,definition,example_sentence,audio
2
+ Internet,noun,an electronic communications network that connects computer networks and organizational computer facilities around the world —used with the except when being used attributively,doing research on the Internet,https://media.merriam-webster.com/audio/prons/en/us/mp3/i/inter01s.mp3
3
+ reversible,adjective,capable of being reversed or of reversing,a reversible chemical reaction,https://media.merriam-webster.com/audio/prons/en/us/mp3/r/revers05.mp3
4
+ yearn,verb,"to long persistently, wistfully, or sadly",yearns to make a difference,https://media.merriam-webster.com/audio/prons/en/us/mp3/y/yearn001.mp3
5
+ acre,noun,"any of various units of area; specifically : a unit in the U.S. and England equal to 43,560 square feet (4047 square meters)",acres of free publicity,https://media.merriam-webster.com/audio/prons/en/us/mp3/a/acre0001.mp3
6
+ contrast,noun,the quality or state of being different,the contrast between the two approaches to the problem of overeating could not be greater,https://media.merriam-webster.com/audio/prons/en/us/mp3/c/contra64.mp3
7
+ superior,adjective,having a feeling of superiority that shows itself in an overbearing attitude,that superior sportscaster lets it be known that he thinks all foreign baseball teams are second-rate,https://media.merriam-webster.com/audio/prons/en/us/mp3/s/superi14.mp3
8
+ pardoned,verb,to cease to have feelings of anger or bitterness toward,he eventually pardoned his sister after she apologized,
9
+ salmon,noun,a large anadromous salmonid fish (Salmo salar) of the North Atlantic noted as a game and food fish —called also Atlantic salmon,,https://media.merriam-webster.com/audio/prons/en/us/mp3/s/salmon01.mp3
10
+ fungi,combining form,fungus,fungiform,
11
+ Ferris wheel,noun,an amusement device consisting of a large upright power-driven wheel carrying seats that remain horizontal around its rim,,https://media.merriam-webster.com/audio/prons/en/us/mp3/f/ferris01.mp3
metadata ADDED
@@ -0,0 +1,219 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: merriam_webster_plus
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Christopher J. Corona
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-06-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: httparty
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest-stub-const
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: vcr
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: webmock
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description: Easily get word definitions, synonyms/antonyms, usage examples, audio
140
+ pronunciations, and more! Backed by Merriam-Webster API.
141
+ email:
142
+ - CRiSToBaLZ@users.noreply.github.com
143
+ executables:
144
+ - mwp
145
+ extensions: []
146
+ extra_rdoc_files: []
147
+ files:
148
+ - ".DS_Store"
149
+ - ".byebug_history"
150
+ - ".github/workflows/main.yml"
151
+ - ".gitignore"
152
+ - ".rubocop.yml"
153
+ - Gemfile
154
+ - Gemfile.lock
155
+ - LICENSE.txt
156
+ - README.md
157
+ - Rakefile
158
+ - bin/console
159
+ - bin/mwp
160
+ - bin/setup
161
+ - fixtures/.DS_Store
162
+ - fixtures/vcr_cassettes/.DS_Store
163
+ - fixtures/vcr_cassettes/empty_api_entries.yml
164
+ - fixtures/vcr_cassettes/heteronym_entries.yml
165
+ - fixtures/vcr_cassettes/invalid_api_entries.yml
166
+ - fixtures/vcr_cassettes/invalid_dictionary_plus_lookup.yml
167
+ - fixtures/vcr_cassettes/invalid_endpoint_api_entries.yml
168
+ - fixtures/vcr_cassettes/main_entries_dictionary.yml
169
+ - fixtures/vcr_cassettes/main_entries_thesaurus.yml
170
+ - fixtures/vcr_cassettes/main_entry_dictionary.yml
171
+ - fixtures/vcr_cassettes/main_entry_thesaurus.yml
172
+ - fixtures/vcr_cassettes/non_heteronym_entries.yml
173
+ - fixtures/vcr_cassettes/valid_api_entries.yml
174
+ - fixtures/vcr_cassettes/valid_dictionary_plus_lookup.yml
175
+ - fixtures/vcr_cassettes/word_medley_primary_entry_population.yml
176
+ - fixtures/vcr_cassettes/word_not_in_dictionary_primary_entry.yml
177
+ - fixtures/vcr_cassettes/word_not_in_thesaurus_primary_entry.yml
178
+ - lib/.DS_Store
179
+ - lib/merriam_webster_plus.rb
180
+ - lib/merriam_webster_plus/.DS_Store
181
+ - lib/merriam_webster_plus/client.rb
182
+ - lib/merriam_webster_plus/dictionary_entries.rb
183
+ - lib/merriam_webster_plus/dictionary_entry.rb
184
+ - lib/merriam_webster_plus/dictionary_plus.rb
185
+ - lib/merriam_webster_plus/dictionary_sense.rb
186
+ - lib/merriam_webster_plus/entry_audio_merger.rb
187
+ - lib/merriam_webster_plus/populator.rb
188
+ - lib/merriam_webster_plus/primary_entry_finder.rb
189
+ - lib/merriam_webster_plus/thesaurus_entries.rb
190
+ - lib/merriam_webster_plus/thesaurus_entry.rb
191
+ - lib/merriam_webster_plus/thesaurus_sense.rb
192
+ - lib/merriam_webster_plus/version.rb
193
+ - merriam_webster_plus.gemspec
194
+ - test_out.csv
195
+ homepage: https://github.com/CRiSToBaLZ/merriam_webster_plus
196
+ licenses:
197
+ - MIT
198
+ metadata: {}
199
+ post_install_message:
200
+ rdoc_options: []
201
+ require_paths:
202
+ - lib
203
+ required_ruby_version: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: 2.3.0
208
+ required_rubygems_version: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: '0'
213
+ requirements: []
214
+ rubygems_version: 3.3.16
215
+ signing_key:
216
+ specification_version: 4
217
+ summary: Easily get word definitions, synonyms/antonyms, usage examples, audio pronunciations,
218
+ and more! Backed by Merriam-Webster API.
219
+ test_files: []