map 6.3.0 → 6.4.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.
data/lib/map.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  class Map < Hash
3
- Version = '6.3.0' unless defined?(Version)
3
+ Version = '6.4.0' unless defined?(Version)
4
4
  Load = Kernel.method(:load) unless defined?(Load)
5
5
 
6
6
  class << Map
@@ -1160,3 +1160,4 @@ end
1160
1160
 
1161
1161
  Map.load('struct.rb')
1162
1162
  Map.load('options.rb')
1163
+ Map.load('params.rb')
data/lib/map/params.rb ADDED
@@ -0,0 +1,69 @@
1
+ class Map
2
+ def param_for(*args, &block)
3
+ options = Map.options_for!(args)
4
+
5
+ prefix = options[:prefix] || 'map'
6
+
7
+ src_key = args.flatten.map{|arg| Map.alphanumeric_key_for(arg)}
8
+
9
+ dst_key = src_key.map{|k| k.is_a?(Numeric) ? 0 : k}
10
+
11
+ src = self
12
+ dst = Map.new
13
+
14
+ value =
15
+ if options.has_key?(:value)
16
+ options[:value]
17
+ else
18
+ src.get(src_key).to_s
19
+ end
20
+
21
+ dst.set(dst_key, value)
22
+
23
+ Param.param_for(dst, prefix)
24
+ end
25
+
26
+ def name_for(*args, &block)
27
+ options = Map.options_for!(args)
28
+ options[:value] = nil
29
+ args.push(options)
30
+ param_for(*args, &block)
31
+ end
32
+
33
+ module Param
34
+ def param_for(value, prefix = nil)
35
+ case value
36
+ when Array
37
+ value.map { |v|
38
+ param_for(v, "#{ prefix }[]")
39
+ }.join("&")
40
+
41
+ when Hash
42
+ value.map { |k, v|
43
+ param_for(v, prefix ? "#{ prefix }[#{ escape(k) }]" : escape(k))
44
+ }.join("&")
45
+
46
+ when String
47
+ raise ArgumentError, "value must be a Hash" if prefix.nil?
48
+ "#{ prefix }=#{ escape(value) }"
49
+
50
+ else
51
+ prefix
52
+ end
53
+ end
54
+
55
+ if(''.respond_to?(:bytesize))
56
+ def bytesize(string) string.bytesize end
57
+ else
58
+ def bytesize(string) string.size end
59
+ end
60
+
61
+ require 'uri' unless defined?(URI)
62
+
63
+ def escape(s)
64
+ URI.encode_www_form_component(s)
65
+ end
66
+
67
+ extend(self)
68
+ end
69
+ end
data/map.gemspec CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  Gem::Specification::new do |spec|
5
5
  spec.name = "map"
6
- spec.version = "6.3.0"
6
+ spec.version = "6.4.0"
7
7
  spec.platform = Gem::Platform::RUBY
8
8
  spec.summary = "map"
9
9
  spec.description = "description: map kicks the ass"
@@ -18,6 +18,7 @@ Gem::Specification::new do |spec|
18
18
  "lib/map/integrations",
19
19
  "lib/map/integrations/active_record.rb",
20
20
  "lib/map/options.rb",
21
+ "lib/map/params.rb",
21
22
  "lib/map/struct.rb",
22
23
  "map.gemspec",
23
24
  "test",
data/test/map_test.rb CHANGED
@@ -735,6 +735,21 @@ Testing Map do
735
735
  assert{ map.list.class != Array }
736
736
  end
737
737
 
738
+ testing 'rack compatible params' do
739
+ m = Map.for(:a => [{}, {:b => 42}], :x => [ nil, [ nil, {:y => 42}] ], :A => {:B => {:C => 42}})
740
+
741
+ assert{ m.param_for(:a, 1, :b) == 'map[a][][b]=42' }
742
+ assert{ m.name_for(:a, 1, :b) == 'map[a][][b]' }
743
+
744
+ assert{ m.param_for(:x, 1, 1, :y) == 'map[x][][][y]=42' }
745
+ assert{ m.name_for(:x, 1, 1, :y) == 'map[x][][][y]' }
746
+
747
+ assert{ m.param_for(:A, :B, :C) == 'map[A][B][C]=42' }
748
+ assert{ m.name_for(:A, :B, :C) == 'map[A][B][C]' }
749
+
750
+ assert{ m.name_for(:A, :B, :C, :prefix => :foo) == 'foo[A][B][C]' }
751
+ end
752
+
738
753
  protected
739
754
  def new_int_map(n = 1024)
740
755
  map = assert{ Map.new }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: map
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.3.0
4
+ version: 6.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-14 00:00:00.000000000 Z
12
+ date: 2013-04-18 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! 'description: map kicks the ass'
15
15
  email: ara.t.howard@gmail.com
@@ -23,6 +23,7 @@ files:
23
23
  - lib/map.rb
24
24
  - lib/map/integrations/active_record.rb
25
25
  - lib/map/options.rb
26
+ - lib/map/params.rb
26
27
  - lib/map/struct.rb
27
28
  - map.gemspec
28
29
  - test/leak.rb
@@ -53,3 +54,4 @@ signing_key:
53
54
  specification_version: 3
54
55
  summary: map
55
56
  test_files: []
57
+ has_rdoc: