activefacts-compositions 1.9.22 → 1.9.23

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +1 -1
  3. data/activefacts-compositions.gemspec +1 -1
  4. data/bin/schema_compositor +71 -27
  5. data/lib/activefacts/compositions/binary.rb +4 -0
  6. data/lib/activefacts/compositions/datavault.rb +4 -0
  7. data/lib/activefacts/compositions/relational.rb +4 -0
  8. data/lib/activefacts/compositions/staging.rb +4 -0
  9. data/lib/activefacts/compositions/version.rb +1 -1
  10. data/lib/activefacts/generator/doc/css/glossary-print.css +72 -0
  11. data/lib/activefacts/generator/doc/css/glossary.css +194 -0
  12. data/lib/activefacts/generator/doc/css/ldm.css +12 -17
  13. data/lib/activefacts/generator/doc/css/orm2-print.css +19 -0
  14. data/lib/activefacts/generator/doc/css/orm2.css +28 -0
  15. data/lib/activefacts/generator/doc/css/reset.css +18 -0
  16. data/lib/activefacts/generator/doc/css/treetable.css +83 -0
  17. data/lib/activefacts/generator/doc/cwm.rb +60 -54
  18. data/lib/activefacts/generator/doc/glossary.rb +261 -137
  19. data/lib/activefacts/generator/doc/graphviz.rb +6 -2
  20. data/lib/activefacts/generator/doc/ldm.rb +7 -3
  21. data/lib/activefacts/generator/etl/unidex.rb +7 -2
  22. data/lib/activefacts/generator/oo.rb +2 -1
  23. data/lib/activefacts/generator/population.rb +174 -0
  24. data/lib/activefacts/generator/rails/active_admin.rb +81 -0
  25. data/lib/activefacts/generator/rails/application_record_shell.rb +78 -0
  26. data/lib/activefacts/generator/rails/models.rb +31 -72
  27. data/lib/activefacts/generator/rails/ruby_folder_generator.rb +87 -0
  28. data/lib/activefacts/generator/rails/schema.rb +12 -4
  29. data/lib/activefacts/generator/ruby.rb +7 -3
  30. data/lib/activefacts/generator/sql.rb +2 -1
  31. data/lib/activefacts/generator/summary.rb +24 -19
  32. data/lib/activefacts/generator/traits/sql.rb +4 -0
  33. data/lib/activefacts/generator/transgen.rb +7 -1
  34. data/lib/activefacts/generator/validate.rb +10 -2
  35. metadata +15 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 300cb201900fd72d2938ad450aacb8628553b4d8
4
- data.tar.gz: cd98524b4e5525f9fe2ff0ee5f420bbef51f36ea
2
+ SHA256:
3
+ metadata.gz: 3e35af2337e08f47fa7bbd7fcf24b3f56872aca5941ef5e7613a214cdc0957e8
4
+ data.tar.gz: 1952c7f7199348bf3c6a41496edca9103b37379ed63a0d6ec34c6978f23b5fc0
5
5
  SHA512:
6
- metadata.gz: 7a0ed81d7d13fd33579be4c56b765c3b804f311fb8c5da85c9d75ca6a190d23a136d3abab4459851efa4b4891117013501a17325535f951ee047782a1ff2687f
7
- data.tar.gz: ca7e4c460031087fb52f9655ea3a603098827bfbd7f74704d9eddfdce9e9f1322709a0b705f2bb6fed3c1d491ecfa4e8f1577da572203148fef81d5caa2cc5e4
6
+ metadata.gz: c15889850396034caa48eb039f858dddf8217101a6ef1e0049e6d17db628448c00353e5f518cd73cfca3448c1885cc9599629fb93091a88a6257c6e91827e726
7
+ data.tar.gz: ce9ec2671c7a4826d747c67c580bf9507561b7e1a3db98f30e06fb169a812225b7ffa554af2a2147db8430916572e486c4b1b73eb6f63003ab44df0e1aa32ca5
data/README.md CHANGED
@@ -29,7 +29,7 @@ And then execute:
29
29
 
30
30
  ## Development
31
31
 
32
- After checking out the repo, run `bundle` to install dependencies. Then, run `rake rspec` to run the tests.
32
+ After checking out the repo, run `bundle` to install dependencies. Then, run `rake spec` to run the tests.
33
33
 
34
34
  To install this gem onto your local machine from local source code, run `rake install`.
35
35
 
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.require_paths = ["lib"]
21
21
 
22
22
  spec.add_development_dependency "bundler", ">= 1.11"
23
- spec.add_development_dependency "rake", "> 10"
23
+ spec.add_development_dependency "rake", ">= 10"
24
24
  spec.add_development_dependency "rspec", "~> 3.3"
25
25
 
26
26
  spec.add_runtime_dependency "activesupport", ">= 4.2.7"
@@ -22,9 +22,10 @@ class SchemaCompositor
22
22
 
23
23
  # Parse options into a hash, and values for each option into a hash
24
24
  def initialize argv
25
+ @argv = argv.dup
25
26
  @options = {}
26
- while argv[0] =~ /^-/
27
- option, value = argv.shift.split(/[=:]/, 2)
27
+ while @argv[0] =~ /^-/
28
+ option, value = @argv.shift.split(/[=:]/, 2)
28
29
  csv = (value =~ /,/ ? value.split(',') : Array(value))
29
30
  modes = csv.inject({}){|h,s| k, v = s.split(/=/, 2); h[k] = v || true; h }
30
31
  @options[option.sub(/^-*/,'')] = modes
@@ -40,13 +41,13 @@ class SchemaCompositor
40
41
  begin
41
42
  require(pathname = path+"/"+filename)
42
43
  trace :loading, "Loaded #{pathname}"
43
- filename
44
+ filename
44
45
  rescue LoadError => e
45
46
  trace :loading, "Can't load #{pathname}: #{e.class}: #{e.message} #{e.backtrace[0]}"
46
- nil
47
+ nil
47
48
  rescue Exception => e
48
49
  $stderr.puts "Can't load #{pathname}: #{e.class}: #{e.message} #{e.backtrace[0]}"
49
- nil
50
+ nil
50
51
  end
51
52
  end.compact
52
53
  end
@@ -65,16 +66,26 @@ class SchemaCompositor
65
66
  option = compositor
66
67
  end
67
68
 
68
- if (action, helptext = ActiveFacts::Compositions.compositors[option]) && action
69
+ # Is it a compositor?
70
+ action, helptext = ActiveFacts::Compositions.compositors[option]
71
+ if action
69
72
  options.delete(option)
70
73
  check_options(action, modes)
71
74
  @compositors << [action, modes, option]
72
- elsif (action, helptext = ActiveFacts::Generators.generators[option]) && action
75
+ next
76
+ end
77
+
78
+ # Is it a generator?
79
+ action, helptext = ActiveFacts::Generators.generators[option]
80
+ if action
73
81
  options.delete(option)
74
82
  check_options(action, modes)
75
83
  @generators << [action, modes, option]
76
- elsif option == 'help'
77
- # Finish, then help
84
+ next
85
+ end
86
+
87
+ if option == 'help'
88
+ # Finish, then help
78
89
  else
79
90
  $stderr.puts "Action --#{option} is not recognised"
80
91
  exit 1
@@ -85,9 +96,9 @@ class SchemaCompositor
85
96
  end
86
97
  end
87
98
 
88
- def process_files argv
99
+ def process_files
89
100
  # Process each input file:
90
- argv.each do |arg|
101
+ @argv.each do |arg|
91
102
  filename, input_options = *arg.split(/=/, 2)
92
103
 
93
104
  # Load the correct file type input method
@@ -119,20 +130,53 @@ class SchemaCompositor
119
130
  end
120
131
  exit 0 unless vocabulary
121
132
  vocabulary.finalise unless vocabulary == true
133
+ constellation = vocabulary.constellation
122
134
 
123
- # Run one compositor
124
- if @compositors.size != 1
125
- raise "Expected one compositor, use --help for a list"
126
- end
127
-
128
- compositor_klass, modes, option = @compositors[0]
129
- compositor = compositor_klass.new(vocabulary.constellation, basename, modes)
130
- compositor.generate
135
+ compositions =
136
+ @compositors.map do |compositor_klass, modes, option|
137
+ compositor = compositor_klass.new(constellation, basename, modes)
138
+ compositor.generate
139
+ [compositor_klass, compositor.composition]
140
+ end
131
141
 
