Vagrant::DataStore which will be used soon for the dotfile in the project directory

This commit is contained in:
Mitchell Hashimoto 2010-09-01 22:00:59 -07:00
parent 43cdcb7808
commit 4d87f198d7
8 changed files with 90 additions and 17 deletions

View File

@ -8,9 +8,10 @@ module Vagrant
# TODO: Move more classes over to the autoload model. We'll
# start small, but slowly move everything over.
autoload :CLI, 'vagrant/cli'
autoload :Config, 'vagrant/config'
autoload :Errors, 'vagrant/errors'
autoload :CLI, 'vagrant/cli'
autoload :Config, 'vagrant/config'
autoload :DataStore, 'vagrant/data_store'
autoload :Errors, 'vagrant/errors'
module Command
autoload :Base, 'vagrant/command/base'

View File

@ -18,11 +18,18 @@ module Vagrant
end
end
# Converts the configuration to a raw hash.
def to_hash
instance_variables_hash.inject({}) do |acc, data|
k,v = data
v = v.to_hash if v.respond_to?(:to_hash)
acc[k] = v
acc
end
end
def to_json(*a)
opts = a.first if a.first.is_a?(Hash)
opts ||= {}
result = {}
result.merge!('json_class' => self.class.name) if opts[:loadable]
result = { 'json_class' => self.class.name }
result.merge(instance_variables_hash).to_json(*a)
end

38
lib/vagrant/data_store.rb Normal file
View File

@ -0,0 +1,38 @@
module Vagrant
# The Vagrant data store is a key-value store which is persisted
# as JSON in a local file which is specified in the initializer.
# The data store itself is accessed via typical hash accessors: `[]`
# and `[]=`. If a key is set to `nil`, then it is removed from the
# datastore. The data store is only updated on disk when {commit}
# is called on the data store itself.
class DataStore
attr_reader :file_path
def initialize(file_path)
@file_path = file_path
File.open(file_path, "r") do |f|
@data = JSON.parse(f.read)
end
end
# Returns the value associated with the `key` in the data
# store.
def [](key)
@data[key]
end
# Sets the value in the data store.
def []=(key, value)
@data[key] = value
end
# Commits any changes to the data to disk. Even if the data
# hasn't changed, it will be reserialized and written to disk.
def commit
File.open(file_path, "w") do |f|
f.write(@data.to_json)
end
end
end
end

View File

@ -36,7 +36,7 @@ module Vagrant
# Set up initial configuration
data = {
:config => env.config,
:config => env.config.to_hash,
:directory => env.config.vm.shared_folders["v-root"][:guestpath],
}

0
test/tmp/.gitkeep Normal file
View File

View File

@ -21,17 +21,11 @@ class ConfigBaseTest < Test::Unit::TestCase
end
context "converting to JSON" do
should "include magic `json_class` if loadable is set to true" do
should "include magic `json_class`" do
@iv_hash = { "foo" => "bar" }
@base.expects(:instance_variables_hash).returns(@iv_hash)
@json = { 'json_class' => @base.class.name }.merge(@iv_hash).to_json
assert_equal @json, @base.to_json(:loadable => true)
end
should "convert instance variable hash to json" do
@iv_hash = { "foo" => "bar" }
@base.expects(:instance_variables_hash).returns(@iv_hash)
assert_equal @iv_hash.to_json, @base.to_json
assert_equal @json, @base.to_json
end
should "not include env in the JSON hash" do

View File

@ -0,0 +1,33 @@
require "test_helper"
class DataStoreTest < Test::Unit::TestCase
setup do
@klass = Vagrant::DataStore
@initial_data = { "foo" => "bar" }
@db_file = File.expand_path("test/tmp/data_store_test", Vagrant.source_root)
File.open(@db_file, "w") { |f| f.write(@initial_data.to_json) }
@instance = @klass.new(@db_file)
end
teardown do
File.delete(@db_file)
end
should "read the data" do
assert_equal @initial_data["foo"], @instance["foo"]
end
should "write the data, but not save it right away" do
@instance["foo"] = "changed"
assert_equal "changed", @instance["foo"]
assert_equal @initial_data["foo"], @klass.new(@db_file)["foo"]
end
should "write the data if commit is called" do
@instance["foo"] = "changed"
@instance.commit
assert_equal "changed", @klass.new(@db_file)["foo"]
end
end

View File

@ -141,7 +141,7 @@ class ChefProvisionerTest < Test::Unit::TestCase
context "generating and uploading json" do
def assert_json
@vm.ssh.expects(:upload!).with do |json, path|
data = JSON.parse(json.read, :object_class => Hash)
data = JSON.parse(json.read)
yield data
true
end