data_package 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/.travis.yml +7 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +53 -0
- data/LICENSE +20 -0
- data/README.md +32 -0
- data/Rakefile +6 -0
- data/data_package.gemspec +33 -0
- data/lib/attr_helper/base_attr.rb +36 -0
- data/lib/attr_helper/required_attr.rb +46 -0
- data/lib/attr_helper/serialization.rb +25 -0
- data/lib/attr_helper.rb +105 -0
- data/lib/data_package/base.rb +10 -0
- data/lib/data_package/dialect.rb +9 -0
- data/lib/data_package/field.rb +20 -0
- data/lib/data_package/license.rb +8 -0
- data/lib/data_package/package.rb +100 -0
- data/lib/data_package/person.rb +7 -0
- data/lib/data_package/resource.rb +75 -0
- data/lib/data_package/schema.rb +13 -0
- data/lib/data_package/source.rb +7 -0
- data/lib/data_package/version.rb +3 -0
- data/lib/data_package.rb +17 -0
- data/spec/attr_helper_spec.rb +60 -0
- data/spec/attr_helpers/base_attr_spec.rb +62 -0
- data/spec/attr_helpers/required_attr_spec.rb +49 -0
- data/spec/attr_helpers/serialization_spec.rb +9 -0
- data/spec/data_package/base_spec.rb +10 -0
- data/spec/data_package/dialect_spec.rb +35 -0
- data/spec/data_package/field_spec.rb +29 -0
- data/spec/data_package/license_spec.rb +18 -0
- data/spec/data_package/package_spec.rb +59 -0
- data/spec/data_package/person_spec.rb +21 -0
- data/spec/data_package/resource_spec.rb +57 -0
- data/spec/data_package/schema_spec.rb +25 -0
- data/spec/data_package/source_spec.rb +22 -0
- data/spec/fixtures/package/datapackage.json +94 -0
- data/spec/fixtures/package/standard.csv +11 -0
- data/spec/fixtures/standard.csv +11 -0
- data/spec/klass_helper.rb +41 -0
- data/spec/resource_helper.rb +113 -0
- data/spec/spec_helper.rb +19 -0
- metadata +233 -0
data/lib/data_package.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'active_support/core_ext/hash'
|
2
|
+
|
3
|
+
require "data_package/version"
|
4
|
+
|
5
|
+
# Attribute Helpers
|
6
|
+
require 'attr_helper'
|
7
|
+
|
8
|
+
# Core Specification
|
9
|
+
require 'data_package/base'
|
10
|
+
require 'data_package/package'
|
11
|
+
require 'data_package/field'
|
12
|
+
require 'data_package/schema'
|
13
|
+
require 'data_package/resource'
|
14
|
+
require 'data_package/dialect'
|
15
|
+
require 'data_package/person'
|
16
|
+
require 'data_package/source'
|
17
|
+
require 'data_package/license'
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'klass_helper'
|
3
|
+
|
4
|
+
describe AttrHelper do
|
5
|
+
it "should initialize" do
|
6
|
+
obj = KlassHelper::BaseKlass.new(:name => 'myvalue')
|
7
|
+
|
8
|
+
obj.name.should == 'myvalue'
|
9
|
+
|
10
|
+
obj.attr_required?(:name).should == true
|
11
|
+
obj.attr_required?(:title).should == false
|
12
|
+
obj.attr_required?(:format).should == false
|
13
|
+
|
14
|
+
obj.missing_attributes.collect(&:name).should == [:data, :path, :url, :email, :web]
|
15
|
+
obj.required_attributes.collect(&:name).should == [:name, :data, :path, :url, :email, :web]
|
16
|
+
|
17
|
+
obj.attr_present?(:name).should == true
|
18
|
+
obj.attr_missing?(:name).should == false
|
19
|
+
|
20
|
+
obj.attr_present?(:data).should == false
|
21
|
+
obj.attr_missing?(:data).should == true
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should inherit" do
|
25
|
+
obj = KlassHelper::ChildKlass.new(:name => 'myvalue')
|
26
|
+
|
27
|
+
obj.name.should == 'myvalue'
|
28
|
+
|
29
|
+
obj.attr_required?(:name).should == true
|
30
|
+
obj.attr_required?(:title).should == false
|
31
|
+
obj.attr_required?(:format).should == false
|
32
|
+
|
33
|
+
obj.missing_attributes.collect(&:name).should == [:data, :path, :url, :email, :web]
|
34
|
+
obj.required_attributes.collect(&:name).should == [:name, :data, :path, :url, :email, :web]
|
35
|
+
|
36
|
+
obj.attr_present?(:name).should == true
|
37
|
+
obj.attr_missing?(:name).should == false
|
38
|
+
|
39
|
+
obj.attr_present?(:data).should == false
|
40
|
+
obj.attr_missing?(:data).should == true
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should allow mutual exclusion" do
|
44
|
+
obj = KlassHelper::ChildKlass.new(:name => 'myvalue')
|
45
|
+
|
46
|
+
obj.missing_attributes.collect(&:name).should == [:data, :path, :url, :email, :web]
|
47
|
+
obj.required_attributes.collect(&:name).should == [:name, :data, :path, :url, :email, :web]
|
48
|
+
|
49
|
+
obj.path = 'data.csv'
|
50
|
+
obj.missing_attributes.collect(&:name).should == [:email, :web]
|
51
|
+
obj.required_attributes.collect(&:name).should == [:name, :path, :email, :web]
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should write attributes through the setters" do
|
55
|
+
obj = KlassHelper::ChildKlass.new(:name => 'myvalue', :title => 'mytitle')
|
56
|
+
|
57
|
+
obj.name.should == 'myvalue'
|
58
|
+
obj.title.should == 'mytitlechild'
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class ValueObj
|
4
|
+
attr_accessor :name
|
5
|
+
|
6
|
+
def initialize(attrs = {})
|
7
|
+
@name = attrs[:name]
|
8
|
+
end
|
9
|
+
|
10
|
+
def is_name_required?
|
11
|
+
true
|
12
|
+
end
|
13
|
+
|
14
|
+
def serialized_name(name)
|
15
|
+
name + 'method'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe AttrHelper::BaseAttr do
|
20
|
+
it "should initialize" do
|
21
|
+
valueObj = ValueObj.new(:name => 'value')
|
22
|
+
attribute = AttrHelper::BaseAttr.new(:name)
|
23
|
+
|
24
|
+
attribute.name.should == :name
|
25
|
+
attribute.key.should == 'name'
|
26
|
+
attribute.serialize.should == true
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "Serialization" do
|
30
|
+
it "should serialize by default" do
|
31
|
+
valueObj = ValueObj.new(:name => 'value')
|
32
|
+
attribute = AttrHelper::BaseAttr.new(:name)
|
33
|
+
|
34
|
+
attribute.serializable?.should == true
|
35
|
+
attribute.serialized(valueObj).should == 'value'
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should serialize with a proc" do
|
39
|
+
valueObj = ValueObj.new(:name => 'value')
|
40
|
+
attribute = AttrHelper::BaseAttr.new(:name, :serialize => Proc.new{|name| name + 'proc'})
|
41
|
+
|
42
|
+
attribute.serializable?.should == true
|
43
|
+
attribute.serialized(valueObj).should == 'valueproc'
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should serialize with a symbol" do
|
47
|
+
valueObj = ValueObj.new(:name => 'value')
|
48
|
+
attribute = AttrHelper::BaseAttr.new(:name, :serialize => :serialized_name)
|
49
|
+
|
50
|
+
attribute.serializable?.should == true
|
51
|
+
attribute.serialized(valueObj).should == 'valuemethod'
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should disable serialization" do
|
55
|
+
valueObj = ValueObj.new(:name => 'value')
|
56
|
+
attribute = AttrHelper::BaseAttr.new(:name, :serialize => false)
|
57
|
+
|
58
|
+
attribute.serializable?.should == false
|
59
|
+
attribute.serialized(valueObj).should == nil
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class ValueObj
|
4
|
+
attr_accessor :name
|
5
|
+
|
6
|
+
def initialize(attrs = {})
|
7
|
+
@name = attrs[:name]
|
8
|
+
end
|
9
|
+
|
10
|
+
def is_name_required?
|
11
|
+
true
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe AttrHelper::RequiredAttr do
|
16
|
+
it "should initialize" do
|
17
|
+
valueObj = ValueObj.new(:name => 'value')
|
18
|
+
attribute = AttrHelper::RequiredAttr.new(:name)
|
19
|
+
|
20
|
+
attribute.name.should == :name
|
21
|
+
attribute.key.should == 'name'
|
22
|
+
attribute.serialize.should == true
|
23
|
+
attribute.required?(valueObj).should == true
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should check for if requirement with a proc" do
|
27
|
+
valueObj = ValueObj.new(:name => 'value')
|
28
|
+
attribute = AttrHelper::RequiredAttr.new(:name, :if => Proc.new{|parent| true})
|
29
|
+
attribute.required?(valueObj).should == true
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should check for if requirement with a symbol" do
|
33
|
+
valueObj = ValueObj.new(:name => 'value')
|
34
|
+
attribute = AttrHelper::RequiredAttr.new(:name, :if => :is_name_required?)
|
35
|
+
attribute.required?(valueObj).should == true
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should check for unless requirement with a proc" do
|
39
|
+
valueObj = ValueObj.new(:name => 'value')
|
40
|
+
attribute = AttrHelper::RequiredAttr.new(:name, :unless => Proc.new{|parent| true})
|
41
|
+
attribute.required?(valueObj).should == false
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should check for unless requirement with a symbol" do
|
45
|
+
valueObj = ValueObj.new(:name => 'value')
|
46
|
+
attribute = AttrHelper::RequiredAttr.new(:name, :unless => :is_name_required?)
|
47
|
+
attribute.required?(valueObj).should == false
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DataPackage::Dialect do
|
4
|
+
let(:json) {
|
5
|
+
{
|
6
|
+
"delimiter" => "\t",
|
7
|
+
"doublequote" => false,
|
8
|
+
"lineterminator" => "\n",
|
9
|
+
"quotechar" => "\"",
|
10
|
+
"skipinitialspace" => true
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
it "should initialize with defaults" do
|
15
|
+
dialect = DataPackage::Dialect.new
|
16
|
+
|
17
|
+
dialect.delimiter.should == ','
|
18
|
+
dialect.double_quote.should == false
|
19
|
+
dialect.line_terminator.should == "\n"
|
20
|
+
dialect.quote_char.should == "\""
|
21
|
+
dialect.skip_initial_space.should == false
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should initialize and serialize" do
|
25
|
+
dialect = DataPackage::Dialect.new(json)
|
26
|
+
|
27
|
+
dialect.delimiter.should == "\t"
|
28
|
+
dialect.double_quote.should == false
|
29
|
+
dialect.line_terminator.should == "\n"
|
30
|
+
dialect.quote_char.should == "\""
|
31
|
+
dialect.skip_initial_space.should == true
|
32
|
+
|
33
|
+
dialect.to_json.should == Yajl::Encoder.encode(json, :pretty => true)
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DataPackage::Field do
|
4
|
+
let(:json) {
|
5
|
+
{
|
6
|
+
'name' => 'income',
|
7
|
+
'type' => 'number',
|
8
|
+
'title' => 'Personal Income',
|
9
|
+
'description' => 'My Desc'
|
10
|
+
}
|
11
|
+
}
|
12
|
+
|
13
|
+
it "should initialize and serialize" do
|
14
|
+
field = DataPackage::Field.new(json)
|
15
|
+
|
16
|
+
field.type.should == :number
|
17
|
+
field.name.should == json['name']
|
18
|
+
field.title.should == json['title']
|
19
|
+
field.description.should == json['description']
|
20
|
+
|
21
|
+
field.to_hash.should == json
|
22
|
+
field.to_json.should == Yajl::Encoder.encode(field.to_hash, :pretty => true)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should require a name" do
|
26
|
+
field = DataPackage::Field.new
|
27
|
+
field.missing_attributes.collect(&:name).should == [:name]
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DataPackage::License do
|
4
|
+
let(:json) {
|
5
|
+
{
|
6
|
+
'id' => 'PDDL',
|
7
|
+
'url' => 'http://opendatacommons.org/licenses/pddl/'
|
8
|
+
}
|
9
|
+
}
|
10
|
+
|
11
|
+
it "should initialize and serialize" do
|
12
|
+
license = DataPackage::License.new(json)
|
13
|
+
|
14
|
+
license.id.should == 'PDDL'
|
15
|
+
license.url.should == 'http://opendatacommons.org/licenses/pddl/'
|
16
|
+
license.to_json.should == Yajl::Encoder.encode(json, :pretty => true)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DataPackage::Package do
|
4
|
+
let(:tmpdir) {
|
5
|
+
Dir.mktmpdir
|
6
|
+
}
|
7
|
+
|
8
|
+
let(:package_path) {
|
9
|
+
File.join(base_path, 'package')
|
10
|
+
}
|
11
|
+
|
12
|
+
it "should init" do
|
13
|
+
package = DataPackage::Package.init(tmpdir, 'mypackage')
|
14
|
+
|
15
|
+
package.name.should == 'mypackage'
|
16
|
+
package.version.should == '0.0.1'
|
17
|
+
package.resources.should == nil
|
18
|
+
package.base_path.should == tmpdir
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should raise on open if the package file doesn't exist" do
|
22
|
+
expect { package = DataPackage::Package.open(tmpdir) }.to raise_error
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should check if a package exists" do
|
26
|
+
DataPackage::Package.exist?(package_path).should == true
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should initialize and serialize" do
|
30
|
+
package = DataPackage::Package.open(package_path)
|
31
|
+
|
32
|
+
package.name.should == 'standard'
|
33
|
+
package.title.should == 'Standard Data Package'
|
34
|
+
package.version.should == '0.0.1'
|
35
|
+
|
36
|
+
package.resources.length.should == 1
|
37
|
+
|
38
|
+
package.resources.first.schema.fields.length.should == 10
|
39
|
+
package.resources.first.schema.primary_key.should == ['id']
|
40
|
+
|
41
|
+
package.sources.length.should == 1
|
42
|
+
package.licenses.length.should == 1
|
43
|
+
package.maintainers.length.should == 1
|
44
|
+
package.contributors.length.should == 1
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should save the package" do
|
48
|
+
package = DataPackage::Package.open(package_path)
|
49
|
+
|
50
|
+
package.base_path = tmpdir
|
51
|
+
package.name = "tested_package"
|
52
|
+
|
53
|
+
package.save
|
54
|
+
|
55
|
+
reopened = DataPackage::Package.open(tmpdir)
|
56
|
+
|
57
|
+
reopened.name.should == "tested_package"
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DataPackage::Person do
|
4
|
+
let(:json) {
|
5
|
+
{
|
6
|
+
'name' => 'Josh F',
|
7
|
+
'email' => 'josh@modeanalytics.com',
|
8
|
+
'web' => 'http://www.modeanalytics.com/josh'
|
9
|
+
}
|
10
|
+
}
|
11
|
+
|
12
|
+
it "should initialize and serialize" do
|
13
|
+
person = DataPackage::Person.new(json)
|
14
|
+
|
15
|
+
person.name.should == 'Josh F'
|
16
|
+
person.email.should == 'josh@modeanalytics.com'
|
17
|
+
person.web.should == 'http://www.modeanalytics.com/josh'
|
18
|
+
|
19
|
+
person.to_json.should == Yajl::Encoder.encode(json, :pretty => true)
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'resource_helper'
|
3
|
+
|
4
|
+
describe DataPackage::Resource do
|
5
|
+
it "should initialize and serialize" do
|
6
|
+
resource = DataPackage::Resource.new(base_path, standard_resource)
|
7
|
+
|
8
|
+
resource.format.should == 'csv'
|
9
|
+
resource.name.should == 'standard'
|
10
|
+
resource.path.should == 'standard.csv'
|
11
|
+
|
12
|
+
resource.schema.fields.length.should == 10
|
13
|
+
resource.schema.primary_key.should == ['id']
|
14
|
+
|
15
|
+
resource.to_hash.should == standard_resource.merge('format' => 'csv', 'dialect' => DataPackage::Dialect.new.to_hash)
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#each_row" do
|
19
|
+
it "should enumerate over inline data" do
|
20
|
+
resource = DataPackage::Resource.new(base_path, inline_resource)
|
21
|
+
|
22
|
+
row_count = 0
|
23
|
+
resource.each_row do |row|
|
24
|
+
row_count += 1
|
25
|
+
end
|
26
|
+
row_count.should == 3
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should enumerate over local file data" do
|
30
|
+
resource = DataPackage::Resource.new(base_path, standard_resource)
|
31
|
+
|
32
|
+
row_count = 0
|
33
|
+
resource.each_row do |row|
|
34
|
+
row_count += 1
|
35
|
+
end
|
36
|
+
row_count.should == 10
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should not enumerate URL data" do
|
40
|
+
resource = DataPackage::Resource.new(base_path, http_resource)
|
41
|
+
expect{ resource.each_row{|row| nil} }.to raise_error
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should raise if the data format is unexpected" do
|
45
|
+
resource = DataPackage::Resource.new(base_path, standard_resource.merge('format' => 'unknown'))
|
46
|
+
expect{ resource.each_row{|row| nil} }.to raise_error
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should raise if data, path or url aren't present" do
|
50
|
+
invalid = standard_resource.dup
|
51
|
+
invalid.delete('path')
|
52
|
+
|
53
|
+
resource = DataPackage::Resource.new(base_path, invalid)
|
54
|
+
expect{ resource.each_row{|row| nil} }.to raise_error
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DataPackage::Schema do
|
4
|
+
let(:json) {
|
5
|
+
{
|
6
|
+
'fields' => [
|
7
|
+
{
|
8
|
+
'name' => 'income',
|
9
|
+
'type' => 'number'
|
10
|
+
}
|
11
|
+
],
|
12
|
+
|
13
|
+
'primaryKey' => ['income']
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
it "should initialize" do
|
18
|
+
schema = DataPackage::Schema.new(json)
|
19
|
+
|
20
|
+
schema.fields.length.should == 1
|
21
|
+
schema.fields.first.name.should == 'income'
|
22
|
+
schema.primary_key.should == ['income']
|
23
|
+
schema.to_json.should == Yajl::Encoder.encode(json, :pretty => true)
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DataPackage::Source do
|
4
|
+
let(:json) {
|
5
|
+
{
|
6
|
+
'name' => 'Josh F',
|
7
|
+
'email' => 'josh@modeanalytics.com',
|
8
|
+
'web' => 'http://www.modeanalytics.com/josh'
|
9
|
+
}
|
10
|
+
}
|
11
|
+
|
12
|
+
it "should initialize and serialize" do
|
13
|
+
person = DataPackage::Source.new(json)
|
14
|
+
|
15
|
+
person.name.should == 'Josh F'
|
16
|
+
person.email.should == 'josh@modeanalytics.com'
|
17
|
+
person.web.should == 'http://www.modeanalytics.com/josh'
|
18
|
+
|
19
|
+
person.to_hash.should == json
|
20
|
+
person.to_json.should == Yajl::Encoder.encode(person.to_hash, :pretty => true)
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
{
|
2
|
+
"name": "standard",
|
3
|
+
"version": "0.0.1",
|
4
|
+
"title": "Standard Data Package",
|
5
|
+
|
6
|
+
"sources": [
|
7
|
+
{
|
8
|
+
"name": "Josh F",
|
9
|
+
"email": "josh@modeanalytics.com",
|
10
|
+
"web": "http://www.modeanalytics.com/josh"
|
11
|
+
}
|
12
|
+
],
|
13
|
+
|
14
|
+
"licenses": [
|
15
|
+
{
|
16
|
+
"id": "PDDL",
|
17
|
+
"url": "http://opendatacommons.org/licenses/pddl/"
|
18
|
+
}
|
19
|
+
],
|
20
|
+
|
21
|
+
"maintainers": [
|
22
|
+
{
|
23
|
+
"name": "Josh F",
|
24
|
+
"email": "josh@modeanalytics.com",
|
25
|
+
"web": "http://www.modeanalytics.com/josh"
|
26
|
+
}
|
27
|
+
],
|
28
|
+
|
29
|
+
"contributors": [
|
30
|
+
{
|
31
|
+
"name": "Josh F",
|
32
|
+
"email": "josh@modeanalytics.com",
|
33
|
+
"web": "http://www.modeanalytics.com/josh"
|
34
|
+
}
|
35
|
+
],
|
36
|
+
|
37
|
+
"resources": [
|
38
|
+
{
|
39
|
+
"name": "standard",
|
40
|
+
"path": "standard.csv",
|
41
|
+
|
42
|
+
"dialect": {
|
43
|
+
"delimiter": ","
|
44
|
+
},
|
45
|
+
|
46
|
+
"schema": {
|
47
|
+
"fields": [
|
48
|
+
{
|
49
|
+
"name": "id",
|
50
|
+
"type": "integer"
|
51
|
+
},
|
52
|
+
{
|
53
|
+
"name": "first_name",
|
54
|
+
"type": "string"
|
55
|
+
},
|
56
|
+
{
|
57
|
+
"name": "last_name",
|
58
|
+
"type": "string"
|
59
|
+
},
|
60
|
+
{
|
61
|
+
"name": "email",
|
62
|
+
"type": "string"
|
63
|
+
},
|
64
|
+
{
|
65
|
+
"name": "country",
|
66
|
+
"type": "string"
|
67
|
+
},
|
68
|
+
{
|
69
|
+
"name": "ip_address",
|
70
|
+
"type": "string"
|
71
|
+
},
|
72
|
+
{
|
73
|
+
"name": "amount",
|
74
|
+
"type": "number"
|
75
|
+
},
|
76
|
+
{
|
77
|
+
"name": "active",
|
78
|
+
"type": "boolean"
|
79
|
+
},
|
80
|
+
{
|
81
|
+
"name": "activated_at",
|
82
|
+
"type": "datetime"
|
83
|
+
},
|
84
|
+
{
|
85
|
+
"name": "address",
|
86
|
+
"type": "string"
|
87
|
+
}
|
88
|
+
],
|
89
|
+
|
90
|
+
"primaryKey": ["id"]
|
91
|
+
}
|
92
|
+
}
|
93
|
+
]
|
94
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
id,first_name,last_name,email,country,ip_address,amount,active,activated_at,address
|
2
|
+
1,Todd,Hamilton,thamilton@plambee.edu,Norfolk Island,66.157.128.241,$7.72,true,10/3/1955,0582 Dwight Street
|
3
|
+
2,Melissa,Kelly,mkelly@twinte.name,Singapore,204.221.167.233,$4.33,false,7/9/2013,06 Cardinal Crossing
|
4
|
+
3,Donald,Wheeler,dwheeler@edgeify.mil,Madagascar,34.201.104.193,$2.92,true,12/12/1993,4 Del Sol Hill
|
5
|
+
4,Ruby,Hall,rhall@cogilith.com,USSR,237.243.109.67,$8.27,false,12/15/1975,7 Ramsey Avenue
|
6
|
+
5,Jessica,Cole,jcole@shuffletag.info,Cyprus,25.40.138.137,$8.16,false,6/2/1939,8142 Novick Hill
|
7
|
+
6,Doris,Nelson,dnelson@zoombox.biz,Svalbard and Jan Mayen Islands,233.43.155.229,$6.26,false,5/23/1948,596 Veith Road
|
8
|
+
7,Robert,Hansen,rhansen@miboo.edu,Ghana,41.194.33.211,$4.90,true,9/28/1999,529 Oak Pass
|
9
|
+
8,Matthew,Freeman,mfreeman@midel.name,Sudan,53.186.162.65,$6.63,false,5/24/1996,70682 Declaration Center
|
10
|
+
9,Julia,Nelson,jnelson@skajo.net,Vatican City State (Holy See),249.49.124.178,$9.80,true,1/26/1940,96 Hermina Lane
|
11
|
+
10,Wanda,Palmer,wpalmer@ntags.biz,Indonesia,0.200.163.200,$5.89,false,1/1/1959,26837 Donald Trail
|
@@ -0,0 +1,11 @@
|
|
1
|
+
id,first_name,last_name,email,country,ip_address,amount,active,activated_at,address
|
2
|
+
1,Todd,Hamilton,thamilton@plambee.edu,Norfolk Island,66.157.128.241,$7.72,true,10/3/1955,0582 Dwight Street
|
3
|
+
2,Melissa,Kelly,mkelly@twinte.name,Singapore,204.221.167.233,$4.33,false,7/9/2013,06 Cardinal Crossing
|
4
|
+
3,Donald,Wheeler,dwheeler@edgeify.mil,Madagascar,34.201.104.193,$2.92,true,12/12/1993,4 Del Sol Hill
|
5
|
+
4,Ruby,Hall,rhall@cogilith.com,USSR,237.243.109.67,$8.27,false,12/15/1975,7 Ramsey Avenue
|
6
|
+
5,Jessica,Cole,jcole@shuffletag.info,Cyprus,25.40.138.137,$8.16,false,6/2/1939,8142 Novick Hill
|
7
|
+
6,Doris,Nelson,dnelson@zoombox.biz,Svalbard and Jan Mayen Islands,233.43.155.229,$6.26,false,5/23/1948,596 Veith Road
|
8
|
+
7,Robert,Hansen,rhansen@miboo.edu,Ghana,41.194.33.211,$4.90,true,9/28/1999,529 Oak Pass
|
9
|
+
8,Matthew,Freeman,mfreeman@midel.name,Sudan,53.186.162.65,$6.63,false,5/24/1996,70682 Declaration Center
|
10
|
+
9,Julia,Nelson,jnelson@skajo.net,Vatican City State (Holy See),249.49.124.178,$9.80,true,1/26/1940,96 Hermina Lane
|
11
|
+
10,Wanda,Palmer,wpalmer@ntags.biz,Indonesia,0.200.163.200,$5.89,false,1/1/1959,26837 Donald Trail
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module KlassHelper
|
2
|
+
class BaseKlass
|
3
|
+
include AttrHelper
|
4
|
+
include AttrHelper::Serialization
|
5
|
+
|
6
|
+
attr_required :name
|
7
|
+
attr_optional :title
|
8
|
+
attr_optional :format
|
9
|
+
|
10
|
+
attr_required :data, :if => Proc.new{ |o| o.path.nil? && o.url.nil? }
|
11
|
+
attr_required :path, :if => Proc.new{ |o| o.data.nil? && o.url.nil? }
|
12
|
+
attr_required :url, :if => Proc.new{ |o| o.data.nil? && o.path.nil? }
|
13
|
+
|
14
|
+
attr_required :dialect, :if => :format_requires_dialect?
|
15
|
+
|
16
|
+
attr_required :email, :unless => :empty_name?
|
17
|
+
attr_required :web, :unless => Proc.new{ |o| o.name.nil? }
|
18
|
+
|
19
|
+
def initialize(attrs = {})
|
20
|
+
write_attributes(attrs)
|
21
|
+
end
|
22
|
+
|
23
|
+
def title=(value)
|
24
|
+
write_attribute(:title, value + 'test')
|
25
|
+
end
|
26
|
+
|
27
|
+
def format_requires_dialect?
|
28
|
+
format == 'csv'
|
29
|
+
end
|
30
|
+
|
31
|
+
def empty_name?
|
32
|
+
name.nil?
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class ChildKlass < BaseKlass
|
37
|
+
def title=(value)
|
38
|
+
write_attribute(:title, value + 'child')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|