132
- # Run each generator
133
- @generators.each do |generator_klass, modes|
134
- output = generator_klass.new(compositor.composition, modes).generate
135
- puts output if output
142
+ begin
143
+ # Run each generator
144
+ @generators.each do |generator_klass, modes|
145
+ arity, composition_types = generator_klass.compatibility
146
+ type_list = composition_types ? composition_types.map(&:to_s)*' or ' : nil
147
+ compatible_compositions =
148
+ compositions.
149
+ select{|k, c| composition_types ? (composition_types&k.compatibility).size > 0 : true}
150
+
151
+ if arity == 0
152
+ # No composition is required
153
+ output = generator_klass.new(constellation, compositions.map{|k,c| c}, modes).generate
154
+ puts output if output
155
+ elsif arity == 1
156
+ # This generator processes each composition in turn
157
+ if compatible_compositions.size == 0
158
+ raise "#{generator_klass.basename} expects a #{type_list} compositor; use --help for a list"
159
+ end
160
+ compatible_compositions.
161
+ each do |k, c|
162
+ output = generator_klass.new(constellation, c, modes).generate
163
+ puts output if output
164
+ end
165
+ else
166
+ # This generator either accepts "arity" compositions or any number
167
+ if arity && compositions.size != arity
168
+ raise "#{generator_klass.basename} expects #{arity} #{type_list} compositions; use --help for a list"
169
+ end
170
+ # Pass all compositions:
171
+ output = generator_klass.new(constellation, compositions.map{|k,c| c}, modes).generate
172
+ puts output if output
173
+ end
174
+ end
175
+ rescue => e
176
+ $stderr.puts "#{e.message}"
177
+ if trace :exception
178
+ $stderr.puts "\t#{e.backtrace*"\n\t"}"
179
+ end
136
180
  end
137
181
  end
138
182
  end
@@ -159,13 +203,13 @@ class SchemaCompositor
159
203
  ' num'
160
204
  when Pathname
161
205
  ' file'
162
- when Array
163
- " { #{type.map(&:to_s)*' | '} }"
206
+ when Array
207
+ " { #{type.map(&:to_s)*' | '} }"
164
208
  else
165
209
  ' str'
166
210
  end
167
211
 
168
- spaces = (s = 24-tag.size) < 2 ? 2 : s
212
+ spaces = (s = 24-tag.size) < 2 ? 2 : s
169
213
  stream.puts "\t#{tag}#{' '*spaces}#{description}"
170
214
  end
171
215
  end
@@ -203,4 +247,4 @@ if sc.options['help'] || (sc.generators.empty? && sc.compositors.empty?)
203
247
  exit
204
248
  end
205
249
 
206
- sc.process_files ARGV
250
+ sc.process_files
@@ -18,6 +18,10 @@ module ActiveFacts
18
18
  {}
19
19
  end
20
20
 
21
+ def self.compatibility
22
+ %i{binary}
23
+ end
24
+
21
25
  def generate
22
26
  super
23
27
 
@@ -40,6 +40,10 @@ module ActiveFacts
40
40
  })
41
41
  end
42
42
 
43
+ def self.compatibility
44
+ %i{datavault relational}
45
+ end
46
+
43
47
  def initialize constellation, name, options = {}
44
48
  # Extract recognised options:
45
49
  datavault_initialize options
@@ -19,6 +19,10 @@ module ActiveFacts
19
19
  }.merge(Compositor.options)
20
20
  end
21
21
 
22
+ def self.compatibility
23
+ %i{relational}
24
+ end
25
+
22
26
  def initialize constellation, name, options = {}, compositor_name = 'Relational'
23
27
  @option_surrogates = options.delete('surrogates')
24
28
 
@@ -24,6 +24,10 @@ module ActiveFacts
24
24
  merge(Relational.options)
25
25
  end
26
26
 
27
+ def self.compatibility
28
+ %i{relational}
29
+ end
30
+
27
31
  def initialize constellation, name, options = {}
28
32
  # Extract recognised options:
29
33
  @option_cdc = options.delete('cdc')
@@ -1,5 +1,5 @@
1
1
  module ActiveFacts
2
2
  module Compositions
3
- VERSION = "1.9.22"
3
+ VERSION = "1.9.23"
4
4
  end
5
5
  end
