md_data 1.0.0 → 1.1.0
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/README.md +38 -11
- data/lib/md_data/md_data.rb +50 -23
- data/lib/md_data/version.rb +1 -1
- data/md_data.gemspec +1 -1
- data/spec/md_data/md_data_spec.rb +31 -0
- metadata +2 -2
data/README.md
CHANGED
@@ -25,21 +25,47 @@ Can be written down as:
|
|
25
25
|
class MaterialConsumption
|
26
26
|
include MdData
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
28
|
+
dimension :year, [:year_1994, :year_1995]
|
29
|
+
dimension :city, [:buenos_aires, :zagreb]
|
30
|
+
dimension :material, [:coal, :potassium]
|
31
|
+
|
32
|
+
table_data do
|
33
|
+
context 'year_1994 && buenos_aires' do
|
34
|
+
add '8t', 'coal'
|
35
|
+
add '5t', 'potassium'
|
36
|
+
end
|
37
|
+
context 'year_1995 && buenos_aires' do
|
38
|
+
add '8t', 'coal'
|
39
|
+
add '5t', 'potassium'
|
40
|
+
end
|
41
|
+
end
|
39
42
|
end
|
40
43
|
|
41
44
|
MaterialConsumption.select(:year => 1994, :city => :buenos_aires, :material => :coal) #=> '8t'
|
42
45
|
```
|
46
|
+
##Usage
|
47
|
+
By defining dimensions you get helper methods that can be used in 'context' and 'add' conditionals.
|
48
|
+
|
49
|
+
```
|
50
|
+
context 'year_1994 && buenos_aires' do
|
51
|
+
add '8t', 'coal'
|
52
|
+
end
|
53
|
+
|
54
|
+
```
|
55
|
+
|
56
|
+
eqauls
|
57
|
+
|
58
|
+
```
|
59
|
+
context 'year == :year_1994 && city == :buenos_aires' do
|
60
|
+
add '8t', 'material == :coal'
|
61
|
+
end
|
62
|
+
```
|
63
|
+
|
64
|
+
Important thing here is that this is still just Ruby in quotes. You can add any conditionals that you need
|
65
|
+
while you still have basic scenario covered and simplified.
|
66
|
+
|
67
|
+
##Usage
|
68
|
+
For any type of ruled based queryingr, when you want to pull out specific data based on attributes and rules.
|
43
69
|
|
44
70
|
## Installation
|
45
71
|
|
@@ -59,6 +85,7 @@ Or install it yourself as:
|
|
59
85
|
|
60
86
|
* No nested context allowed(yet)
|
61
87
|
* Tests for misformed data definition
|
88
|
+
* Support for same dimension instance value and resolving of ambiguity
|
62
89
|
|
63
90
|
## Contributing
|
64
91
|
|
data/lib/md_data/md_data.rb
CHANGED
@@ -3,7 +3,8 @@ module MdData
|
|
3
3
|
base.extend MdDataClassMethods
|
4
4
|
end
|
5
5
|
|
6
|
-
module MdDataClassMethods
|
6
|
+
module MdDataClassMethods
|
7
|
+
|
7
8
|
def table_data(&block)
|
8
9
|
@table_data_block = block
|
9
10
|
end
|
@@ -13,30 +14,22 @@ module MdData
|
|
13
14
|
@current_context = nil
|
14
15
|
load_rules
|
15
16
|
container = self.new
|
16
|
-
attributes
|
17
|
-
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
21
|
-
self.send(:define_method, :select_from_rules) do |rules|
|
22
|
-
result = nil
|
23
|
-
rules.each do |rule|
|
24
|
-
begin
|
25
|
-
rule_is_satisfied = eval(rule[1])
|
26
|
-
if rule_is_satisfied
|
27
|
-
result = rule[0]
|
28
|
-
break
|
29
|
-
end
|
30
|
-
rescue
|
31
|
-
#nasty, allows me not to define dimensions for now TODO: fix
|
32
|
-
end
|
33
|
-
end
|
34
|
-
result
|
35
|
-
end
|
17
|
+
define_helpers_methods(attributes)
|
18
|
+
define_dimension_values_methods
|
19
|
+
define_select_from_rules
|
36
20
|
container.select_from_rules(@rules)
|
37
21
|
end
|
38
22
|
|
39
|
-
|
23
|
+
def dimension(name, allowed_values)
|
24
|
+
dimensions[name] = allowed_values
|
25
|
+
end
|
26
|
+
|
27
|
+
def dimensions
|
28
|
+
@dimensions ||= {}
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
private
|
40
33
|
def load_rules
|
41
34
|
@table_data_block.call
|
42
35
|
end
|
@@ -50,6 +43,40 @@ module MdData
|
|
50
43
|
@current_context = condition
|
51
44
|
block.call
|
52
45
|
end
|
53
|
-
|
46
|
+
|
47
|
+
def define_helpers_methods(attributes)
|
48
|
+
attributes.each do |key,value|
|
49
|
+
self.send(:define_method, key) do
|
50
|
+
value
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def define_dimension_values_methods
|
56
|
+
unless @dimensions.nil?
|
57
|
+
@dimensions.each do |name, values|
|
58
|
+
values.each do |value|
|
59
|
+
self.send(:define_method, value) do
|
60
|
+
eval "#{name} == :#{value}"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def define_select_from_rules
|
68
|
+
self.send(:define_method, :select_from_rules) do |rules|
|
69
|
+
result = nil
|
70
|
+
rules.each do |rule|
|
71
|
+
rule_is_satisfied = eval(rule[1])
|
72
|
+
if rule_is_satisfied
|
73
|
+
result = rule[0]
|
74
|
+
break
|
75
|
+
end
|
76
|
+
end
|
77
|
+
result
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
54
81
|
end
|
55
82
|
end
|
data/lib/md_data/version.rb
CHANGED
data/md_data.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |gem|
|
|
6
6
|
gem.email = ["kresimir.bojcic@gmail.com"]
|
7
7
|
gem.description = %q{Describe multidimensional data with simple notation}
|
8
8
|
gem.summary = %q{Easy way to descriebe and find values from multidimensional table.}
|
9
|
-
gem.homepage = ""
|
9
|
+
gem.homepage = "https://github.com/drKreso/md_data"
|
10
10
|
|
11
11
|
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
12
|
gem.files = `git ls-files`.split("\n")
|
@@ -95,4 +95,35 @@ describe MdData do
|
|
95
95
|
TestClass.select(:year => 1995, :time_of_day => :evening).should == "8t"
|
96
96
|
end
|
97
97
|
|
98
|
+
it 'is aware of dimensions' do
|
99
|
+
class TestClass
|
100
|
+
dimension :year, [:year_1994, :year_1995]
|
101
|
+
dimension :time_of_day, [:morning, :evening]
|
102
|
+
end
|
103
|
+
|
104
|
+
TestClass.dimensions.should == {:year => [:year_1994, :year_1995],
|
105
|
+
:time_of_day => [:morning, :evening] }
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
it 'is creates helper methods for dimensions values' do
|
110
|
+
class TestClass
|
111
|
+
|
112
|
+
dimension :year, [:year_1994, :year_1995]
|
113
|
+
dimension :time_of_day, [:morning, :evening]
|
114
|
+
|
115
|
+
table_data do
|
116
|
+
context "morning" do
|
117
|
+
add "18t", "year_1995"
|
118
|
+
add "16t", "year_1994"
|
119
|
+
end
|
120
|
+
context "evening" do
|
121
|
+
add "8t", "year_1995"
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
TestClass.select(:year => :year_1995, :time_of_day => :morning).should == "18t"
|
126
|
+
end
|
127
|
+
|
128
|
+
|
98
129
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: md_data
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -29,7 +29,7 @@ files:
|
|
29
29
|
- lib/md_data/version.rb
|
30
30
|
- md_data.gemspec
|
31
31
|
- spec/md_data/md_data_spec.rb
|
32
|
-
homepage:
|
32
|
+
homepage: https://github.com/drKreso/md_data
|
33
33
|
licenses: []
|
34
34
|
post_install_message:
|
35
35
|
rdoc_options: []
|