morph 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|