summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Bennett <keithrbennett@gmail.com>2020-06-30 14:07:23 -0400
committerKeith Bennett <keithrbennett@gmail.com>2020-06-30 14:07:23 -0400
commit0be363c99bb33da6b2b1b0149269b4a2e91120f7 (patch)
treebf30650ccbf6fa4034a07713ecd56151e87905e2
parentddc29e20c1c05bc96ede665ad066cbf0617a6c93 (diff)
downloadjson-0be363c99bb33da6b2b1b0149269b4a2e91120f7.tar.gz
Add `load_file` and `load_file!` methods, with tests. Fixes issue #386.
-rw-r--r--lib/json/common.rb10
-rw-r--r--tests/json_common_interface_test.rb56
2 files changed, 66 insertions, 0 deletions
diff --git a/lib/json/common.rb b/lib/json/common.rb
index 991d760..bd33997 100644
--- a/lib/json/common.rb
+++ b/lib/json/common.rb
@@ -282,6 +282,16 @@ module JSON
Parser.new(source, **(opts||{})).parse
end
+ # Parses the content of a file (see parse method documentation for more information).
+ def load_file(filespec, opts = {})
+ parse(File.read(filespec), opts)
+ end
+
+ # Parses the content of a file (see parse! method documentation for more information).
+ def load_file!(filespec, opts = {})
+ parse!(File.read(filespec), opts)
+ end
+
# :call-seq:
# JSON.generate(obj, opts = nil) -> new_string
#
diff --git a/tests/json_common_interface_test.rb b/tests/json_common_interface_test.rb
index 53f335e..4fdc2b1 100644
--- a/tests/json_common_interface_test.rb
+++ b/tests/json_common_interface_test.rb
@@ -123,4 +123,60 @@ class JSONCommonInterfaceTest < Test::Unit::TestCase
assert_equal @json, JSON(@hash)
assert_equal @hash, JSON(@json)
end
+
+ def test_load_file
+ test_load_shared(:load_file)
+ end
+
+ def test_load_file!
+ test_load_shared(:load_file!)
+ end
+
+ def test_load_file_with_option
+ test_load_file_with_option_shared(:load_file)
+ end
+
+ def test_load_file_with_option!
+ test_load_file_with_option_shared(:load_file!)
+ end
+
+ private
+
+ def test_load_shared(method_name)
+ temp_file_containing(@json) do |filespec|
+ assert_equal JSON.public_send(method_name, filespec), @hash
+ end
+ end
+
+ def test_load_file_with_option_shared(method_name)
+ temp_file_containing(@json) do |filespec|
+ parsed_object = JSON.public_send(method_name, filespec, symbolize_names: true)
+ key_classes = parsed_object.keys.map(&:class)
+ assert_true key_classes.include?(Symbol) && (! key_classes.include?(String))
+ end
+ end
+
+ # Copied and slightly modified from https://github.com/keithrbennett/trick_bag
+ # (https://github.com/keithrbennett/trick_bag/blob/master/lib/trick_bag/io/temp_files.rb).
+ #
+ # For the easy creation and deletion of a temp file populated with text,
+ # wrapped around the code block you provide.
+ #
+ # @param text the text to write to the temporary file
+ # @param file_prefix optional prefix for the temporary file's name
+ # @yield filespec of the temporary file
+ def temp_file_containing(text, file_prefix = '')
+ raise "This method must be called with a code block." unless block_given?
+
+ filespec = nil
+ begin
+ Tempfile.open(file_prefix) do |file|
+ file << text
+ filespec = file.path
+ end
+ yield(filespec)
+ ensure
+ File.delete(filespec) if filespec && File.exist?(filespec)
+ end
+ end
end