transcriber 0.0.3 → 0.0.4
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.
- data/README.md +7 -5
- data/examples/all.rb +2 -6
- data/examples/embeds_many/simple.rb +2 -2
- data/examples/embeds_many/with_class_name.rb +4 -4
- data/examples/embeds_many/with_if.rb +6 -6
- data/examples/embeds_many/with_start_key.rb +4 -4
- data/examples/embeds_one/simple.rb +3 -3
- data/examples/embeds_one/with_class_name.rb +3 -3
- data/examples/embeds_one/with_if.rb +6 -6
- data/examples/embeds_one/with_start_key.rb +3 -3
- data/examples/has_many/simple.rb +3 -3
- data/examples/properties/collections.rb +12 -0
- data/examples/properties/simple.rb +3 -3
- data/examples/properties/with_field.rb +3 -3
- data/examples/properties/with_field_path.rb +3 -3
- data/examples/properties/with_id.rb +3 -3
- data/examples/properties/with_if.rb +13 -7
- data/examples/properties/with_key_converter.rb +3 -3
- data/examples/properties/with_two_key_converters.rb +29 -0
- data/examples/summarization/simple.rb +27 -0
- data/lib/transcriber.rb +8 -0
- data/lib/transcriber/configuration.rb +2 -0
- data/lib/transcriber/resource.rb +11 -18
- data/lib/transcriber/resource/builder.rb +1 -0
- data/lib/transcriber/resource/builder/keys.rb +1 -0
- data/lib/transcriber/resource/builder/summarizations.rb +3 -3
- data/lib/transcriber/resource/key.rb +3 -1
- data/lib/transcriber/resource/key/href.rb +11 -0
- data/lib/transcriber/resource/parser.rb +13 -3
- data/lib/transcriber/resource/response.rb +37 -5
- data/lib/transcriber/resource/response/href.rb +12 -0
- data/lib/transcriber/resource/response/relation.rb +4 -3
- data/lib/transcriber/version.rb +1 -1
- data/spec/integration/embeds_many_spec.rb +50 -0
- data/spec/integration/embeds_one_spec.rb +41 -0
- data/spec/integration/has_many_spec.rb +22 -4
- data/spec/integration/property_spec.rb +69 -0
- data/spec/integration/summarization_spec.rb +13 -0
- data/spec/spec_helper.rb +5 -1
- data/spec/support/examples.rb +6 -2
- data/spec/unit/input_path_spec.rb +1 -7
- data/spec/unit/resource/response/relation_spec.rb +3 -3
- data/spec/unit/resource_spec.rb +1 -1
- data/transcriber.gemspec +1 -1
- metadata +27 -16
    
        data/README.md
    CHANGED
    
    | @@ -91,7 +91,7 @@ Just define your `User` class like this: | |
| 91 91 |  | 
| 92 92 | 
             
            ## Embedding other resources
         | 
| 93 93 |  | 
| 94 | 
            -
            ### [ | 
| 94 | 
            +
            ### [embeds_one](https://github.com/rodrigues/transcriber/tree/master/examples/embeds_one)
         | 
| 95 95 |  | 
| 96 96 | 
             
                class Customer < Transcriber::Resource
         | 
| 97 97 | 
             
                  id field: 'cust_id'
         | 
| @@ -116,7 +116,7 @@ Just define your `User` class like this: | |
| 116 116 | 
             
                  href:  "http://app/api/users/1938713897398"
         | 
| 117 117 | 
             
                }
         | 
| 118 118 |  | 
| 119 | 
            -
            ### [ | 
| 119 | 
            +
            ### [embeds_many](https://github.com/rodrigues/transcriber/tree/master/examples/embeds_many)
         | 
| 120 120 |  | 
| 121 121 | 
             
                class OrderItems < Transcriber::Resource
         | 
| 122 122 | 
             
                  property :item_id,    id: true      # default serialization: String
         | 
| @@ -150,7 +150,9 @@ Just define your `User` class like this: | |
| 150 150 |  | 
| 151 151 | 
             
            ## Relations
         | 
| 152 152 |  | 
| 153 | 
            -
            ###  | 
| 153 | 
            +
            ### has_one
         | 
| 154 | 
            +
            ### has_many
         | 
| 155 | 
            +
            ### belongs_to
         | 
| 154 156 |  | 
| 155 157 | 
             
                class User < Transcriber::Resource
         | 
| 156 158 | 
             
                  id
         | 