@@ -0,0 +1,72 @@
1
+ .glossary-toc {
2
+ display: none;
3
+ }
4
+
5
+ .glossary-doc h1 {
6
+ margin-bottom: 1em;
7
+ }
8
+
9
+ .glossary-doc dt,
10
+ .glossary-facttype > .glossary-reading,
11
+ .glossary-objectification {
12
+ margin-left: 20px;
13
+ text-indent: -20px;
14
+ }
15
+
16
+ .glossary-alternates {
17
+ font-size: smaller;
18
+ text-indent: -10px;
19
+ padding-left: 10px;
20
+ }
21
+
22
+ .glossary-doc dd .glossary-constraints {
23
+ margin-left: -40px; /* Extend the highlight further left */
24
+ text-indent: 40px;
25
+ }
26
+
27
+ .glossary-alternates .glossary-reading,
28
+ .glossary-objectification .glossary-reading {
29
+ display: inline;
30
+ }
31
+
32
+ .screenheight {
33
+ margin-bottom: 0px;
34
+ }
35
+
36
+ .glossary-controls {
37
+ display:none;
38
+ }
39
+
40
+ .glossary-doc dd {
41
+ margin-bottom: 30px;
42
+ max-height: auto;
43
+ margin-left: 40px; /* Indent it from the head term */
44
+ }
45
+
46
+ .glossary-constraints {
47
+ /* a block of constraints */
48
+ margin: 0px 0px 0px 2em;
49
+ padding: 0px;
50
+ }
51
+
52
+ .glossary-constraint {
53
+ text-indent: 2em;
54
+ font-size: smaller;
55
+ }
56
+
57
+ .glossary-alternates {
58
+ font-size: smaller;
59
+ }
60
+
61
+ .glossary-constraint .constraint {
62
+ font-style: italic;
63
+ }
64
+
65
+ .glossary-doc dd .glossary-constraints {
66
+ margin-left: 0px;
67
+ text-indent: 0px;
68
+ }
69
+
70
+ a {
71
+ text-decoration: none;
72
+ }
@@ -0,0 +1,194 @@
1
+ body {
2
+ margin: 0px;
3
+ padding: 0px;
4
+ }
5
+
6
+ /* Size of sections when dynamically hidden by controls (incl with a transition) */
7
+ .glossary-doc.hide-facts dd { max-height: 0px; margin-bottom: 0px; }
8
+ .glossary-doc.hide-alternates .glossary-alternates { max-height: 0px; }
9
+ .glossary-doc.hide-constraints .glossary-constraints { max-height: 0px; }
10
+ .glossary-doc.hide-examples .glossary-example { max-height: 0px; }
11
+
12
+ .glossary {
13
+ position: relative;
14
+ height: 100%;
15
+ font-family: "Helvetica Neue", Helvetica, "Arial Unicode MS", Arial, sans-serif;
16
+ }
17
+
18
+ .glossary-compositions {
19
+ position: absolute;
20
+ left: 0px; right: 456px; /* as main item with glossary on right */
21
+ margin-right: 0px;
22
+ overflow: auto;
23
+ height: 100%;
24
+ }
25
+
26
+ .glossary-doc {
27
+ position: absolute;
28
+ display: block;
29
+ background: #FFF;
30
+ overflow: auto;
31
+ top: 0px;
32
+ bottom: 0px;
33
+ }
34
+
35
+ .glossary-doc > * {
36
+ padding-left: 20px;
37
+ }
38
+
39
+ .glossary-doc.glossary-toc-right {
40
+ /* Table of contents at right */
41
+ left: 0px; right: 450px;
42
+ border-right: solid #EEE 3px;
43
+ }
44
+
45
+ .glossary-doc.glossary-toc-left {
46
+ /* Table of contents at right */
47
+ left: 450px; right: 0px;
48
+ }
49
+
50
+ .glossary-controls
51
+ {
52
+ /* the glossary is the table of contents for something else */
53
+ width: 450px; right: 0px;
54
+ border-left: solid #DDD 3px;
55
+ border-right: solid #DDD 3px; /* To here */
56
+ }
57
+
58
+ .glossary-doc.glossary-is-toc
59
+ {
60
+ /* the glossary is the table of contents for something else */
61
+ width: 450px; right: 0px;
62
+ border-left: solid #DDD 3px;
63
+ border-right: solid #DDD 3px; /* To here */
64
+ bottom: 25px; /* Leave room for the controls */
65
+ }
66
+
67
+ .glossary-toc {
68
+ position: absolute;
69
+ display: block;
70
+ height: 100%;
71
+ margin: 0;
72
+ border-left: solid #DDD 3px;
73
+ border-right: solid #DDD 3px;
74
+ background: #EEE;
75
+ font-family: "Helvetica Neue", Helvetica, "Arial Unicode MS", Arial, sans-serif;
76
+ }
77
+
78
+ .glossary-toc.glossary-toc-right {
79
+ right: 0px; width: 450px; /* Sidebar at right */
80
+ }
81
+
82
+ .glossary-toc.glossary-toc-left {
83
+ left: 0px; width: 450px; /* Sidebar at left */
84
+ }
85
+
86
+ .glossary-toc.glossary-is-toc {
87
+ right: 0px; width: 0px; /* Hidden */
88
+ }
89
+
90
+ .glossary-toc-list {
91
+ position: absolute;
92
+ top: 0px;
93
+ bottom: 24px;
94
+ width: 100%;
95
+ overflow: auto;
96
+ margin: 0;
97
+ padding: 0 0;
98
+ list-style: none;
99
+ }
100
+
101
+ .glossary-controls {
102
+ position: absolute; bottom: 0px;
103
+ border: solid #DDD 3px;
104
+ background: #DDD;
105
+ }
106
+
107
+ .glossary-controls > * {
108
+ width: 24%;
109
+ padding: 0px;
110
+ }
111
+
112
+ .glossary-toc-list li {
113
+ padding: 0px 1em 0px 1em;
114
+ }
115
+
116
+ .glossary-toc-list li:hover {
117
+ background: #DDD;
118
+ }
119
+
120
+ .glossary-doc dl,
121
+ .screenheight {
122
+ margin-bottom: 2400px; /* ensure we can scroll any item to the top of the screen */
123
+ }
124
+
125
+ /* Hover controls: comment out to leave it under toggle button control */
126
+ .glossary-doc dt:hover + dd, /* When hovering over the head, show the contents */
127
+ .glossary-doc dd:hover, /* Keep showing the contents when we slide into it */
128
+ /* .glossary-doc dt:hover + dd .glossary-alternates, /* Show the alternates when you hover over the head */
129
+ /* .glossary-doc dt:hover + dd .glossary-constraints, /* Show the constraints when you hover over the head */
130
+ .glossary-doc dt:hover + dd .glossary-example, /* Show the examples when hovering over the head */
131
+ .glossary-doc dd:hover .glossary-example /* Keep showing the examples when we slide into the body */
132
+ { max-height: 2000px;
133
+ XXmargin-bottom: 30px; /* ease-out works both ways if animating this :( */
134
+ background: #DDD;
135
+ }
136
+
137
+ /* After the hover moves away, wait a while before hiding */
138
+ .glossary-doc dd {
139
+ transition: max-height 1s;
140
+ transition-timing-function: ease-out;
141
+ overflow: hidden;
142
+ max-height: 2000px; /* Animate this to zero to hide */
143
+ margin-bottom: 30px; /* Some clearance from the next term */
144
+ margin-left: 40px; /* Indent it from the head term */
145
+ }
146
+
147
+ .glossary-doc dd > * {
148
+ font-size: smaller;
149
+ }
150
+
151
+ .glossary-doc dt,
152
+ .glossary-facttype > .glossary-reading,
153
+ .glossary-objectification {
154
+ margin-left: 20px;
155
+ text-indent: -20px;
156
+ }
157
+
158
+ .glossary-alternates .glossary-reading,
159
+ .glossary-objectification .glossary-reading
160
+ {
161
+ display: inline;
162
+ }
163
+
164
+ .glossary-alternates {
165
+ font-size: smaller;
166
+ overflow: hidden;
167
+ text-indent: -10px;
168
+ padding-left: 10px;
169
+ }
170
+
171
+ .glossary-example {
172
+ overflow: hidden;
173
+ }
174
+
175
+ .glossary-doc dd .glossary-constraints {
176
+ margin-left: -40px; /* Extend the highlight further left */
177
+ text-indent: 40px;
178
+ }
179
+
180
+ .glossary-constraints {
181
+ /* a block of constraints */
182
+ background: #EDC;
183
+ padding: 0px;
184
+ overflow: hidden;
185
+ }
186
+ .glossary-constraint {
187
+ margin-left: 70px; /* 30 added to the 40 from above */
188
+ text-indent: -10px; /* Ensure that wrap is indented */
189
+ font-size: smaller;
190
+ }
191
+ .glossary-constraint .keyword {
192
+ background: #EDC;
193
+ font-style: italic;
194
+ }