protopack 0.0.9 → 0.0.10
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 +4 -4
- data/lib/protopack.rb +1 -1
- data/lib/protopack/exporter.rb +12 -4
- data/lib/protopack/package.rb +13 -15
- data/lib/protopack/package_item.rb +21 -16
- data/lib/protopack/version.rb +1 -1
- data/protopack.gemspec +1 -2
- data/spec/models.rb +58 -14
- data/spec/protopack/exporter_spec.rb +40 -0
- data/spec/protopack/package_spec.rb +17 -4
- data/spec/protopack/packages/standard-widgets/black-description.html +1 -0
- data/spec/protopack/packages/standard-widgets/black-widget-item.yml +2 -0
- data/spec/protopack/packages/standard-widgets/green-widget-item.yml +1 -0
- data/spec/protopack/packages/standard-widgets/package-config.yml +0 -1
- metadata +8 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0cb317f6ebff18ddcfef2fa9f2154020e5fb2e22
|
4
|
+
data.tar.gz: d8ee7909c86427a0d10d23eea8dce5e34a5d9667
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 69d583f898589b222eda2d0f0f9795ec648a107681a491e970d64419e69c365f65990ea106421c0a592934c3cc0da2ce9618c86b0298de1cac3660bbe7bce466
|
7
|
+
data.tar.gz: 1abea23055c7ea068b1bc4caea24c6255594625fb9ffa3e8c575f75b9e483b80dceede994383f33abfa6a53eaa3baf77ad9ac7c7c8b78b4f55c83b5e10d2358a
|
data/lib/protopack.rb
CHANGED
data/lib/protopack/exporter.rb
CHANGED
@@ -15,14 +15,22 @@ module Protopack
|
|
15
15
|
|
16
16
|
def build_association_table obj
|
17
17
|
export_config(obj)[:associations].inject({ }) { |table, name|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
if name.is_a? Hash
|
19
|
+
build_association obj, table, name[:get], name[:set]
|
20
|
+
else
|
21
|
+
build_association obj, table, name, "#{name}_attributes"
|
22
|
+
end
|
22
23
|
table
|
23
24
|
}
|
24
25
|
end
|
25
26
|
|
27
|
+
def build_association obj, table, getter, setter
|
28
|
+
assoc = obj.send getter
|
29
|
+
return if assoc.blank? || assoc.empty?
|
30
|
+
attrs = (assoc.respond_to?(:each)) ? array_assoc(assoc) : to_attributes(assoc)
|
31
|
+
table[setter] = attrs
|
32
|
+
end
|
33
|
+
|
26
34
|
def to_package obj, meta={ }
|
27
35
|
obj_name = obj.send(name_method obj)
|
28
36
|
obj_id = obj_name.to_s.gsub(/_/, '-')
|
data/lib/protopack/package.rb
CHANGED
@@ -1,16 +1,14 @@
|
|
1
|
-
class Protopack::Package
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
@config = (cfg.is_a?(Hashie::Mash) ? cfg : Hashie::Mash.new(cfg))
|
10
|
-
end
|
1
|
+
class Protopack::Package < Aduki::Initializable
|
2
|
+
attr_accessor :name
|
3
|
+
attr_accessor :title
|
4
|
+
attr_accessor :description
|
5
|
+
attr_accessor :authors
|
6
|
+
attr_accessor :item_files
|
7
|
+
attr_accessor :root
|
8
|
+
aduki updated: Date
|
11
9
|
|
12
10
|
def items
|
13
|
-
|
11
|
+
item_files.map { |item_file| Protopack::PackageItem.load(item_file) }
|
14
12
|
end
|
15
13
|
|
16
14
|
def item id
|
@@ -48,9 +46,9 @@ class Protopack::Package
|
|
48
46
|
|
49
47
|
def self.all
|
50
48
|
Dir.glob("#{config_root}/*/package-config.yml").map { |pkg_cfg|
|
51
|
-
cfg =
|
49
|
+
cfg = YAML.load(File.read(pkg_cfg))
|
52
50
|
root = File.dirname pkg_cfg
|
53
|
-
cfg["
|
51
|
+
cfg["item_files"] = Dir.glob("#{root}/*item*.yml")
|
54
52
|
cfg["root"] = root
|
55
53
|
new cfg
|
56
54
|
}
|
@@ -58,8 +56,8 @@ class Protopack::Package
|
|
58
56
|
|
59
57
|
def self.find name
|
60
58
|
root = "#{config_root}/#{name}"
|
61
|
-
cfg =
|
62
|
-
cfg["
|
59
|
+
cfg = YAML.load(File.read("#{root}/package-config.yml"))
|
60
|
+
cfg["item_files"] = Dir.glob("#{root}/*item*.yml")
|
63
61
|
cfg["root"] = root
|
64
62
|
new cfg
|
65
63
|
end
|
@@ -1,17 +1,15 @@
|
|
1
|
-
class Protopack::PackageItem
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
def name
|
13
|
-
attributes.name
|
14
|
-
end
|
1
|
+
class Protopack::PackageItem < Aduki::Initializable
|
2
|
+
attr_accessor :id
|
3
|
+
attr_accessor :description
|
4
|
+
attr_accessor :locale
|
5
|
+
attr_accessor :default_locale
|
6
|
+
attr_accessor :type
|
7
|
+
attr_accessor :ordinal
|
8
|
+
attr_accessor :attributes
|
9
|
+
attr_accessor :resources
|
10
|
+
attr_accessor :protopack_filename
|
11
|
+
|
12
|
+
def name ; attributes[:name] || attributes["name"] ; end
|
15
13
|
|
16
14
|
def lookup_class base, list
|
17
15
|
base = base.const_get list.shift
|
@@ -31,17 +29,24 @@ class Protopack::PackageItem
|
|
31
29
|
target_class.existence attributes
|
32
30
|
end
|
33
31
|
|
32
|
+
def load_resources hsh, d = File.dirname(protopack_filename)
|
33
|
+
(resources || {}).inject(hsh) { |hsh, (k, v)|
|
34
|
+
hsh[k] = File.read(File.join d, v)
|
35
|
+
hsh
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
34
39
|
def apply!
|
35
40
|
factory = existence
|
36
41
|
if factory.empty?
|
37
|
-
factory.create! attributes.to_hash
|
42
|
+
factory.create! load_resources(attributes.to_hash)
|
38
43
|
else
|
39
44
|
factory.first.update_attributes attributes.to_hash
|
40
45
|
end
|
41
46
|
end
|
42
47
|
|
43
48
|
def self.load filename
|
44
|
-
Protopack::PackageItem.new(
|
49
|
+
Protopack::PackageItem.new(YAML.load(File.read(filename)).merge(protopack_filename: filename))
|
45
50
|
rescue
|
46
51
|
raise "error reading from file #{filename}"
|
47
52
|
end
|
data/lib/protopack/version.rb
CHANGED
data/protopack.gemspec
CHANGED
@@ -15,8 +15,7 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.summary = %q{ Store packages of object prototypes on-disk as YML; this gem allows you scan each package for missing items and apply them to your repository. }
|
16
16
|
gem.homepage = "https://github.com/conanite/protopack"
|
17
17
|
|
18
|
-
gem.add_dependency '
|
19
|
-
gem.add_dependency 'aduki', '~> 0.2.6', '>= 0.2.6'
|
18
|
+
gem.add_dependency 'aduki', '>= 0.2.7'
|
20
19
|
gem.add_development_dependency 'rspec'
|
21
20
|
|
22
21
|
gem.files = `git ls-files`.split($/)
|
data/spec/models.rb
CHANGED
@@ -1,3 +1,29 @@
|
|
1
|
+
require 'aduki'
|
2
|
+
|
3
|
+
class Object
|
4
|
+
def blank?
|
5
|
+
false
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class String
|
10
|
+
def blank?
|
11
|
+
strip == ''
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class NilClass
|
16
|
+
def blank?
|
17
|
+
true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Hash
|
22
|
+
def deep_merge other
|
23
|
+
merge other
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
1
27
|
class Repository
|
2
28
|
def initialize klass, name
|
3
29
|
@klass, @name = klass, name
|
@@ -20,9 +46,11 @@ class Repository
|
|
20
46
|
end
|
21
47
|
end
|
22
48
|
|
23
|
-
class Widget
|
49
|
+
class Widget < Aduki::Initializable
|
24
50
|
@@widgets = []
|
25
51
|
|
52
|
+
attr_accessor :wots, :colour, :height, :density, :name, :description
|
53
|
+
|
26
54
|
def self.all
|
27
55
|
@@widgets
|
28
56
|
end
|
@@ -31,28 +59,41 @@ class Widget
|
|
31
59
|
@@widgets = []
|
32
60
|
end
|
33
61
|
|
34
|
-
def
|
35
|
-
@attrs = attrs.is_a?(Hash) ? Hashie::Mash.new(attrs) : attrs
|
62
|
+
def aduki_after_initialize
|
36
63
|
@@widgets << self
|
37
64
|
end
|
38
65
|
|
39
|
-
def
|
40
|
-
|
66
|
+
def protopack_export_config
|
67
|
+
{ fields: [:colour, :height, :density, :name ], associations: [{ get: :mywots, set: :newwots }]}
|
68
|
+
end
|
69
|
+
|
70
|
+
def slice *names
|
71
|
+
Hash[*(names.zip(names.map { |n| send n }).flatten)]
|
72
|
+
end
|
73
|
+
|
74
|
+
def mywots
|
75
|
+
self.wots
|
76
|
+
end
|
77
|
+
|
78
|
+
def newwots= wots_attrs
|
79
|
+
self.wots = wots_attrs.map { |a| Wot::Zit.new a }
|
41
80
|
end
|
42
81
|
|
43
82
|
def update_attributes attrs
|
44
|
-
|
83
|
+
aduki_apply_attributes attrs
|
45
84
|
end
|
46
85
|
|
47
86
|
def self.existence attrs
|
48
|
-
Repository.new Widget, attrs
|
87
|
+
Repository.new Widget, attrs["colour"]
|
49
88
|
end
|
50
89
|
end
|
51
90
|
|
52
91
|
module Wot
|
53
|
-
class Zit
|
92
|
+
class Zit < Aduki::Initializable
|
54
93
|
@@wotzits = []
|
55
94
|
|
95
|
+
attr_accessor :colour, :height, :density, :name
|
96
|
+
|
56
97
|
def self.all
|
57
98
|
@@wotzits
|
58
99
|
end
|
@@ -61,21 +102,24 @@ module Wot
|
|
61
102
|
@@wotzits = []
|
62
103
|
end
|
63
104
|
|
64
|
-
def
|
65
|
-
@attrs = attrs.is_a?(Hash) ? Hashie::Mash.new(attrs) : attrs
|
105
|
+
def aduki_after_initialize
|
66
106
|
@@wotzits << self
|
67
107
|
end
|
68
108
|
|
69
|
-
def
|
70
|
-
|
109
|
+
def protopack_export_config
|
110
|
+
{ fields: [:colour, :height, :density, :name ], associations: [] }
|
111
|
+
end
|
112
|
+
|
113
|
+
def slice *names
|
114
|
+
Hash[*(names.zip(names.map { |n| send n }).flatten)]
|
71
115
|
end
|
72
116
|
|
73
117
|
def update_attributes attrs
|
74
|
-
|
118
|
+
aduki_apply_attributes attrs
|
75
119
|
end
|
76
120
|
|
77
121
|
def self.existence attrs
|
78
|
-
Repository.new Wot::Zit, attrs
|
122
|
+
Repository.new Wot::Zit, attrs["colour"]
|
79
123
|
end
|
80
124
|
end
|
81
125
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
4
|
+
|
5
|
+
# from aduki
|
6
|
+
require 'core_ext/array'
|
7
|
+
require 'core_ext/hash'
|
8
|
+
|
9
|
+
describe Protopack::Package do
|
10
|
+
|
11
|
+
it "exports a simple widget" do
|
12
|
+
wz0 = { colour: 41, height: 42, density: 43 }
|
13
|
+
wz1 = { colour: 51, height: 52, density: 53 }
|
14
|
+
w = Widget.new colour: 1, height: 2, density: 3, name: "Park Lodge Café", newwots: [ wz0, wz1 ]
|
15
|
+
|
16
|
+
exporter = Protopack::Exporter.new
|
17
|
+
hsh = exporter.to_package(w)
|
18
|
+
expected = <<YML.strip
|
19
|
+
---
|
20
|
+
id: Park Lodge Café
|
21
|
+
description: Park Lodge Café
|
22
|
+
type: Widget
|
23
|
+
attributes:
|
24
|
+
colour: 1
|
25
|
+
height: 2
|
26
|
+
density: 3
|
27
|
+
name: Park Lodge Café
|
28
|
+
newwots:
|
29
|
+
- colour: 41
|
30
|
+
height: 42
|
31
|
+
density: 43
|
32
|
+
- colour: 51
|
33
|
+
height: 52
|
34
|
+
density: 53
|
35
|
+
YML
|
36
|
+
|
37
|
+
expect(exporter.clean_yaml(hsh).strip).to eq expected
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -4,7 +4,12 @@ require File.expand_path('../../spec_helper', __FILE__)
|
|
4
4
|
|
5
5
|
describe Protopack::Package do
|
6
6
|
|
7
|
+
module HasRegion
|
8
|
+
attr_accessor :region
|
9
|
+
end
|
10
|
+
|
7
11
|
before {
|
12
|
+
Protopack::PackageItem.send :include, HasRegion
|
8
13
|
Protopack::Package.config_root = File.expand_path('../packages', __FILE__)
|
9
14
|
Widget.destroy_all
|
10
15
|
Wot::Zit.destroy_all
|
@@ -18,11 +23,11 @@ describe Protopack::Package do
|
|
18
23
|
p = Protopack::Package.find("standard-widgets")
|
19
24
|
expect(p.name).to eq "standard-widgets"
|
20
25
|
|
21
|
-
expect(p.title
|
22
|
-
expect(p.title
|
26
|
+
expect(p.title["en"]).to eq "Standard Widgets"
|
27
|
+
expect(p.title["fr"]).to eq "Widgets standards"
|
23
28
|
|
24
|
-
expect(p.description
|
25
|
-
expect(p.description
|
29
|
+
expect(p.description["en"]).to eq "Use these widgets for everyday widgeting"
|
30
|
+
expect(p.description["fr"]).to eq "Ces widgets sont utilisables pour votre widgeting quotidien"
|
26
31
|
|
27
32
|
expect(p.authors).to eq %w{ baz titi Z }
|
28
33
|
|
@@ -49,6 +54,14 @@ describe Protopack::Package do
|
|
49
54
|
expect(Widget.all[2].height).to eq 'tiger'
|
50
55
|
expect(Widget.all[3].height).to eq 'hyena'
|
51
56
|
expect(Widget.all[4].height).to eq 'camel'
|
57
|
+
|
58
|
+
green = Widget.all[1]
|
59
|
+
expect(green.name).to eq "The green widget for obtuse African zebras"
|
60
|
+
|
61
|
+
black = Widget.all[4]
|
62
|
+
black_desc = "<html><p>this is what a black widget looks like</p></html>"
|
63
|
+
expect(black.name).to be_nil
|
64
|
+
expect(black.description).to eq black_desc
|
52
65
|
end
|
53
66
|
|
54
67
|
it "should install all items from a package subject to filtering" do
|
@@ -0,0 +1 @@
|
|
1
|
+
<html><p>this is what a black widget looks like</p></html>
|
metadata
CHANGED
@@ -1,49 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: protopack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Conan Dalton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-08-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: hashie
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: aduki
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 0.2.6
|
34
17
|
- - ">="
|
35
18
|
- !ruby/object:Gem::Version
|
36
|
-
version: 0.2.
|
19
|
+
version: 0.2.7
|
37
20
|
type: :runtime
|
38
21
|
prerelease: false
|
39
22
|
version_requirements: !ruby/object:Gem::Requirement
|
40
23
|
requirements:
|
41
|
-
- - "~>"
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: 0.2.6
|
44
24
|
- - ">="
|
45
25
|
- !ruby/object:Gem::Version
|
46
|
-
version: 0.2.
|
26
|
+
version: 0.2.7
|
47
27
|
- !ruby/object:Gem::Dependency
|
48
28
|
name: rspec
|
49
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,10 +60,12 @@ files:
|
|
80
60
|
- lib/protopack/version.rb
|
81
61
|
- protopack.gemspec
|
82
62
|
- spec/models.rb
|
63
|
+
- spec/protopack/exporter_spec.rb
|
83
64
|
- spec/protopack/package_spec.rb
|
84
65
|
- spec/protopack/packages/advanced-widgets/lavender-widget-item.yml
|
85
66
|
- spec/protopack/packages/advanced-widgets/magenta-widget-item.yml
|
86
67
|
- spec/protopack/packages/advanced-widgets/package-config.yml
|
68
|
+
- spec/protopack/packages/standard-widgets/black-description.html
|
87
69
|
- spec/protopack/packages/standard-widgets/black-widget-item.yml
|
88
70
|
- spec/protopack/packages/standard-widgets/blue-widget-item.yml
|
89
71
|
- spec/protopack/packages/standard-widgets/green-widget-item.yml
|
@@ -118,10 +100,12 @@ summary: Store packages of object prototypes on-disk as YML; this gem allows you
|
|
118
100
|
each package for missing items and apply them to your repository.
|
119
101
|
test_files:
|
120
102
|
- spec/models.rb
|
103
|
+
- spec/protopack/exporter_spec.rb
|
121
104
|
- spec/protopack/package_spec.rb
|
122
105
|
- spec/protopack/packages/advanced-widgets/lavender-widget-item.yml
|
123
106
|
- spec/protopack/packages/advanced-widgets/magenta-widget-item.yml
|
124
107
|
- spec/protopack/packages/advanced-widgets/package-config.yml
|
108
|
+
- spec/protopack/packages/standard-widgets/black-description.html
|
125
109
|
- spec/protopack/packages/standard-widgets/black-widget-item.yml
|
126
110
|
- spec/protopack/packages/standard-widgets/blue-widget-item.yml
|
127
111
|
- spec/protopack/packages/standard-widgets/green-widget-item.yml
|