morph 0.2.2 → 0.2.3
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 +2 -0
- data/Manifest +1 -1
- data/Rakefile +1 -0
- data/lib/morph.rb +46 -1
- data/morph.gemspec +30 -79
- data/spec/{morph_spec.rb → lib/morph_spec.rb} +57 -2
- metadata +7 -7
data/CHANGELOG
CHANGED
data/Manifest
CHANGED
data/Rakefile
CHANGED
data/lib/morph.rb
CHANGED
@@ -1,5 +1,50 @@
|
|
1
|
+
require 'activesupport'
|
2
|
+
|
1
3
|
module Morph
|
2
|
-
VERSION = "0.2.
|
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
|
34
|
+
|
35
|
+
def self.from_hash hash
|
36
|
+
if hash.keys.size == 1
|
37
|
+
key = hash.keys.first
|
38
|
+
object = object_from_key key
|
39
|
+
if hash[key].is_a? Hash
|
40
|
+
attributes = hash[key]
|
41
|
+
add_to_object object, attributes
|
42
|
+
end
|
43
|
+
object
|
44
|
+
else
|
45
|
+
raise 'hash must have single key'
|
46
|
+
end
|
47
|
+
end
|
3
48
|
|
4
49
|
def self.included(base)
|
5
50
|
base.extend ClassMethods
|
data/morph.gemspec
CHANGED
@@ -1,83 +1,34 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
1
2
|
|
2
|
-
|
3
|
-
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{morph}
|
5
|
+
s.version = "0.2.3"
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Rob McKinnon"]
|
9
|
+
s.date = %q{2009-03-14}
|
10
|
+
s.description = %q{Morph allows you to emerge class definitions via calling assignment methods; mix with Hpricot for screen scrapping fun.}
|
11
|
+
s.email = ["rob ~@nospam@~ rubyforge.org"]
|
12
|
+
s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README"]
|
13
|
+
s.files = ["CHANGELOG", "examples/forger.rb", "examples/hubbit.rb", "lib/morph.rb", "LICENSE", "README", "spec/lib/morph_spec.rb", "spec/morph_spec_helper.rb", "spec/spec.opts", "Manifest", "morph.gemspec", "Rakefile"]
|
14
|
+
s.has_rdoc = true
|
15
|
+
s.homepage = %q{}
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Morph", "--main", "README", "--inline-source"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{morph}
|
19
|
+
s.rubygems_version = %q{1.3.1}
|
20
|
+
s.summary = %q{Morph allows you to emerge class definitions via calling assignment methods; mix with Hpricot for screen scrapping fun.}
|
14
21
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
- !ruby/object:Gem::Dependency
|
19
|
-
name: echoe
|
20
|
-
type: :development
|
21
|
-
version_requirement:
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: "0"
|
27
|
-
version:
|
28
|
-
description: Morph allows you to emerge class definitions via calling assignment methods; mix with Hpricot for screen scrapping fun.
|
29
|
-
email:
|
30
|
-
- rob ~@nospam@~ rubyforge.org
|
31
|
-
executables: []
|
22
|
+
if s.respond_to? :specification_version then
|
23
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
24
|
+
s.specification_version = 2
|
32
25
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
- examples/hubbit.rb
|
43
|
-
- lib/morph.rb
|
44
|
-
- LICENSE
|
45
|
-
- README
|
46
|
-
- spec/morph_spec.rb
|
47
|
-
- spec/morph_spec_helper.rb
|
48
|
-
- spec/spec.opts
|
49
|
-
- Manifest
|
50
|
-
- morph.gemspec
|
51
|
-
- Rakefile
|
52
|
-
has_rdoc: true
|
53
|
-
homepage: ""
|
54
|
-
post_install_message:
|
55
|
-
rdoc_options:
|
56
|
-
- --line-numbers
|
57
|
-
- --inline-source
|
58
|
-
- --title
|
59
|
-
- Morph
|
60
|
-
- --main
|
61
|
-
- README
|
62
|
-
- --inline-source
|
63
|
-
require_paths:
|
64
|
-
- lib
|
65
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
-
requirements:
|
67
|
-
- - ">="
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: "0"
|
70
|
-
version:
|
71
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: "1.2"
|
76
|
-
version:
|
77
|
-
requirements: []
|
78
|
-
|
79
|
-
rubyforge_project: morph
|
80
|
-
rubygems_version: 1.3.0
|
81
|
-
specification_version: 2
|
82
|
-
summary: Morph allows you to emerge class definitions via calling assignment methods; mix with Hpricot for screen scrapping fun.
|
83
|
-
test_files: []
|
26
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
27
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 2.0.2"])
|
28
|
+
else
|
29
|
+
s.add_dependency(%q<activesupport>, [">= 2.0.2"])
|
30
|
+
end
|
31
|
+
else
|
32
|
+
s.add_dependency(%q<activesupport>, [">= 2.0.2"])
|
33
|
+
end
|
34
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require File.dirname(__FILE__) + '
|
2
|
-
require File.dirname(__FILE__) + '
|
1
|
+
require File.dirname(__FILE__) + '/../../lib/morph'
|
2
|
+
require File.dirname(__FILE__) + '/../morph_spec_helper'
|
3
3
|
|
4
4
|
describe Morph do
|
5
5
|
describe "when writer method that didn't exist before is called with non-nil value" do
|
@@ -350,4 +350,59 @@ describe Morph do
|
|
350
350
|
check_convert_to_morph_method_name '年龄', '年龄'
|
351
351
|
end
|
352
352
|
end
|
353
|
+
|
354
|
+
describe 'creating from hash' do
|
355
|
+
it 'should create classes and object instances' do
|
356
|
+
h = {
|
357
|
+
"CompanyDetails"=> {
|
358
|
+
"RegAddress"=> {
|
359
|
+
"AddressLine"=>["ST DAVID'S HOUSE", "WEST WING", "WOOD STREET", "CARDIFF CF10 1ES"]},
|
360
|
+
"LastFullMemDate"=>"2002-03-25",
|
361
|
+
"xsi:schemaLocation"=>"xmlgwdev.companieshouse.gov.uk/v1-0/schema/CompanyDetails.xsd",
|
362
|
+
"HasBranchInfo"=>"0",
|
363
|
+
"Mortgages"=> {
|
364
|
+
"NumMortSatisfied"=>"0",
|
365
|
+
"MortgageInd"=>"LT300",
|
366
|
+
"NumMortOutstanding"=>"7",
|
367
|
+
"NumMortPartSatisfied"=>"0",
|
368
|
+
"NumMortCharges"=>"7"},
|
369
|
+
"CompanyCategory"=>"Public Limited Company",
|
370
|
+
"HasAppointments"=>"1",
|
371
|
+
"SICCodes"=> {
|
372
|
+
"SicText"=>"stadiums"},
|
373
|
+
"Returns"=> {
|
374
|
+
"Overdue"=>"NO",
|
375
|
+
"DocumentAvailable"=>"1",
|
376
|
+
"NextDueDate"=>"2003-04-22",
|
377
|
+
"LastMadeUpDate"=>"2002-03-25"
|
378
|
+
},
|
379
|
+
"CountryOfOrigin"=>"United Kingdom",
|
380
|
+
"CompanyStatus"=>"Active",
|
381
|
+
"CompanyName"=>"MILLENNIUM STADIUM PLC",
|
382
|
+
"InLiquidation"=>"0",
|
383
|
+
"xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance",
|
384
|
+
"Accounts"=>{
|
385
|
+
"Overdue"=>"NO",
|
386
|
+
"DocumentAvailable"=>"1",
|
387
|
+
"AccountCategory"=>"FULL",
|
388
|
+
"NextDueDate"=>"2002-11-30",
|
389
|
+
"LastMadeUpDate"=>"2001-04-30",
|
390
|
+
"AccountRefDate"=>"0000-30-04"},
|
391
|
+
"IncorporationDate"=>"1996-03-25",
|
392
|
+
"CompanyNumber"=>"03176906",
|
393
|
+
"xmlns"=>"http://xmlgw.companieshouse.gov.uk/v1-0"}
|
394
|
+
}
|
395
|
+
company_details = Morph.from_hash(h)
|
396
|
+
company_details.class.name.should == 'CompanyDetails'
|
397
|
+
company_details.class.morph_methods.include?('last_full_mem_date').should be_true
|
398
|
+
company_details.class.morph_methods.include?('accounts').should be_true
|
399
|
+
|
400
|
+
company_details.accounts.class.name.should == 'Accounts'
|
401
|
+
company_details.accounts.overdue.should == 'NO'
|
402
|
+
company_details.last_full_mem_date.should == "2002-03-25"
|
403
|
+
company_details.sic_codes.sic_text.should == 'stadiums'
|
404
|
+
company_details.reg_address.address_lines.should == ["ST DAVID'S HOUSE", "WEST WING", "WOOD STREET", "CARDIFF CF10 1ES"]
|
405
|
+
puts company_details.to_yaml
|
406
|
+
end
|
407
|
+
end
|
353
408
|
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.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob McKinnon
|
@@ -9,18 +9,18 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-03-14 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
17
|
-
type: :
|
16
|
+
name: activesupport
|
17
|
+
type: :runtime
|
18
18
|
version_requirement:
|
19
19
|
version_requirements: !ruby/object:Gem::Requirement
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version:
|
23
|
+
version: 2.0.2
|
24
24
|
version:
|
25
25
|
description: Morph allows you to emerge class definitions via calling assignment methods; mix with Hpricot for screen scrapping fun.
|
26
26
|
email:
|
@@ -40,7 +40,7 @@ files:
|
|
40
40
|
- lib/morph.rb
|
41
41
|
- LICENSE
|
42
42
|
- README
|
43
|
-
- spec/morph_spec.rb
|
43
|
+
- spec/lib/morph_spec.rb
|
44
44
|
- spec/morph_spec_helper.rb
|
45
45
|
- spec/spec.opts
|
46
46
|
- Manifest
|
@@ -74,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
74
|
requirements: []
|
75
75
|
|
76
76
|
rubyforge_project: morph
|
77
|
-
rubygems_version: 1.3.
|
77
|
+
rubygems_version: 1.3.1
|
78
78
|
signing_key:
|
79
79
|
specification_version: 2
|
80
80
|
summary: Morph allows you to emerge class definitions via calling assignment methods; mix with Hpricot for screen scrapping fun.
|