morph 0.2.3 → 0.2.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/CHANGELOG CHANGED
@@ -1,3 +1,5 @@
1
+ v0.2.4. from_hash() creates classes in Morph namespace and handles arrays of hashes
2
+
1
3
  v0.2.3. added Morph.from_hash method
2
4
 
3
5
  v0.2.2. changed rubygem requirement to be >= 1.2 instead of = 1.2
data/lib/morph.rb CHANGED
@@ -1,44 +1,15 @@
1
1
  require 'activesupport'
2
2
 
3
3
  module Morph
4
- VERSION = "0.2.3"
5
-
6
- def self.object_from_key key
7
- begin
8
- name = key.to_s
9
- type = name.constantize
10
- rescue NameError => e
11
- Object.const_set name, Class.new
12
- type = name.constantize
13
- type.send(:include, Morph)
14
- end
15
- object = type.new
16
- end
17
-
18
- def self.add_to_object object, attributes
19
- attributes.each do |key, value|
20
- attribute = key.gsub(':',' ')
21
- attribute = attribute.underscore
22
-
23
- if value.is_a?(String)
24
- object.morph(attribute, value)
25
- elsif value.is_a?(Array)
26
- object.morph(attribute.pluralize, value)
27
- elsif value.is_a? Hash
28
- child_object = object_from_key key
29
- add_to_object child_object, value
30
- object.morph(attribute, child_object)
31
- end
32
- end
33
- end
4
+ VERSION = "0.2.4"
34
5
 
35
- def self.from_hash hash
6
+ def self.from_hash hash, namespace=Morph
36
7
  if hash.keys.size == 1
37
8
  key = hash.keys.first
38
- object = object_from_key key
9
+ object = object_from_key key, namespace
39
10
  if hash[key].is_a? Hash
40
11
  attributes = hash[key]
41
- add_to_object object, attributes
12
+ add_to_object object, attributes, namespace
42
13
  end
43
14
  object
44
15
  else
@@ -52,6 +23,47 @@ module Morph
52
23
  base.send(:include, MethodMissing)
53
24
  end
54
25
 
26
+ private
27
+ def self.object_from_key key, namespace
28
+ begin
29
+ name = key.to_s
30
+ type = "#{namespace.name}::#{name}".constantize
31
+ rescue NameError => e
32
+ namespace.const_set name, Class.new
33
+ type = "#{namespace.name}::#{name}".constantize
34
+ type.send(:include, Morph)
35
+ end
36
+ object = type.new
37
+ end
38
+
39
+ def self.add_to_object object, attributes, namespace
40
+ attributes.each do |key, value|
41
+ attribute = key.gsub(':',' ')
42
+ attribute = attribute.underscore
43
+
44
+ if value.is_a?(String)
45
+ object.morph(attribute, value)
46
+ elsif value.is_a?(Array)
47
+ array = value
48
+ if array.size > 0 && array.collect(&:class).uniq == [Hash]
49
+ array = array.collect do |hash|
50
+ child = object_from_key key.singularize, namespace
51
+ add_to_object child, hash, namespace
52
+ child
53
+ end
54
+ end
55
+
56
+ object.morph(attribute.pluralize, array)
57
+ elsif value.is_a? Hash
58
+ child_object = object_from_key key, namespace
59
+ add_to_object child_object, value, namespace
60
+ object.morph(attribute, child_object)
61
+ end
62
+ end
63
+ end
64
+
65
+ public
66
+
55
67
  module ClassMethods
56
68
 
57
69
  @@adding_morph_method = Hash.new {|hash,klass| hash[klass] = false }
data/morph.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{morph}
5
- s.version = "0.2.3"
5
+ s.version = "0.2.4"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Rob McKinnon"]
@@ -390,19 +390,39 @@ describe Morph do
390
390
  "AccountRefDate"=>"0000-30-04"},
391
391
  "IncorporationDate"=>"1996-03-25",
392
392
  "CompanyNumber"=>"03176906",
393
- "xmlns"=>"http://xmlgw.companieshouse.gov.uk/v1-0"}
393
+ "xmlns"=>"http://xmlgw.companieshouse.gov.uk/v1-0",
394
+ "SearchItems"=> [
395
+ { "CompanyDate"=> '',
396
+ "CompanyIndexStatus"=> '',
397
+ "DataSet"=>"LIVE",
398
+ "CompanyName"=>"CANONGROVE LIMITED",
399
+ "CompanyNumber"=>"SC244777" },
400
+ { "CompanyDate"=>"",
401
+ "CompanyIndexStatus"=>"",
402
+ "DataSet"=>"LIVE",
403
+ "CompanyName"=>"CANONHALL ACCOUNTANCY LTD",
404
+ "CompanyNumber"=>"05110715" }
405
+ ]
406
+ }
394
407
  }
395
- company_details = Morph.from_hash(h)
396
- company_details.class.name.should == 'CompanyDetails'
408
+ Object.const_set 'Company', Module.new
409
+ Company.const_set 'House', Module.new
410
+
411
+ company_details = Morph.from_hash(h, Company::House)
412
+ company_details.class.name.should == 'Company::House::CompanyDetails'
397
413
  company_details.class.morph_methods.include?('last_full_mem_date').should be_true
398
414
  company_details.class.morph_methods.include?('accounts').should be_true
399
415
 
400
- company_details.accounts.class.name.should == 'Accounts'
416
+ company_details.accounts.class.name.should == 'Company::House::Accounts'
401
417
  company_details.accounts.overdue.should == 'NO'
402
418
  company_details.last_full_mem_date.should == "2002-03-25"
403
419
  company_details.sic_codes.sic_text.should == 'stadiums'
404
420
  company_details.reg_address.address_lines.should == ["ST DAVID'S HOUSE", "WEST WING", "WOOD STREET", "CARDIFF CF10 1ES"]
405
- puts company_details.to_yaml
421
+
422
+ company_details.search_items.first.class.name.should == 'Company::House::SearchItem'
423
+ company_details.search_items.first.data_set.should == 'LIVE'
424
+ company_details.search_items.first.company_name.should == 'CANONGROVE LIMITED'
425
+ # puts company_details.to_yaml
406
426
  end
407
427
  end
408
428
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: morph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob McKinnon