core_data 0.0.4 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a5108b6cd6a33bce264e87722ee40901fdcf51db
4
+ data.tar.gz: 03cc10252d81bb7aa39a6f64f2811e11c8be2267
5
+ SHA512:
6
+ metadata.gz: a184a1329ac31e17ca5340b720856fa37d59c5c80bb7c846a0b1063958e9b3c59e066fcc508fe5daff93d18cd1cb9c136388ffb4e9782e51c3d5a12fe159c415
7
+ data.tar.gz: 7a53564d3d064758833b63197e074ed9676137df58c7951c5bde93f42fcb00b8985c0baba689e449deb949b22b4f374a399bce494ad16da3afee29be94f7b5cf
data/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
- source :rubygems
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec
@@ -1,20 +1,18 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- core_data (0.0.4)
4
+ core_data (0.1.1)
5
5
  nokogiri (~> 1.4)
6
6
 
7
7
  GEM
8
- remote: http://rubygems.org/
8
+ remote: https://rubygems.org/
9
9
  specs:
10
- nokogiri (1.5.5)
11
- rake (0.9.2.2)
12
- rspec (0.6.4)
10
+ nokogiri (1.5.9)
11
+ rake (10.0.4)
13
12
 
14
13
  PLATFORMS
15
14
  ruby
16
15
 
17
16
  DEPENDENCIES
18
17
  core_data!
