structure 0.27.4 → 0.27.5

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.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. data/structure.rb +9 -1
  3. metadata +6 -36
  4. data/LICENSE +0 -22
  5. data/README.md +0 -46
  6. data/test.rb +0 -68
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b67fbe24cad1e50983d1ea7d57cb72478f028805
4
- data.tar.gz: b233d50e95cfeacf2083bea2578961b880d5524b
3
+ metadata.gz: 0bfa61be65533087a6a80a31bfac5e2ad42e4265
4
+ data.tar.gz: 95de6560a9bfc44d96996316f4882013f81cc063
5
5
  SHA512:
6
- metadata.gz: a1451461d6a80e1ecd5072efea01f57916acbff487b1852b648409107b6a0a48dfa6f9cfbd77913cab39e1a4e2b96755d5853b9ec905203005767348551667b7
7
- data.tar.gz: a1d4edb3c2bd35a30e53ac728c23f5aacc04af07b7276471fc6b2de6a149cb0d0e48a6096ca9bfa0cc4ccecac02dac2992b464cd6b338db22ea191c7ad5e8e57
6
+ metadata.gz: 0620ac53aa5f5fc3b0251c9fe146df6e8c18506e85adc53a0f4c86db4342f533bfbae716c007f541bb12de955e6b7f3bdac4de2bf4ddd17552995defd2b038bc
7
+ data.tar.gz: e35884dfea3921545a678245fdad78513f0bce1be1727adedbf85da8d5d30b843b4ae12eaa7b8ac3fe653313c68425a3fd012684ac342bffd82a0fecac4c3016
data/structure.rb CHANGED
@@ -51,7 +51,15 @@ module Structure
51
51
  end
52
52
 
53
53
  def attribute(name, &blk)
54
- define_method(name, &blk)
54
+ define_method("_#{name}", blk)
55
+ private "_#{name}"
56
+
57
+ module_eval <<-END
58
+ def #{name}
59
+ @#{name} ||= _#{name}
60
+ end
61
+ END
62
+
55
63
  @attribute_names << name
56
64
  end
57
65
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: structure
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.27.4
4
+ version: 0.27.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hakan Ensari
@@ -9,47 +9,17 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2014-07-10 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: minitest
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
12
+ dependencies: []
41
13
  description:
42
- email:
14
+ email: me@hakanensari.com
43
15
  executables: []
44
16
  extensions: []
45
17
  extra_rdoc_files: []
46
18
  files:
47
- - LICENSE
48
- - README.md
49
19
  - structure.rb
50
- - test.rb
51
20
  homepage:
52
- licenses: []
21
+ licenses:
22
+ - MIT
53
23
  metadata: {}
54
24
  post_install_message:
55
25
  rdoc_options: []
@@ -59,7 +29,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
59
29
  requirements:
60
30
  - - ">="
61
31
  - !ruby/object:Gem::Version
62
- version: '1.9'
32
+ version: '0'
63
33
  required_rubygems_version: !ruby/object:Gem::Requirement
64
34
  requirements:
65
35
  - - ">="
data/LICENSE DELETED
@@ -1,22 +0,0 @@
1
- (The MIT License)
2
-
3
- Copyright (c) 2013-14 Hakan Ensari
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md DELETED
@@ -1,46 +0,0 @@
1
- # Structure
2
-
3
- Structure is minimal glue that helps you parse data&mdash;for instance, API responses&mdash;into immutable value objects.
4
-
5
- ## Usage
6
-
7
- Usage is straightforward. Mix in the module and define the parser methods with `.attribute`, a naming convention I decided to stick to.
8
-
9
- ```ruby
10
- class Location
11
- include Structure
12
-
13
- def initialize(data)
14
- @data = data
15
- end
16
-
17
- attribute :latitude do
18
- parse(:latitude)
19
- end
20
-
21
- attribute :longitude do
22
- parse(:longitude)
23
- end
24
-
25
- private
26
-
27
- def parse(key)
28
- # Heavy-duty parsing action on @data
29
- end
30
- end
31
- ```
32
-
33
- Once you have your parser defined, initialise it with some data and take it to a drive.
34
-
35
- ```ruby
36
- location = Location.new(data)
37
- puts location.latitude # => Some latitude
38
- puts location.to_h # => All attributes as a Ruby Hash
39
- puts location # => Bonus: This will pretty-inspect the instance
40
- ```
41
-
42
- When testing objects the parser collaborates in, you may benefit from a double to stand in for the real parser.
43
-
44
- ```ruby
45
- double = Location.to_struct.new(location: 10, latitude: 10)
46
- ```
data/test.rb DELETED
@@ -1,68 +0,0 @@
1
- require 'minitest/autorun'
2
- require 'minitest/pride'
3
- require './structure'
4
-
5
- Location = Struct.new(:res) do
6
- include Structure
7
- [:latitude, :longitude].each { |key| attribute(key) { res.fetch(key) } }
8
- end
9
-
10
- class StructureTest < MiniTest::Test
11
- def setup
12
- @location = Location.new(latitude: 10, longitude: 20)
13
- end
14
-
15
- def test_class_returns_attribute_names
16
- assert_equal [:latitude, :longitude], Location.attribute_names
17
- end
18
-
19
- def test_casts_itself_to_struct
20
- struct = Location.to_struct
21
- assert_equal 'Struct::Location', struct.name
22
- assert_equal 1, struct.new(latitude: 1).latitude
23
- end
24
-
25
- def test_cast_to_struct_only_once
26
- out, err = capture_io do
27
- 2.times { Location.to_struct }
28
- end
29
- assert_empty err
30
- end
31
-
32
- def test_subclassing_does_not_have_side_effects
33
- subclass = Class.new(Location) do
34
- attribute(:name) { 'foo' }
35
- end
36
- obj = subclass.new(latitude: 10, longitude: 20)
37
- assert_equal({ latitude: 10, longitude: 20, name: 'foo' }, obj.attributes)
38
- end
39
-
40
- def test_attributes
41
- assert_equal 10, @location.latitude
42
- assert_equal 20, @location.longitude
43
- end
44
-
45
- def test_returns_attributes
46
- assert_equal({ latitude: 10, longitude: 20 }, @location.attributes)
47
- assert_equal @location.to_h, @location.attributes
48
- end
49
-
50
- def test_compares
51
- @other = Location.new(longitude: 20, latitude: 10)
52
- assert @location == @other
53
- assert @location.eql?(@other)
54
- end
55
-
56
- def test_pretty_inspects
57
- assert_equal '#<Location latitude=10, longitude=20>', @location.inspect
58
- assert_equal @location.to_s, @location.inspect
59
- end
60
-
61
- def test_truncates_long_arrays_when_pretty_inspecting
62
- klass = Class.new { include Structure }
63
- klass.attribute(:ary) { ['a'] }
64
- assert_includes klass.new.inspect, 'ary=["a"]'
65
- klass.attribute(:ary) { ('a'..'z').to_a }
66
- assert_includes klass.new.inspect, 'ary=["a", "b", "c"...]'
67
- end
68
- end