README.md in hash_dot-1.0.0 vs README.md in hash_dot-2.0.0

- old
+ new

@@ -1,18 +1,30 @@ # HashDot -HashDot allows you to call your Ruby hash properties with a dot syntax. Simply include the gem in your project and starting using the dot syntax. +HashDot allows you to call your Ruby hash properties with a dot syntax. ```ruby - user = {name: 'Anna', job: {title: 'Programmer'}} + require 'hash_dot' + user = {name: 'Anna', job: {title: 'Programmer'}}.to_dot + user.job.title #=> 'Programmer' user.job.title = 'Senior Programmer' user.job.title #=> 'Senior Programmer' + user.job.delete(:title) + user.job.title #=> NoMethodError ``` +You can also allow dot syntax for all hashes via the class setting. +```ruby +Hash.use_dot_syntax = true + +{name: 'Pat'}.name #=> 'Pat' +``` + + ## Installation Add this line to your application's Gemfile: ```ruby @@ -26,12 +38,58 @@ Or install it yourself as: $ gem install hash_dot +## Benchmarks +Benchmarks should be taken with a grain of salt, as always. For example, OpenStruct is much slower to initialize, but calls its methods faster once initialized. The OpenStruct solution also can't traverse more than a single dot without recursively instantiating all sub-hashes into OpenStructs. + +```Ruby +require 'ostruct' +require 'benchmark' +require 'hash_dot' + +user = { address: { category: { desc: 'Urban'}}}.to_dot + +iterations = 50000 + +Benchmark.bm(8) do |bm| + bm.report("Default Notation :") { + iterations.times do; user[:address][:category][:desc]; end + } + + bm.report("Dot Notation :") { + iterations.times do; user.address.category.desc; end + } + + bm.report("OpenStruct :") { + iterations.times do; OpenStruct.new(user); end + } + + # Minus OpenStruct instantiation cost + os_user = OpenStruct.new(user) + bm.report("OpenStruct Single :") { + iterations.times do; os_user.address; end + } + + bm.report("Dot Notation Single:") { + iterations.times do; user.address; end + } +end + +# Benchmark Example +# user system total real +Default Notation : 0.010000 0.000000 0.010000 ( 0.008807) +Dot Notation : 0.190000 0.000000 0.190000 ( 0.195819) +OpenStruct : 0.400000 0.010000 0.410000 ( 0.399542) +OpenStruct Single : 0.010000 0.000000 0.010000 ( 0.011259) +Dot Notation Single: 0.080000 0.000000 0.080000 ( 0.082606) +``` + + ## Contributing -Bug reports and pull requests are welcome on GitHub at https://github.com/adsteel/hash_dot. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct. +Bug reports and pull requests are welcome on GitHub at https://github.com/adsteel/hash_dot. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](CODE_OF_CONDUCT.md) code of conduct. ## License The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).