19
- rake (~> 0.9.2)
20
- rspec (~> 0.6.1)
18
+ rake
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012 Mattt Thompson (http://mattt.me/)
1
+ Copyright (c) 2013 Mattt Thompson (http://mattt.me/)
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,20 +1,5 @@
1
- # CoreData
2
- **A Gem for Interacting with Core Data Models**
3
-
4
- ## Installation
5
-
6
- ```sh
7
- $ gem install core_data
8
- ```
9
-
10
- ## Usage
11
-
12
- ```ruby
13
- model = CoreData::DataModel.new("/path/to/xml") # or XML string
14
- model.entities.each do |entity|
15
- p entity, entity.attributes, entity.relationships
16
- end
17
- ```
1
+ # Core Data
2
+ **Parse Core Data Model (.xcdatamodel) Files**
18
3
 
19
4
  ## Contact
20
5
 
@@ -26,4 +11,4 @@ Mattt Thompson
26
11
 
27
12
  ## License
28
13
 
29
- CoreData is available under the MIT license. See the LICENSE file for more info.
14
+ Core Data is available under the MIT license. See the LICENSE file for more info.
@@ -1,23 +1,23 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
- require "core_data"
3
+ require "core_data/version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "core_data"
7
7
  s.authors = ["Mattt Thompson"]
8
8
  s.email = "m@mattt.me"
9
9
  s.homepage = "http://mattt.me"
10
+ s.license = "MIT"
10
11
  s.version = CoreData::VERSION
11
12
  s.platform = Gem::Platform::RUBY
12
13
  s.summary = "Core Data"
13
- s.description = "A gem for interacting with Core Data models"
14
+ s.description = "Parse Core Data models."
14
15
 
15
- s.add_development_dependency "rspec", "~> 0.6.1"
16
- s.add_development_dependency "rake", "~> 0.9.2"
16
+ s.add_development_dependency "rake"
17
17
 
18
18
  s.add_dependency "nokogiri", "~> 1.4"
19
19
 
20
- s.files = Dir["./**/*"].reject { |file| file =~ /\.\/(bin|log|pkg|script|spec|test|vendor)/ }
20
+ s.files = Dir["./**/*"].reject { |file| file =~ /\.\/(bin|example|log|pkg|script|spec|test|vendor)/ }
21
21
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
22
22
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
23
  s.require_paths = ["lib"]
@@ -1,10 +1,2 @@
1
- module CoreData
2
- VERSION = "0.0.4"
3
- end
4
-
5
- require 'nokogiri'
6
-
1
+ require 'core_data/version'
7
2
  require 'core_data/data_model'
8
- require 'core_data/entity'
9
- require 'core_data/attribute'
10
- require 'core_data/relationship'
@@ -1,14 +1,21 @@
1
+ require 'nokogiri'
2
+
1
3
  module CoreData
2
4
  class DataModel
3
5
  attr_reader :name, :version, :entities
4
6
 
5
- def initialize(xcdatamodel)
7
+ def initialize(data_model)
6
8
  loop do
7
- case xcdatamodel
9
+ case data_model
8
10
  when File, /^\<\?xml/
9
- xcdatamodel = ::Nokogiri::XML(xcdatamodel) and redo
11
+ data_model = ::Nokogiri::XML(data_model) and redo
10
12
  when String
11
- xcdatamodel = ::File.read(xcdatamodel) and redo
13
+ case data_model
14
+ when /\.xcdatamodeld?$/
15
+ data_model = Dir[File.join(data_model, "/**/contents")].first and redo
16
+ else
17
+ data_model = ::File.read(data_model) and redo
18
+ end
12
19
  when ::Nokogiri::XML::Document
13
20
  break
14
21
  else
@@ -16,10 +23,15 @@ module CoreData
16
23
  end
17
24
  end
18
25
 
19
- model = xcdatamodel.at_xpath('model')
26
+ model = data_model.at_xpath('model')
27
+
20
28
  @name = model['name']
21
29
  @version = model['systemVersion']
22
30
  @entities = model.xpath('entity').collect{|element| Entity.new(element)}
23
31
  end
24
32
  end
25
- end
33
+ end
34
+
35
+ require 'core_data/data_model/entity'
36
+ require 'core_data/data_model/attribute'
37
+ require 'core_data/data_model/relationship'
@@ -0,0 +1,65 @@
1
+ module CoreData
2
+ class DataModel
3
+ class Attribute
4
+ attr_reader :name, :type, :identifier, :version_hash_modifier, :default_value, :minimum_value, :maximum_value, :regular_expression
5
+
6
+ def initialize(attribute)
7
+ raise ArgumentError unless ::Nokogiri::XML::Element === attribute
8
+
9
+ @name = attribute['name']
10
+ @type = attribute['attributeType']
11
+ @identifier = attribute['elementID']
12
+ @version_hash_modifier = attribute['versionHashModifier']
13
+
14
+ @default_value = default_value_from_string(attribute['defaultValueString'])
15
+ @minimum_value = range_value_from_string(attribute['minValueString'])
16
+ @maximum_value = range_value_from_string(attribute['maxValueString'])
17
+
18
+ @regular_expression = Regexp.new(attributes['regularExpressionString']) rescue nil
19
+
20
+ @optional = attribute['optional'] == "YES"
21
+ @transient = attribute['transient'] == "YES"
22
+ @indexed = attribute['indexed'] == "YES"
23
+ @syncable = attribute['syncable'] == "YES"
24
+ end
25
+
26
+ def to_s
27
+ [@name, @type].to_s
28
+ end
29
+
30
+ [:optional, :transient, :indexed, :syncable].each do |symbol|
31
+ define_method("#{symbol}?") {!!instance_variable_get(("@#{symbol}").intern)}
32
+ end
33
+
34
+ private
35
+
36
+ def default_value_from_string(string)
37
+ return nil unless string
38
+
39
+ return case @type
40
+ when "Integer 16", "Integer 32", "Integer 64"
41
+ string.to_i
42
+ when "Float", "Decimal"
43
+ string.to_f
44
+ when "Boolean"
45
+ string == "YES"
46
+ else
47
+ string
48
+ end
49
+ end
50
+
51
+ def range_value_from_string(string)
52
+ return nil unless string
53
+
54
+ return case @type
55
+ when "Float", "Decimal"
56
+ string.to_f
57
+ when "Date"
58
+ string
59
+ else
60
+ string.to_i
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,19 @@
1
+ module CoreData
2
+ class DataModel
3
+ class Entity
4
+ attr_reader :name, :attributes, :relationships
5
+
6
+ def initialize(entity)
7
+ raise ArgumentError unless ::Nokogiri::XML::Element === entity
8
+
9
+ @name = entity['name']
10
+ @attributes = entity.xpath('attribute').collect{|element| Attribute.new(element)}
11
+ @relationships = entity.xpath('relationship').collect{|element| Relationship.new(element)}
12
+ end
13
+
14
+ def to_s
15
+ @name
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,39 @@
1
+ module CoreData
2
+ class DataModel
3
+ class Relationship
4
+ attr_reader :name, :destination, :inverse, :deletion_rule, :min_count, :max_count
5
+
6
+ def initialize(relationship)
7
+ raise ArgumentError unless ::Nokogiri::XML::Element === relationship
8
+
9
+ @name = relationship['name']
10
+ @destination = relationship['destinationEntity']
11
+ @inverse = relationship['inverseName']
12
+ @deletion_rule = relationship['deletionRule'].downcase.to_sym
13
+
14
+ @min_count = relationship['minCount'].to_i
15
+ @max_count = relationship['maxCount'].to_i
16
+
17
+ @to_many = relationship['toMany'] == "YES"
18
+ @optional = relationship['optional'] == "YES"
19
+ @syncable = relationship['syncable'] == "YES"
20
+ end
21
+
22
+ def to_s
23
+ @name
24
+ end
25
+
26
+ def to_many?
27
+ !!@to_many
28
+ end
29
+
30
+ def to_one?
31
+ !to_many?
32
+ end
33
+
34
+ [:optional, :syncable].each do |symbol|
35
+ define_method("#{symbol}?") {!!instance_variable_get(("@#{symbol}").intern)}
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,3 @@
1
+ module CoreData
2
+ VERSION = '0.1.1'
3
+ end
metadata CHANGED
@@ -1,97 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: core_data
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
5
- prerelease:
4
+ version: 0.1.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Mattt Thompson
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-07-18 00:00:00.000000000Z
11
+ date: 2013-04-23 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- name: rspec
16
- requirement: &70145917109180 !ruby/object:Gem::Requirement
17
- none: false
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ~>
17
+ - - ! '>='
20
18
  - !ruby/object:Gem::Version
21
- version: 0.6.1
19
+ version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
- version_requirements: *70145917109180
25
- - !ruby/object:Gem::Dependency
26
- name: rake
27
- requirement: &70145917108180 !ruby/object:Gem::Requirement
28
- none: false
22
+ version_requirements: !ruby/object:Gem::Requirement
29
23
  requirements:
30
- - - ~>
24
+ - - ! '>='
31
25
  - !ruby/object:Gem::Version
32
- version: 0.9.2
33
- type: :development
34
- prerelease: false
35
- version_requirements: *70145917108180
26
+ version: '0'
36
27
  - !ruby/object:Gem::Dependency
37
28
  name: nokogiri
38
- requirement: &70145917106860 !ruby/object:Gem::Requirement
39
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
40
30
  requirements:
41
31
  - - ~>
42
32
  - !ruby/object:Gem::Version
43
33
  version: '1.4'
44
34
  type: :runtime
45
35
  prerelease: false
46
- version_requirements: *70145917106860
47
- description: A gem for interacting with Core Data models
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.4'
41
+ description: Parse Core Data models.
48
42
  email: m@mattt.me
49
43
  executables: []
50
44
  extensions: []
51
45
  extra_rdoc_files: []
52
46
  files:
53
- - ./core_data-0.0.1.gem
54
- - ./core_data-0.0.2.gem
55
- - ./core_data-0.0.3.gem
56
47
  - ./core_data.gemspec
57
48
  - ./Gemfile
58
49
  - ./Gemfile.lock
59
- - ./lib/core_data/attribute.rb
50
+ - ./lib/core_data/data_model/attribute.rb
51
+ - ./lib/core_data/data_model/entity.rb
52
+ - ./lib/core_data/data_model/relationship.rb
60
53
  - ./lib/core_data/data_model.rb
61
- - ./lib/core_data/entity.rb
62
- - ./lib/core_data/relationship.rb
54
+ - ./lib/core_data/version.rb
63
55
  - ./lib/core_data.rb
64
56
  - ./LICENSE
65
57
  - ./Rakefile
66
58
  - ./README.md
67
59
  homepage: http://mattt.me
68
- licenses: []
60
+ licenses:
61
+ - MIT
62
+ metadata: {}
69
63
  post_install_message:
70
64
  rdoc_options: []
71
65
  require_paths:
72
66
  - lib
73
67
  required_ruby_version: !ruby/object:Gem::Requirement
74
- none: false
75
68
  requirements:
76
69
  - - ! '>='
77
70
  - !ruby/object:Gem::Version
78
71
  version: '0'
79
- segments:
80
- - 0
81
- hash: 592320479535591700
82
72
  required_rubygems_version: !ruby/object:Gem::Requirement
83
- none: false
84
73
  requirements:
85
74
  - - ! '>='
86
75
  - !ruby/object:Gem::Version
87
76
  version: '0'
88
- segments:
89
- - 0
90
- hash: 592320479535591700
91
77
  requirements: []
92
78
  rubyforge_project:
93
- rubygems_version: 1.8.15
79
+ rubygems_version: 2.0.3
94
80
  signing_key:
95
- specification_version: 3
81
+ specification_version: 4
96
82
  summary: Core Data
97
83
  test_files: []
Binary file
Binary file
Binary file
@@ -1,33 +0,0 @@
1
- module CoreData
2
- class Attribute
3
- attr_reader :name, :type, :identifier, :version_hash_modifier, :default_value
4
-
5
- def initialize(attribute)
6
- raise ArgumentError unless ::Nokogiri::XML::Element === attribute
7
-
8
- @name = attribute['name']
9
- @type = attribute['attributeType']
10
- @identifier = attribute['elementID']
11
- @version_hash_modifier = attribute['versionHashModifier']
12
- @default_value = case @type
13
- when "Integer 16", "Integer 32", "Integer 64"
14
- attribute['defaultValueString'].to_i
15
- when "Float", "Decimal"
16
- attribute['defaultValueString'].to_f
17
- end if attribute['defaultValueString']
18
-
19
- @optional = attribute['optional'] == "YES"
20
- @transient = attribute['transient'] == "YES"
21
- @indexed = attribute['indexed'] == "YES"
22
- @syncable = attribute['syncable'] == "YES"
23
- end
24
-
25
- def to_s
26
- @name
27
- end
28
-
29
- [:optional, :transient, :indexed, :syncable].each do |symbol|
30
- define_method("#{symbol}?") {!!instance_variable_get(("@#{symbol}").intern)}
31
- end
32
- end
33
- end
@@ -1,17 +0,0 @@
1
- module CoreData
2
- class Entity
3
- attr_reader :name, :attributes, :relationships
4
-
5
- def initialize(entity)
6
- raise ArgumentError unless ::Nokogiri::XML::Element === entity
7
-
8
- @name = entity['name']
9
- @attributes = entity.xpath('attribute').collect{|element| Attribute.new(element)}
10
- @relationships = entity.xpath('relationship').collect{|element| Relationship.new(element)}
11
- end
12
-
13
- def to_s
14
- @name
15
- end
16
- end
17
- end
@@ -1,37 +0,0 @@
1
- module CoreData
2
- class Relationship
3
- attr_reader :name, :destination, :inverse, :deletion_rule, :min_count, :max_count
4
-
5
- def initialize(relationship)
6
- raise ArgumentError unless ::Nokogiri::XML::Element === relationship
7
-
8
- @name = relationship['name']
9
- @destination = relationship['destinationEntity']
10
- @inverse = relationship['inverseName']
11
- @deletion_rule = relationship['deletionRule'].downcase.to_sym
12
-
13
- @min_count = relationship['minCount'].to_i
14
- @max_count = relationship['maxCount'].to_i
15
-
16
- @to_many = relationship['toMany'] == "YES"
17
- @optional = relationship['optional'] == "YES"
18
- @syncable = relationship['syncable'] == "YES"
19
- end
20
-
21
- def to_s
22
- @name
23
- end
24
-
25
- def to_many?
26
- !!@to_many
27
- end
28
-
29
- def to_one?
30
- !to_many?
31
- end
32
-
33
- [:optional, :syncable].each do |symbol|
34
- define_method("#{symbol}?") {!!instance_variable_get(("@#{symbol}").intern)}
35
- end
36
- end
37
- end