| @@ -163,7 +165,7 @@ Just define your `User` class like this: | |
| 163 165 | 
             
                {
         | 
| 164 166 | 
             
                  id:    19837139879,
         | 
| 165 167 | 
             
                  login: 'jsmith180',
         | 
| 166 | 
            -
                   | 
| 168 | 
            +
                  link: [
         | 
| 167 169 | 
             
                    {
         | 
| 168 170 | 
             
                      rel:  'avatar',
         | 
| 169 171 | 
             
                      href: 'http://app/api/users/19837139879/avatar'
         | 
| @@ -195,7 +197,7 @@ If you want your api to handle `http://app/api/users/19371897318937?include[]=av | |
| 195 197 | 
             
                  guilda: {
         | 
| 196 198 | 
             
                    name: 'K1ll3rs'
         | 
| 197 199 | 
             
                  },
         | 
| 198 | 
            -
                   | 
| 200 | 
            +
                  link: [
         | 
| 199 201 | 
             
                    {
         | 
| 200 202 | 
             
                      rel:  'achievements',
         | 
| 201 203 | 
             
                      href: 'http://app/api/users/19837139879/achievements'
         | 
    
        data/examples/all.rb
    CHANGED
    
    | @@ -1,14 +1,10 @@ | |
| 1 1 | 
             
            $:.push 'lib'; require 'transcriber'
         | 
| 2 2 |  | 
| 3 3 | 
             
            Dir["examples/*/**.rb"].each do |file|
         | 
| 4 | 
            -
              [:Root, :Item, :Customer, :Entry].each do |klass|
         | 
| 4 | 
            +
              [:Root, :Item, :Customer, :Entry, :Service].each do |klass|
         | 
| 5 5 | 
             
                Object.send(:remove_const, klass) if Object.const_defined? klass
         | 
| 6 6 | 
             
              end
         | 
| 7 7 |  | 
| 8 | 
            -
              puts
         | 
| 9 | 
            -
              puts
         | 
| 10 | 
            -
              p "example file: #{file}"
         | 
| 11 | 
            -
              puts
         | 
| 12 | 
            -
              puts
         | 
| 8 | 
            +
              puts "\n\nexample file: #{file}\n\n"
         | 
| 13 9 | 
             
              load file
         | 
| 14 10 | 
             
            end
         | 
| @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            $:.push 'lib'; require 'transcriber'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class Item < Transcriber::Resource
         | 
| 4 | 
            -
              property :id
         | 
| 4 | 
            +
              property :id, type: Integer
         | 
| 5 5 | 
             
            end
         | 
| 6 6 |  | 
| 7 7 | 
             
            class Root < Transcriber::Resource
         | 
| 8 8 | 
             
              embeds_many :items
         | 
| 9 9 | 
             
            end
         | 
| 10 10 |  | 
| 11 | 
            -
            @root = Root.parse({"items" => [{"id" => 2000}]}).first
         | 
| 11 | 
            +
            @root = Root.parse({"items" => [{"id" => 2000}, {"id" => 2001}]}).first
         | 
| 12 12 |  | 
| 13 13 | 
             
            puts "root:     #{@root.inspect}"
         | 
| 14 14 | 
             
            puts "resource: #{@root.resource}"
         | 
| @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            $:.push 'lib'; require 'transcriber'
         | 
| 2 2 |  | 
| 3 3 | 
             
            class Entry < Transcriber::Resource
         | 
| 4 | 
            -
              property :id
         | 
| 4 | 
            +
              property :id, type: Integer
         | 
| 5 5 | 
             
            end
         | 
| 6 6 |  | 
| 7 7 | 
             
            class Root < Transcriber::Resource
         | 
| 8 8 | 
             
              embeds_many :items, class_name: :entry
         | 
| 9 9 | 
             
            end
         | 
| 10 10 |  | 
| 11 | 
            -
            root = Root.parse({"items" => [{"id" => 2000}]}).first
         | 
| 11 | 
            +
            @root = Root.parse({"items" => [{"id" => 2000}]}).first
         | 
| 12 12 |  | 
| 13 | 
            -
            puts "root:     #{root.inspect}"
         | 
| 14 | 
            -
            puts "resource: #{root.resource}"
         | 
| 13 | 
            +
            puts "root:     #{@root.inspect}"
         | 
| 14 | 
            +
            puts "resource: #{@root.resource}"
         | 
| @@ -9,13 +9,13 @@ class Root < Transcriber::Resource | |
| 9 9 | 
             
              embeds_many :items, if: proc {id == "10"}
         | 
| 10 10 | 
             
            end
         | 
| 11 11 |  | 
| 12 | 
            -
             | 
| 12 | 
            +
            @root_with_items = Root.parse({"id" => 10, "items" => [{"id" => 2000}]}).first
         | 
| 13 13 |  | 
| 14 | 
            -
            puts "root:     #{ | 
| 15 | 
            -
            puts "resource: #{ | 
| 14 | 
            +
            puts "root:     #{@root_with_items.inspect}"
         | 
| 15 | 
            +
            puts "resource: #{@root_with_items.resource}"
         | 
| 16 16 |  | 
| 17 17 |  | 
| 18 | 
            -
             | 
| 18 | 
            +
            @root_without_items = Root.parse({"id" => 1, "items" => [{"id" => 2000}]}).first
         | 
| 19 19 |  | 
| 20 | 
            -
            puts "root:     #{ | 
| 21 | 
            -
            puts "resource: #{ | 
| 20 | 
            +
            puts "root:     #{@root_without_items.inspect}"
         | 
| 21 | 
            +
            puts "resource: #{@root_without_items.resource}"
         | 
| @@ -10,8 +10,8 @@ class Root < Transcriber::Resource | |
| 10 10 | 
             
              embeds_many :items, start_key: 'detalhe.itens'
         | 
| 11 11 | 
             
            end
         | 
| 12 12 |  | 
| 13 | 
            -
            root = Root.parse({"detalhe" => {"itens" => [{"item_id" => 2000}]}}).first
         | 
| 13 | 
            +
            @root = Root.parse({"detalhe" => {"itens" => [{"item_id" => 2000}]}}).first
         | 
| 14 14 |  | 
| 15 | 
            -
            puts "root:     #{root.inspect}"
         | 
| 16 | 
            -
            puts "resource: #{root.resource}"
         | 
| 17 | 
            -
            puts "to_json:  #{root.resource.to_json}"
         | 
| 15 | 
            +
            puts "root:     #{@root.inspect}"
         | 
| 16 | 
            +
            puts "resource: #{@root.resource}"
         | 
| 17 | 
            +
            puts "to_json:  #{@root.resource.to_json}"
         | 
| @@ -8,7 +8,7 @@ class Item < Transcriber::Resource | |
| 8 8 | 
             
              property :id
         | 
| 9 9 | 
             
            end
         | 
| 10 10 |  | 
| 11 | 
            -
            root = Root.parse({"item" => {"id" => 2000}}).first
         | 
| 11 | 
            +
            @root = Root.parse({"item" => {"id" => 2000}}).first
         | 
| 12 12 |  | 
| 13 | 
            -
            puts "root:     #{root.inspect}"
         | 
| 14 | 
            -
            puts "resource: #{root.resource}"
         | 
| 13 | 
            +
            puts "root:     #{@root.inspect}"
         | 
| 14 | 
            +
            puts "resource: #{@root.resource}"
         | 
| @@ -8,7 +8,7 @@ class Root < Transcriber::Resource | |
| 8 8 | 
             
              embeds_one :item, class_name: :entry
         | 
| 9 9 | 
             
            end
         | 
| 10 10 |  | 
| 11 | 
            -
            root = Root.parse({"item" => {"id" => 2000}}).first
         | 
| 11 | 
            +
            @root = Root.parse({"item" => {"id" => 2000}}).first
         | 
| 12 12 |  | 
| 13 | 
            -
            puts "root:     #{root.inspect}"
         | 
| 14 | 
            -
            puts "resource: #{root.resource}"
         | 
| 13 | 
            +
            puts "root:     #{@root.inspect}"
         | 
| 14 | 
            +
            puts "resource: #{@root.resource}"
         | 
| @@ -9,13 +9,13 @@ class Item < Transcriber::Resource | |
| 9 9 | 
             
              property :id
         | 
| 10 10 | 
             
            end
         | 
| 11 11 |  | 
| 12 | 
            -
             | 
| 12 | 
            +
            @root_with_item = Root.parse({"id"=> 1, "item" => {"id" => 2000}}).first
         | 
| 13 13 |  | 
| 14 | 
            -
            puts "root:     #{ | 
| 15 | 
            -
            puts "resource: #{ | 
| 14 | 
            +
            puts "root:     #{@root_with_item.inspect}"
         | 
| 15 | 
            +
            puts "resource: #{@root_with_item.resource}"
         | 
| 16 16 |  | 
| 17 17 |  | 
| 18 | 
            -
             | 
| 18 | 
            +
            @root_without_item = Root.parse({"id"=> 100, "item" => {"id" => 2000}}).first
         | 
| 19 19 |  | 
| 20 | 
            -
            puts "root:     #{ | 
| 21 | 
            -
            puts "resource: #{ | 
| 20 | 
            +
            puts "root:     #{@root_without_item.inspect}"
         | 
| 21 | 
            +
            puts "resource: #{@root_without_item.resource}"
         | 
| @@ -8,7 +8,7 @@ class Item < Transcriber::Resource | |
| 8 8 | 
             
              property :id
         | 
| 9 9 | 
             
            end
         | 
| 10 10 |  | 
| 11 | 
            -
            root = Root.parse({"ugly_nesting_key" => {"id" => 2000}}).first
         | 
| 11 | 
            +
            @root = Root.parse({"ugly_nesting_key" => {"id" => 2000}}).first
         | 
| 12 12 |  | 
| 13 | 
            -
            puts "root:     #{root.inspect}"
         | 
| 14 | 
            -
            puts "resource: #{root.resource}"
         | 
| 13 | 
            +
            puts "root:     #{@root.inspect}"
         | 
| 14 | 
            +
            puts "resource: #{@root.resource}"
         | 
    
        data/examples/has_many/simple.rb
    CHANGED
    
    | @@ -16,14 +16,14 @@ class Developer < Transcriber::Resource | |
| 16 16 | 
             
            end
         | 
| 17 17 |  | 
| 18 18 | 
             
            class Customer < Transcriber::Resource
         | 
| 19 | 
            -
              id field: :customer_id
         | 
| 19 | 
            +
              id field: :customer_id, type: Integer
         | 
| 20 20 | 
             
              property :login
         | 
| 21 21 | 
             
              has_many :services
         | 
| 22 22 | 
             
              has_one :billing
         | 
| 23 | 
            -
              has_one : | 
| 23 | 
            +
              has_one :devops, class_name: :developer
         | 
| 24 24 | 
             
            end
         | 
| 25 25 |  | 
| 26 | 
            -
            @root = Customer.parse({"customer_id" => 123, "login" =>  | 
| 26 | 
            +
            @root = Customer.parse({"customer_id" => 123, "login" => 'jackiechan2010'}).first
         | 
| 27 27 |  | 
| 28 28 | 
             
            puts "root:     #{@root.inspect}"
         | 
| 29 29 | 
             
            puts "resource: #{@root.resource}"
         | 
| @@ -0,0 +1,12 @@ | |
| 1 | 
            +
            $:.push 'lib'; require 'transcriber'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class Customer < Transcriber::Resource
         | 
| 4 | 
            +
              property :login
         | 
| 5 | 
            +
            end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            @customers = Customer.parse([{"login" => "jackiechan2010"},
         | 
| 8 | 
            +
                                         {"login" => "brucelee"},
         | 
| 9 | 
            +
                                         {"login" => "vcr2"}])
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            puts "root:     #{@customers.inspect}"
         | 
| 12 | 
            +
            puts "resource: #{Customer.resources @customers}"
         | 
| @@ -4,7 +4,7 @@ class Customer < Transcriber::Resource | |
| 4 4 | 
             
              property :login
         | 
| 5 5 | 
             
            end
         | 
| 6 6 |  | 
| 7 | 
            -
            root = Customer.parse({"login" =>  | 
| 7 | 
            +
            @root = Customer.parse({"login" => 'jackiechan2010'}).first
         | 
| 8 8 |  | 
| 9 | 
            -
            puts "root:     #{root.inspect}"
         | 
| 10 | 
            -
            puts "resource: #{root.resource}"
         | 
| 9 | 
            +
            puts "root:     #{@root.inspect}"
         | 
| 10 | 
            +
            puts "resource: #{@root.resource}"
         | 
| @@ -4,7 +4,7 @@ class Customer < Transcriber::Resource | |
| 4 4 | 
             
              property :login, field: :customer_login
         | 
| 5 5 | 
             
            end
         | 
| 6 6 |  | 
| 7 | 
            -
            root = Customer.parse({"customer_login" =>  | 
| 7 | 
            +
            @root = Customer.parse({"customer_login" => 'jackiechan2010'}).first
         | 
| 8 8 |  | 
| 9 | 
            -
            puts "root:     #{root.inspect}"
         | 
| 10 | 
            -
            puts "resource: #{root.resource}"
         | 
| 9 | 
            +
            puts "root:     #{@root.inspect}"
         | 
| 10 | 
            +
            puts "resource: #{@root.resource}"
         | 
| @@ -4,7 +4,7 @@ class Customer < Transcriber::Resource | |
| 4 4 | 
             
              property :login, field: 'hidden.login'
         | 
| 5 5 | 
             
            end
         | 
| 6 6 |  | 
| 7 | 
            -
            root = Customer.parse({"hidden" => {"login" =>  | 
| 7 | 
            +
            @root = Customer.parse({"hidden" => {"login" => 'jackiechan2010'}}).first
         | 
| 8 8 |  | 
| 9 | 
            -
            puts "root:     #{root.inspect}"
         | 
| 10 | 
            -
            puts "resource: #{root.resource}"
         | 
| 9 | 
            +
            puts "root:     #{@root.inspect}"
         | 
| 10 | 
            +
            puts "resource: #{@root.resource}"
         | 
| @@ -4,7 +4,7 @@ class Customer < Transcriber::Resource | |
| 4 4 | 
             
              id
         | 
| 5 5 | 
             
            end
         | 
| 6 6 |  | 
| 7 | 
            -
            root = Customer.parse({"id" => 2000}).first
         | 
| 7 | 
            +
            @root = Customer.parse({"id" => 2000}).first
         | 
| 8 8 |  | 
| 9 | 
            -
            puts "root:     #{root.inspect}"
         | 
| 10 | 
            -
            puts "resource: #{root.resource}"
         | 
| 9 | 
            +
            puts "root:     #{@root.inspect}"
         | 
| 10 | 
            +
            puts "resource: #{@root.resource}"
         | 
| @@ -3,17 +3,23 @@ $:.push 'lib'; require 'transcriber' | |
| 3 3 | 
             
            class Customer < Transcriber::Resource
         | 
| 4 4 | 
             
              property :login
         | 
| 5 5 | 
             
              property :password
         | 
| 6 | 
            -
              property : | 
| 6 | 
            +
              property :description, if: proc {password == "abc"}
         | 
| 7 7 | 
             
            end
         | 
| 8 8 |  | 
| 9 | 
            -
             | 
| 9 | 
            +
            @root_with_description = Customer.parse({
         | 
| 10 | 
            +
              "login" => 2000,
         | 
| 11 | 
            +
              "password" => "abc",
         | 
| 12 | 
            +
              "description" => "description"}).first
         | 
| 10 13 |  | 
| 11 14 |  | 
| 12 | 
            -
            puts "root:     #{ | 
| 13 | 
            -
            puts "resource: #{ | 
| 15 | 
            +
            puts "root:     #{@root_with_description.inspect}"
         | 
| 16 | 
            +
            puts "resource: #{@root_with_description.resource}"
         | 
| 14 17 |  | 
| 15 18 |  | 
| 16 | 
            -
             | 
| 19 | 
            +
            @root_without_description = Customer.parse({
         | 
| 20 | 
            +
              "login" => 2000,
         | 
| 21 | 
            +
              "password" => "abcd",
         | 
| 22 | 
            +
              "description" => "some text II"}).first
         | 
| 17 23 |  | 
| 18 | 
            -
            puts "root:     #{ | 
| 19 | 
            -
            puts "resource: #{ | 
| 24 | 
            +
            puts "root:     #{@root_without_description.inspect}"
         | 
| 25 | 
            +
            puts "resource: #{@root_without_description.resource}"
         | 
| @@ -14,7 +14,7 @@ class Customer < Transcriber::Resource | |
| 14 14 | 
             
              property :login
         | 
| 15 15 | 
             
            end
         | 
| 16 16 |  | 
| 17 | 
            -
            root = Customer.parse({"LOGIN" =>  | 
| 17 | 
            +
            @root = Customer.parse({"LOGIN" => 'jackiechan2010'}).first
         | 
| 18 18 |  | 
| 19 | 
            -
            puts "root:     #{root.inspect}"
         | 
| 20 | 
            -
            puts "resource: #{root.resource}"
         | 
| 19 | 
            +
            puts "root:     #{@root.inspect}"
         | 
| 20 | 
            +
            puts "resource: #{@root.resource}"
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            $:.push 'lib'; require 'transcriber'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Upcasing
         | 
| 4 | 
            +
              def self.call(keys)
         | 
| 5 | 
            +
                keys.map {|key| key.to_s.upcase}
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
            end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            module Camelizing
         | 
| 10 | 
            +
              def self.call(keys)
         | 
| 11 | 
            +
                keys.map {|key| key.to_s.camelize}
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            class Customer < Transcriber::Resource
         | 
| 16 | 
            +
              convert_input_keys Upcasing
         | 
| 17 | 
            +
              property :login
         | 
| 18 | 
            +
              embeds_one :product
         | 
| 19 | 
            +
            end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            class Product < Transcriber::Resource
         | 
| 22 | 
            +
              convert_input_keys Camelizing
         | 
| 23 | 
            +
              property :unit_price, type: Float
         | 
| 24 | 
            +
            end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            @root = Customer.parse({"LOGIN" => 'jackiechan2010', "PRODUCT" => {"UnitPrice" => 29.9}}).first
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            puts "root:     #{@root.inspect}"
         | 
| 29 | 
            +
            puts "resource: #{@root.resource}"
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            $:.push 'lib'; require 'transcriber'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module AsDefined
         | 
| 4 | 
            +
              def self.call(keys)
         | 
| 5 | 
            +
                keys
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
            end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            class Customer < Transcriber::Resource
         | 
| 10 | 
            +
              convert_input_keys AsDefined
         | 
| 11 | 
            +
              id
         | 
| 12 | 
            +
              properties :login, :name, :postal_code, :email, :secondary_email
         | 
| 13 | 
            +
              summarizes :id, :login
         | 
| 14 | 
            +
            end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            input = {
         | 
| 17 | 
            +
              id:               138911938,
         | 
| 18 | 
            +
              login:           'jackiechan2010',
         | 
| 19 | 
            +
              name:            'jackie chan',
         | 
| 20 | 
            +
              postal_code:     '05492-092',
         | 
| 21 | 
            +
              email:           'jachan@gmail.com',
         | 
| 22 | 
            +
              secondary_email: 'jackiepeligroso@yahoo.com'
         | 
| 23 | 
            +
            }
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            @root = Customer.transcribe(input)
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            puts "resources: #{@root.inspect}"
         | 
    
        data/lib/transcriber.rb
    CHANGED
    
    | @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            require 'date'
         | 
| 2 2 | 
             
            require 'active_support/inflector'
         | 
| 3 | 
            +
            require 'active_support/concern'
         | 
| 3 4 | 
             
            require 'active_support/core_ext/class/attribute_accessors'
         | 
| 4 5 | 
             
            require 'active_support/core_ext/object/try'
         | 
| 5 6 | 
             
            require 'active_support/core_ext/array/wrap'
         | 
| @@ -19,14 +20,17 @@ require 'transcriber/resource/parser/embeddable' | |
| 19 20 | 
             
            require 'transcriber/resource/response/property'
         | 
| 20 21 | 
             
            require 'transcriber/resource/response/embeddable'
         | 
| 21 22 | 
             
            require 'transcriber/resource/response/relation'
         | 
| 23 | 
            +
            require 'transcriber/resource/response/href'
         | 
| 22 24 | 
             
            require 'transcriber/resource/key/property'
         | 
| 23 25 | 
             
            require 'transcriber/resource/key/association'
         | 
| 24 26 | 
             
            require 'transcriber/resource/key/relation'
         | 
| 25 27 | 
             
            require 'transcriber/resource/key/embeddable'
         | 
| 28 | 
            +
            require 'transcriber/resource/key/href'
         | 
| 26 29 | 
             
            require 'transcriber/resource/builder/keys'
         | 
| 27 30 | 
             
            require 'transcriber/resource/builder/relations'
         | 
| 28 31 | 
             
            require 'transcriber/resource/builder/embeddables'
         | 
| 29 32 | 
             
            require 'transcriber/resource/builder/properties'
         | 
| 33 | 
            +
            require 'transcriber/resource/builder/summarizations'
         | 
| 30 34 | 
             
            require 'transcriber/resource/builder'
         | 
| 31 35 | 
             
            require 'transcriber/resource'
         | 
| 32 36 | 
             
            require 'transcriber/configuration'
         | 
| @@ -39,4 +43,8 @@ module Transcriber | |
| 39 43 | 
             
              def self.configure
         | 
| 40 44 | 
             
                yield configuration if block_given?
         | 
| 41 45 | 
             
              end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              def self.host
         | 
| 48 | 
            +
                configuration.host
         | 
| 49 | 
            +
              end
         | 
| 42 50 | 
             
            end
         | 
    
        data/lib/transcriber/resource.rb
    CHANGED
    
    | @@ -2,7 +2,7 @@ module Transcriber | |
| 2 2 | 
             
              class Resource
         | 
| 3 3 | 
             
                extend  Builder
         | 
| 4 4 | 
             
                extend  Parser
         | 
| 5 | 
            -
                 | 
| 5 | 
            +
                include Response
         | 
| 6 6 | 
             
                include Serialization
         | 
| 7 7 |  | 
| 8 8 | 
             
                cattr_accessor :id_key
         | 
| @@ -16,6 +16,10 @@ module Transcriber | |
| 16 16 | 
             
                  @keys ||= []
         | 
| 17 17 | 
             
                end
         | 
| 18 18 |  | 
| 19 | 
            +
                def self.summarized_keys
         | 
| 20 | 
            +
                  @summarized_keys ||= []
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 19 23 | 
             
                def self.relations
         | 
| 20 24 | 
             
                  @keys.find_all {|k| k.kind_of?(Relation)}
         | 
| 21 25 | 
             
                end
         | 
| @@ -24,24 +28,13 @@ module Transcriber | |
| 24 28 | 
             
                  @resource_name ||= custom_name or to_s.demodulize.tableize
         | 
| 25 29 | 
             
                end
         | 
| 26 30 |  | 
| 27 | 
            -
                def  | 
| 28 | 
            -
                   | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
                def resource(options = {})
         | 
| 32 | 
            -
                  root = options.fetch(:root, true)
         | 
| 33 | 
            -
                  {}.tap do |resource|
         | 
| 34 | 
            -
                    self.class.keys.inject(resource) {|buffer, key| buffer.merge!(key.to_resource(self))}
         | 
| 35 | 
            -
                    resource.merge!({links: links}) if root and self.class.relations.any?
         | 
| 36 | 
            -
                  end
         | 
| 37 | 
            -
                end
         | 
| 38 | 
            -
             | 
| 39 | 
            -
                def links
         | 
| 40 | 
            -
                  self.class.relations.map {|key| key.to_relation(self)}
         | 
| 31 | 
            +
                def self.convert_input_keys(converter = nil)
         | 
| 32 | 
            +
                  @convert_input_keys = converter if converter
         | 
| 33 | 
            +
                  @convert_input_keys
         | 
| 41 34 | 
             
                end
         | 
| 42 35 |  | 
| 43 | 
            -
                def  | 
| 44 | 
            -
                   | 
| 36 | 
            +
                def resource_id
         | 
| 37 | 
            +
                  __send__(id_key.name)
         | 
| 45 38 | 
             
                end
         | 
| 46 39 |  | 
| 47 40 | 
             
                def self.method_added(method_name)
         | 
| @@ -50,7 +43,7 @@ module Transcriber | |
| 50 43 | 
             
                end
         | 
| 51 44 |  | 
| 52 45 | 
             
                def self.not_allowed_names
         | 
| 53 | 
            -
                  ["resource_id", "resource", " | 
| 46 | 
            +
                  ["resource_id", "resource", "link"]
         | 
| 54 47 | 
             
                end
         | 
| 55 48 | 
             
              end
         | 
| 56 49 | 
             
            end
         | 
| @@ -1,11 +1,11 @@ | |
| 1 1 | 
             
            module Transcriber
         | 
| 2 2 | 
             
              class Resource
         | 
| 3 3 | 
             
                module Builder
         | 
| 4 | 
            -
                  module  | 
| 5 | 
            -
                    def summarizes(*args | 
| 4 | 
            +
                  module Summarizations
         | 
| 5 | 
            +
                    def summarizes(*args)
         | 
| 6 6 | 
             
                      args.each do |name|
         | 
| 7 7 | 
             
                        key = keys.find {|key| key.name == name}
         | 
| 8 | 
            -
                         | 
| 8 | 
            +
                        summarized_keys << key if key
         | 
| 9 9 | 
             
                      end
         | 
| 10 10 | 
             
                    end
         | 
| 11 11 | 
             
                  end
         | 
| @@ -2,6 +2,7 @@ module Transcriber | |
| 2 2 | 
             
              class Resource
         | 
| 3 3 | 
             
                class Key
         | 
| 4 4 | 
             
                  attr_accessor :name
         | 
| 5 | 
            +
                  attr_accessor :model
         | 
| 5 6 | 
             
                  attr_accessor :options
         | 
| 6 7 | 
             
                  attr_accessor :summarize
         | 
| 7 8 |  | 
| @@ -31,7 +32,8 @@ module Transcriber | |
| 31 32 | 
             
                  end
         | 
| 32 33 |  | 
| 33 34 | 
             
                  def convert_input_keys
         | 
| 34 | 
            -
                    options.fetch(:convert_input_keys,  | 
| 35 | 
            +
                    options.fetch(:convert_input_keys, model.try(:convert_input_keys) ||
         | 
| 36 | 
            +
                                  Transcriber.configuration.convert_input_keys)
         | 
| 35 37 | 
             
                  end
         | 
| 36 38 | 
             
                end
         | 
| 37 39 | 
             
              end
         | 
| @@ -1,8 +1,14 @@ | |
| 1 1 | 
             
            module Transcriber
         | 
| 2 2 | 
             
              class Resource
         | 
| 3 3 | 
             
                module Parser
         | 
| 4 | 
            +
                  def parse!(input, options = {})
         | 
| 5 | 
            +
                    parse(input, options.merge(fail: true))
         | 
| 6 | 
            +
                  end
         | 
| 7 | 
            +
             | 
| 4 8 | 
             
                  def parse(input, options = {})
         | 
| 5 | 
            -
                    prepare_entries(input, options).collect  | 
| 9 | 
            +
                    prepare_entries(input, options).collect do |item|
         | 
| 10 | 
            +
                      parse_item(item, options)
         | 
| 11 | 
            +
                    end
         | 
| 6 12 | 
             
                  end
         | 
| 7 13 |  | 
| 8 14 | 
             
                  private
         | 
| @@ -12,11 +18,15 @@ module Transcriber | |
| 12 18 | 
             
                    Array.wrap digg(input, path)
         | 
| 13 19 | 
             
                  end
         | 
| 14 20 |  | 
| 15 | 
            -
                  def parse_item(item)
         | 
| 21 | 
            +
                  def parse_item(item, options)
         | 
| 16 22 | 
             
                    self.new.tap do |resource|
         | 
| 17 23 | 
             
                      keys.each do |key|
         | 
| 18 24 | 
             
                        value = digg(item, key.input_path)
         | 
| 19 | 
            -
                         | 
| 25 | 
            +
                        begin
         | 
| 26 | 
            +
                          resource.__send__("#{key.name}=", key.parse(value, resource)) if key.present?(resource)
         | 
| 27 | 
            +
                        rescue => exception
         | 
| 28 | 
            +
                          raise exception if options[:fail]
         | 
| 29 | 
            +
                        end
         | 
| 20 30 | 
             
                      end
         | 
| 21 31 | 
             
                    end
         | 
| 22 32 | 
             
                  end
         | 
| @@ -1,12 +1,44 @@ | |
| 1 1 | 
             
            module Transcriber
         | 
| 2 2 | 
             
              class Resource
         | 
| 3 3 | 
             
                module Response
         | 
| 4 | 
            -
                   | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 4 | 
            +
                  extend ActiveSupport::Concern
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  def resource(options = {})
         | 
| 7 | 
            +
                    root = options.fetch(:root, true)
         | 
| 8 | 
            +
                    {}.tap do |resource|
         | 
| 9 | 
            +
                      resource_keys(options).inject(resource) do |buffer, key|
         | 
| 10 | 
            +
                        buffer.merge!(key.to_resource(self))
         | 
| 11 | 
            +
                      end
         | 
| 12 | 
            +
                      resource.merge!({link: link}) if root and self.class.relations.any?
         | 
| 13 | 
            +
                    end
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def link
         | 
| 17 | 
            +
                    self.class.relations.map {|key| key.to_relation(self)}
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  def resource_keys(options)
         | 
| 21 | 
            +
                    return self.class.keys unless summarize?(options)
         | 
| 22 | 
            +
                    self.class.summarized_keys + [Resource::Href.new]
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  def summarize?(options)
         | 
| 26 | 
            +
                    options[:summarize] and self.class.summarized_keys.any?
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  module ClassMethods
         | 
| 30 | 
            +
                    def normalize(model, options = {})
         | 
| 31 | 
            +
                      model.kind_of?(Enumerable) ?
         | 
| 32 | 
            +
                        {entries: model.map {|m| m.resource(options.merge(summarize: true))}}
         | 
| 33 | 
            +
                       : model.resource(options)
         | 
| 34 | 
            +
                    end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                    alias :resources :normalize
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    def transcribe(input, options = {})
         | 
| 39 | 
            +
                      normalize(parse(input, options), options)
         | 
| 40 | 
            +
                    end
         | 
| 8 41 | 
             
                  end
         | 
| 9 | 
            -
                  alias :resources :normalize
         | 
| 10 42 | 
             
                end
         | 
| 11 43 | 
             
              end
         | 
| 12 44 | 
             
            end
         | 
| @@ -9,7 +9,7 @@ module Transcriber | |
| 9 9 | 
             
                    end
         | 
| 10 10 |  | 
| 11 11 | 
             
                    def to_relation(parent)
         | 
| 12 | 
            -
                      {: | 
| 12 | 
            +
                      {rel: name, href: href(parent)}
         | 
| 13 13 | 
             
                    end
         | 
| 14 14 |  | 
| 15 15 | 
             
                    private
         | 
| @@ -29,9 +29,10 @@ module Transcriber | |
| 29 29 | 
             
                    end
         | 
| 30 30 |  | 
| 31 31 | 
             
                    def href(parent)
         | 
| 32 | 
            +
                      id_key = parent.class.id_key.name
         | 
| 32 33 | 
             
                      has? ?
         | 
| 33 | 
            -
                        "/#{parent.class.resource_name}/#{parent. | 
| 34 | 
            -
                      : "/#{relation_name(parent).to_s.pluralize}/#{parent. | 
| 34 | 
            +
                        "#{Transcriber.host}/#{parent.class.resource_name}/#{parent.send(id_key)}/#{relation_name(parent)}"
         | 
| 35 | 
            +
                      : "#{Transcriber.host}/#{relation_name(parent).to_s.pluralize}/#{parent.send(id_key)}/#{parent.class.resource_name}"
         | 
| 35 36 | 
             
                    end
         | 
| 36 37 | 
             
                  end
         | 
| 37 38 | 
             
                end
         | 
    
        data/lib/transcriber/version.rb
    CHANGED
    
    
| @@ -0,0 +1,50 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe_example 'embeds_many/simple' do
         | 
| 4 | 
            +
              it 'parses first embedded item' do
         | 
| 5 | 
            +
                root.items[0].id.should == 2000
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              it 'parses second embedded item' do
         | 
| 9 | 
            +
                root.items[1].id.should == 2001
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
            end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
             | 
| 14 | 
            +
            describe_example 'embeds_many/invisible' do
         | 
| 15 | 
            +
              it 'parses invisible item correctly' do
         | 
| 16 | 
            +
                root.locale.should == 'pt-BR'
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              it "doesn't show embedded items in resource" do
         | 
| 20 | 
            +
                root.resource.should_not have_key('locale')
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            describe_example 'embeds_many/with_class_name' do
         | 
| 25 | 
            +
              it 'parses embedded item' do
         | 
| 26 | 
            +
                root.items[0].id.should == 2000
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
            end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            describe_example 'embeds_many/with_if' do
         | 
| 31 | 
            +
              context 'when an embeddable has a conditional proc (:if)' do
         | 
| 32 | 
            +
                context 'and it evaluates to true' do
         | 
| 33 | 
            +
                  it 'parses embedded item' do
         | 
| 34 | 
            +
                    root_with_items.items.first.id.should == "2000"
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                context 'and it evaluates to false' do
         | 
| 39 | 
            +
                  it "doesn't parse embedded item" do
         | 
| 40 | 
            +
                    root_without_items.items.should_not be
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
            end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            describe_example 'embeds_many/with_start_key' do
         | 
| 47 | 
            +
              it 'parses embedded items' do
         | 
| 48 | 
            +
                root.items.first.id.should == "2000"
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
            end
         | 
| @@ -0,0 +1,41 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe_example "embeds_one/simple" do
         | 
| 4 | 
            +
              it 'parses embedded item' do
         | 
| 5 | 
            +
                root.item.id.should == "2000"
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
            end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            describe_example "embeds_one/with_class_name" do
         | 
| 10 | 
            +
              context 'when a different class name is used for embeddable' do
         | 
| 11 | 
            +
                it 'parses embedded item' do
         | 
| 12 | 
            +
                  root.item.id.should == "2000"
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            describe_example "embeds_one/with_if" do
         | 
| 18 | 
            +
              context 'when an embeddable has a conditional proc (:if)' do
         | 
| 19 | 
            +
                context 'and it evaluates to true' do
         | 
| 20 | 
            +
                  it 'parses embedded item' do
         | 
| 21 | 
            +
                    root_with_item.id.should == "1"
         | 
| 22 | 
            +
                    root_with_item.item.id.should == "2000"
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                context 'and it evaluates to false' do
         | 
| 27 | 
            +
                  it "doesn't parse embedded item" do
         | 
| 28 | 
            +
                    root_without_item.id.should == "100"
         | 
| 29 | 
            +
                    root_without_item.item.should_not be
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
            end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            describe_example "embeds_one/with_start_key" do
         | 
| 36 | 
            +
              context 'when there is a start key to parse input' do
         | 
| 37 | 
            +
                it 'parses embedded item' do
         | 
| 38 | 
            +
                  root.item.id.should == "2000"
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
            end
         | 
| @@ -1,9 +1,27 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
               | 
| 5 | 
            -
                 | 
| 6 | 
            -
             | 
| 3 | 
            +
            describe_example "has_many/simple" do
         | 
| 4 | 
            +
              it 'parses properly' do
         | 
| 5 | 
            +
                root.id.should == 123
         | 
| 6 | 
            +
                root.login.should == 'jackiechan2010'
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              describe "#resource" do
         | 
| 10 | 
            +
                subject {root.resource}
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                it 'has a link' do
         | 
| 13 | 
            +
                  subject[:link].should be_an(Array)
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                [:services, :billing, :devops].each do |rel|
         | 
| 17 | 
            +
                  it "has a #{rel} relation" do
         | 
| 18 | 
            +
                    subject[:link].any? {|l| l[:rel] == rel}.should be_true
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  it "has a href for #{rel} relation" do
         | 
| 22 | 
            +
                    link = subject[:link].find {|l| l[:rel] == rel}
         | 
| 23 | 
            +
                    link[:href].should =~ %r{/customers/123/#{rel}}
         | 
| 24 | 
            +
                  end
         | 
| 7 25 | 
             
                end
         | 
| 8 26 | 
             
              end
         | 
| 9 27 | 
             
            end
         | 
| @@ -0,0 +1,69 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            def it_parses_property
         | 
| 4 | 
            +
              it 'parses property' do
         | 
| 5 | 
            +
                root.login.should == 'jackiechan2010'
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
            end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            describe_example 'properties/simple' do
         | 
| 10 | 
            +
              it_parses_property
         | 
| 11 | 
            +
            end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            describe_example 'properties/with_field' do
         | 
| 14 | 
            +
              context 'when input has a different name for the property' do
         | 
| 15 | 
            +
                it_parses_property
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
            end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            describe_example 'properties/with_field_path' do
         | 
| 20 | 
            +
              context 'when input has a different path for the property' do
         | 
| 21 | 
            +
                it_parses_property
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            describe_example 'properties/with_id' do
         | 
| 26 | 
            +
              context 'when property is an id' do
         | 
| 27 | 
            +
                it 'parses id' do
         | 
| 28 | 
            +
                  root.id.should == "2000"
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
            end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            describe_example 'properties/with_if' do
         | 
| 34 | 
            +
              context 'when a property has a conditional proc (:if)' do
         | 
| 35 | 
            +
                context 'and it evaluates to true' do
         | 
| 36 | 
            +
                  it 'parses property' do
         | 
| 37 | 
            +
                    root_with_description.description.should == "description"
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                context 'and it evaluates to false' do
         | 
| 42 | 
            +
                  it "doesn't parse property" do
         | 
| 43 | 
            +
                    root_without_description.description.should_not be
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
            end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            describe_example 'properties/with_key_converter' do
         | 
| 50 | 
            +
              after do
         | 
| 51 | 
            +
                Transcriber.configure do |c|
         | 
| 52 | 
            +
                  c.convert_input_keys = nil
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
              end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
              context 'when a diferent key converter is configured on transcriber' do
         | 
| 57 | 
            +
                it_parses_property
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
            end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            describe_example 'properties/with_two_key_converters' do
         | 
| 62 | 
            +
              context 'when key converters are configured for each class' do
         | 
| 63 | 
            +
                it_parses_property
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                it 'parses other property with different key converter' do
         | 
| 66 | 
            +
                  root.product.unit_price.should == 29.9
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
              end
         | 
| 69 | 
            +
            end
         | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe_example 'summarization/simple' do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              subject {root[:entries].first}
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              it 'summarizes resources' do
         | 
| 8 | 
            +
                subject.keys.count.should == 3
         | 
| 9 | 
            +
                subject[:id].should    == '138911938'
         | 
| 10 | 
            +
                subject[:login].should == 'jackiechan2010'
         | 
| 11 | 
            +
                subject[:href].should  == 'http://example.com/customers/138911938'
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
            end
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -10,7 +10,7 @@ require 'support/examples' | |
| 10 10 | 
             
            require 'support/out'
         | 
| 11 11 |  | 
| 12 12 | 
             
            RSpec.configure do |config|
         | 
| 13 | 
            -
              config.before | 
| 13 | 
            +
              config.before do
         | 
| 14 14 | 
             
                [:Example, :ExampleChild].each do |klass|
         | 
| 15 15 | 
             
                  Object.send(:remove_const, klass) if Object.const_defined? klass
         | 
| 16 16 | 
             
                end
         | 
| @@ -20,3 +20,7 @@ end | |
| 20 20 | 
             
            include Transcriber
         | 
| 21 21 | 
             
            include Output
         | 
| 22 22 | 
             
            include Examples
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            Transcriber.configure do |c|
         | 
| 25 | 
            +
              c.host = 'http://example.com'
         | 
| 26 | 
            +
            end
         | 
    
        data/spec/support/examples.rb
    CHANGED
    
    | @@ -1,6 +1,10 @@ | |
| 1 1 | 
             
            module Examples
         | 
| 2 | 
            -
              def  | 
| 3 | 
            -
                 | 
| 2 | 
            +
              def describe_example(file, &block)
         | 
| 3 | 
            +
                describe "example #{file}" do
         | 
| 4 | 
            +
                  [:Root, :Item, :Customer, :Entry].each do |klass|
         | 
| 5 | 
            +
                    Examples.send(:remove_const, klass) if Examples.const_defined?(klass)
         | 
| 6 | 
            +
                  end
         | 
| 7 | 
            +
             | 
| 4 8 | 
             
                  silently {eval File.read("examples/#{file}.rb")}
         | 
| 5 9 |  | 
| 6 10 | 
             
                  variables = instance_variables.reject {|var| var.to_s =~ /metadata$/}
         | 
| @@ -53,13 +53,7 @@ describe Resource::InputPath do | |
| 53 53 | 
             
                end
         | 
| 54 54 |  | 
| 55 55 | 
             
                context "and there is a custom keys input converter" do
         | 
| 56 | 
            -
                  let(:options)  | 
| 57 | 
            -
                    {
         | 
| 58 | 
            -
                      start_key:          'yay.upcase.path',
         | 
| 59 | 
            -
                      convert_input_keys: Upcasing
         | 
| 60 | 
            -
                    }
         | 
| 61 | 
            -
                  end
         | 
| 62 | 
            -
             | 
| 56 | 
            +
                  let(:options) {{start_key: 'yay.upcase.path', convert_input_keys: Upcasing}}
         | 
| 63 57 | 
             
                  subject {Resource::Key.new(:name, options)}
         | 
| 64 58 | 
             
                  let(:path) {['YAY', 'UPCASE', 'PATH']}
         | 
| 65 59 | 
             
                  it_behaves_like "an input path"
         | 
| @@ -44,7 +44,7 @@ describe Resource::Response do | |
| 44 44 | 
             
                subject {Example.keys[1]}
         | 
| 45 45 |  | 
| 46 46 | 
             
                let(:example) {Example.new(id: 100)}
         | 
| 47 | 
            -
                let(:result)  {{rel: :example_child, href: "/examples/100/example_child"}}
         | 
| 47 | 
            +
                let(:result)  {{rel: :example_child, href: "http://example.com/examples/100/example_child"}}
         | 
| 48 48 |  | 
| 49 49 | 
             
                it_behaves_like "a relation"
         | 
| 50 50 | 
             
              end
         | 
| @@ -65,7 +65,7 @@ describe Resource::Response do | |
| 65 65 | 
             
                subject {Example.keys[1]}
         | 
| 66 66 |  | 
| 67 67 | 
             
                let(:example) {Example.new(id: 200)}
         | 
| 68 | 
            -
                let(:result)  {{rel: :example_children, href: "/examples/200/example_children"}}
         | 
| 68 | 
            +
                let(:result)  {{rel: :example_children, href: "http://example.com/examples/200/example_children"}}
         | 
| 69 69 |  | 
| 70 70 | 
             
                it_behaves_like "a relation"
         | 
| 71 71 | 
             
              end
         | 
| @@ -86,7 +86,7 @@ describe Resource::Response do | |
| 86 86 | 
             
                subject {ExampleChild.keys[1]}
         | 
| 87 87 |  | 
| 88 88 | 
             
                let(:example) {ExampleChild.new(id: 200)}
         | 
| 89 | 
            -
                let(:result)  {{rel: :example, href: "/examples/200/example_children"}}
         | 
| 89 | 
            +
                let(:result)  {{rel: :example, href: "http://example.com/examples/200/example_children"}}
         | 
| 90 90 |  | 
| 91 91 | 
             
                it_behaves_like "a relation"
         | 
| 92 92 | 
             
              end
         | 
    
        data/spec/unit/resource_spec.rb
    CHANGED
    
    | @@ -17,7 +17,7 @@ describe Resource do | |
| 17 17 | 
             
              end
         | 
| 18 18 |  | 
| 19 19 | 
             
              context "when using not allowed names" do
         | 
| 20 | 
            -
                [:resource_id, :resource, : | 
| 20 | 
            +
                [:resource_id, :resource, :link].each do |unallowed|
         | 
| 21 21 | 
             
                  it "warns when method #{unallowed} is redefined" do
         | 
| 22 22 | 
             
                    output = out do
         | 
| 23 23 | 
             
                      eval <<-RUBY
         | 
    
        data/transcriber.gemspec
    CHANGED
    
    | @@ -18,7 +18,7 @@ Gem::Specification.new do |s| | |
| 18 18 | 
             
              s.require_paths = ["lib"]
         | 
| 19 19 |  | 
| 20 20 | 
             
              s.add_dependency "activesupport", "~> 3.0"
         | 
| 21 | 
            -
              s.add_dependency "i18n",          " | 
| 21 | 
            +
              s.add_dependency "i18n",          ">= 0.5"
         | 
| 22 22 | 
             
              s.add_development_dependency "rspec",       "~> 2.6"
         | 
| 23 23 | 
             
              s.add_development_dependency "guard",       "~> 0.5"
         | 
| 24 24 | 
             
              s.add_development_dependency "guard-rspec", "~> 0.4"
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: transcriber
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.4
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -11,11 +11,11 @@ authors: | |
| 11 11 | 
             
            autorequire: 
         | 
| 12 12 | 
             
            bindir: bin
         | 
| 13 13 | 
             
            cert_chain: []
         | 
| 14 | 
            -
            date: 2011-08- | 
| 14 | 
            +
            date: 2011-08-23 00:00:00.000000000Z
         | 
| 15 15 | 
             
            dependencies:
         | 
| 16 16 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 17 17 | 
             
              name: activesupport
         | 
| 18 | 
            -
              requirement: & | 
| 18 | 
            +
              requirement: &70173958045380 !ruby/object:Gem::Requirement
         | 
| 19 19 | 
             
                none: false
         | 
| 20 20 | 
             
                requirements:
         | 
| 21 21 | 
             
                - - ~>
         | 
| @@ -23,21 +23,21 @@ dependencies: | |
| 23 23 | 
             
                    version: '3.0'
         | 
| 24 24 | 
             
              type: :runtime
         | 
| 25 25 | 
             
              prerelease: false
         | 
| 26 | 
            -
              version_requirements: * | 
| 26 | 
            +
              version_requirements: *70173958045380
         | 
| 27 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 28 | 
             
              name: i18n
         | 
| 29 | 
            -
              requirement: & | 
| 29 | 
            +
              requirement: &70173958044880 !ruby/object:Gem::Requirement
         | 
| 30 30 | 
             
                none: false
         | 
| 31 31 | 
             
                requirements:
         | 
| 32 | 
            -
                - -  | 
| 32 | 
            +
                - - ! '>='
         | 
| 33 33 | 
             
                  - !ruby/object:Gem::Version
         | 
| 34 | 
            -
                    version: '0. | 
| 34 | 
            +
                    version: '0.5'
         | 
| 35 35 | 
             
              type: :runtime
         | 
| 36 36 | 
             
              prerelease: false
         | 
| 37 | 
            -
              version_requirements: * | 
| 37 | 
            +
              version_requirements: *70173958044880
         | 
| 38 38 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 39 39 | 
             
              name: rspec
         | 
| 40 | 
            -
              requirement: & | 
| 40 | 
            +
              requirement: &70173958044420 !ruby/object:Gem::Requirement
         | 
| 41 41 | 
             
                none: false
         | 
| 42 42 | 
             
                requirements:
         | 
| 43 43 | 
             
                - - ~>
         | 
| @@ -45,10 +45,10 @@ dependencies: | |
| 45 45 | 
             
                    version: '2.6'
         | 
| 46 46 | 
             
              type: :development
         | 
| 47 47 | 
             
              prerelease: false
         | 
| 48 | 
            -
              version_requirements: * | 
| 48 | 
            +
              version_requirements: *70173958044420
         | 
| 49 49 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 50 50 | 
             
              name: guard
         | 
| 51 | 
            -
              requirement: & | 
| 51 | 
            +
              requirement: &70173958043920 !ruby/object:Gem::Requirement
         | 
| 52 52 | 
             
                none: false
         | 
| 53 53 | 
             
                requirements:
         | 
| 54 54 | 
             
                - - ~>
         | 
| @@ -56,10 +56,10 @@ dependencies: | |
| 56 56 | 
             
                    version: '0.5'
         | 
| 57 57 | 
             
              type: :development
         | 
| 58 58 | 
             
              prerelease: false
         | 
| 59 | 
            -
              version_requirements: * | 
| 59 | 
            +
              version_requirements: *70173958043920
         | 
| 60 60 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 61 61 | 
             
              name: guard-rspec
         | 
| 62 | 
            -
              requirement: & | 
| 62 | 
            +
              requirement: &70173958043460 !ruby/object:Gem::Requirement
         | 
| 63 63 | 
             
                none: false
         | 
| 64 64 | 
             
                requirements:
         | 
| 65 65 | 
             
                - - ~>
         | 
| @@ -67,10 +67,10 @@ dependencies: | |
| 67 67 | 
             
                    version: '0.4'
         | 
| 68 68 | 
             
              type: :development
         | 
| 69 69 | 
             
              prerelease: false
         | 
| 70 | 
            -
              version_requirements: * | 
| 70 | 
            +
              version_requirements: *70173958043460
         | 
| 71 71 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 72 72 | 
             
              name: growl
         | 
| 73 | 
            -
              requirement: & | 
| 73 | 
            +
              requirement: &70173958043000 !ruby/object:Gem::Requirement
         | 
| 74 74 | 
             
                none: false
         | 
| 75 75 | 
             
                requirements:
         | 
| 76 76 | 
             
                - - ~>
         | 
| @@ -78,7 +78,7 @@ dependencies: | |
| 78 78 | 
             
                    version: '1.0'
         | 
| 79 79 | 
             
              type: :development
         | 
| 80 80 | 
             
              prerelease: false
         | 
| 81 | 
            -
              version_requirements: * | 
| 81 | 
            +
              version_requirements: *70173958043000
         | 
| 82 82 | 
             
            description: ''
         | 
| 83 83 | 
             
            email:
         | 
| 84 84 | 
             
            - victorcrodrigues@gmail.com
         | 
| @@ -104,12 +104,15 @@ files: | |
| 104 104 | 
             
            - examples/embeds_one/with_if.rb
         | 
| 105 105 | 
             
            - examples/embeds_one/with_start_key.rb
         | 
| 106 106 | 
             
            - examples/has_many/simple.rb
         | 
| 107 | 
            +
            - examples/properties/collections.rb
         | 
| 107 108 | 
             
            - examples/properties/simple.rb
         | 
| 108 109 | 
             
            - examples/properties/with_field.rb
         | 
| 109 110 | 
             
            - examples/properties/with_field_path.rb
         | 
| 110 111 | 
             
            - examples/properties/with_id.rb
         | 
| 111 112 | 
             
            - examples/properties/with_if.rb
         | 
| 112 113 | 
             
            - examples/properties/with_key_converter.rb
         | 
| 114 | 
            +
            - examples/properties/with_two_key_converters.rb
         | 
| 115 | 
            +
            - examples/summarization/simple.rb
         | 
| 113 116 | 
             
            - lib/transcriber.rb
         | 
| 114 117 | 
             
            - lib/transcriber/configuration.rb
         | 
| 115 118 | 
             
            - lib/transcriber/resource.rb
         | 
| @@ -123,6 +126,7 @@ files: | |
| 123 126 | 
             
            - lib/transcriber/resource/key.rb
         | 
| 124 127 | 
             
            - lib/transcriber/resource/key/association.rb
         | 
| 125 128 | 
             
            - lib/transcriber/resource/key/embeddable.rb
         | 
| 129 | 
            +
            - lib/transcriber/resource/key/href.rb
         | 
| 126 130 | 
             
            - lib/transcriber/resource/key/property.rb
         | 
| 127 131 | 
             
            - lib/transcriber/resource/key/relation.rb
         | 
| 128 132 | 
             
            - lib/transcriber/resource/parser.rb
         | 
| @@ -130,6 +134,7 @@ files: | |
| 130 134 | 
             
            - lib/transcriber/resource/parser/property.rb
         | 
| 131 135 | 
             
            - lib/transcriber/resource/response.rb
         | 
| 132 136 | 
             
            - lib/transcriber/resource/response/embeddable.rb
         | 
| 137 | 
            +
            - lib/transcriber/resource/response/href.rb
         | 
| 133 138 | 
             
            - lib/transcriber/resource/response/property.rb
         | 
| 134 139 | 
             
            - lib/transcriber/resource/response/relation.rb
         | 
| 135 140 | 
             
            - lib/transcriber/resource/serialization/boolean.rb
         | 
| @@ -138,8 +143,11 @@ files: | |
| 138 143 | 
             
            - lib/transcriber/resource/serialization/integer.rb
         | 
| 139 144 | 
             
            - lib/transcriber/resource/serialization/string.rb
         | 
| 140 145 | 
             
            - lib/transcriber/version.rb
         | 
| 146 | 
            +
            - spec/integration/embeds_many_spec.rb
         | 
| 147 | 
            +
            - spec/integration/embeds_one_spec.rb
         | 
| 141 148 | 
             
            - spec/integration/has_many_spec.rb
         | 
| 142 149 | 
             
            - spec/integration/property_spec.rb
         | 
| 150 | 
            +
            - spec/integration/summarization_spec.rb
         | 
| 143 151 | 
             
            - spec/spec_helper.rb
         | 
| 144 152 | 
             
            - spec/support/examples.rb
         | 
| 145 153 | 
             
            - spec/support/out.rb
         | 
| @@ -194,8 +202,11 @@ signing_key: | |
| 194 202 | 
             
            specification_version: 3
         | 
| 195 203 | 
             
            summary: ''
         | 
| 196 204 | 
             
            test_files:
         | 
| 205 | 
            +
            - spec/integration/embeds_many_spec.rb
         | 
| 206 | 
            +
            - spec/integration/embeds_one_spec.rb
         | 
| 197 207 | 
             
            - spec/integration/has_many_spec.rb
         | 
| 198 208 | 
             
            - spec/integration/property_spec.rb
         | 
| 209 | 
            +
            - spec/integration/summarization_spec.rb
         | 
| 199 210 | 
             
            - spec/spec_helper.rb
         | 
| 200 211 | 
             
            - spec/support/examples.rb
         | 
| 201 212 | 
             
            - spec/support/out.rb
         |