activefacts-generators 1.8.1 → 1.8.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +6 -5
- data/activefacts-generators.gemspec +4 -4
- data/css/orm2.css +124 -0
- data/lib/activefacts/generators/cql.rb +3 -2
- data/lib/activefacts/generators/diagrams/json.rb +1 -0
- data/lib/activefacts/generators/helpers/ordered.rb +4 -1
- data/lib/activefacts/generators/traits/rails.rb +132 -0
- data/lib/activefacts/generators/transform/datavault.rb +1 -1
- data/lib/activefacts/generators/transform/surrogate.rb +1 -1
- metadata +19 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fae26b2c7cc83608173f074aaed203e14715b5a5
|
4
|
+
data.tar.gz: c4d0e31dc92866f042a82baebe67c0369414cb2d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d2f8719f99dcb8f5b4425d46e558e9862ba0a0dc51c16ab58a67c78ba4faa0add7fc2ced31fc5a58188bc568a7b76fdfecb23892fda04261591a8c8806bc68f4
|
7
|
+
data.tar.gz: 930d7bc060c4d53c4913dec4510b4609dd1177cc13a005e1e13993527ee083a79e32e3f600b60b25c8381c17df72f3d016d713aacc732b40a57163151d9cd406
|
data/Gemfile
CHANGED
@@ -2,9 +2,10 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
this_file = File.absolute_path(__FILE__)
|
6
|
+
if this_file =~ %r{\A#{ENV['HOME']}}i
|
7
|
+
dir = File.dirname(File.dirname(this_file))
|
8
|
+
$stderr.puts "Using work area gems in #{dir} from activefacts-generators"
|
9
|
+
gem 'activefacts-api', path: dir+'/api'
|
10
|
+
gem 'activefacts-metamodel', path: dir+'/metamodel'
|
10
11
|
end
|
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "activefacts-generators"
|
7
|
-
spec.version = "1.8.
|
7
|
+
spec.version = "1.8.2"
|
8
8
|
spec.authors = ["Clifford Heath"]
|
9
9
|
spec.email = ["clifford.heath@gmail.com"]
|
10
10
|
|
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.add_development_dependency "rake", "~> 10.0"
|
21
21
|
spec.add_development_dependency "rspec", "~> 3.3"
|
22
22
|
|
23
|
-
spec.add_runtime_dependency "activefacts-metamodel", "
|
24
|
-
spec.add_runtime_dependency "activefacts-rmap", "
|
25
|
-
spec.add_runtime_dependency "activesupport", "
|
23
|
+
spec.add_runtime_dependency "activefacts-metamodel", "~> 1", ">= 1.8"
|
24
|
+
spec.add_runtime_dependency "activefacts-rmap", "~> 1", ">= 1.8"
|
25
|
+
spec.add_runtime_dependency "activesupport", "~> 4.2", "~> 4.2.4"
|
26
26
|
end
|
data/css/orm2.css
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
a:link, a:visited {
|
2
|
+
color: #8A0092; text-decoration: underline;
|
3
|
+
}
|
4
|
+
|
5
|
+
ul {
|
6
|
+
margin: 0px 0px 0px 2em;
|
7
|
+
-webkit-margin-before: 0px;
|
8
|
+
-webkit-margin-after: 0px;
|
9
|
+
-webkit-padding-start: 0px;
|
10
|
+
padding: 0px;
|
11
|
+
}
|
12
|
+
|
13
|
+
pre.slide {
|
14
|
+
background-color: #000;
|
15
|
+
padding: 5px;
|
16
|
+
display: table-cell;
|
17
|
+
border-style: dashed;
|
18
|
+
border-width: 2px;
|
19
|
+
border-color: #BBB;
|
20
|
+
}
|
21
|
+
|
22
|
+
span {
|
23
|
+
font-family: "Frutiger", sans-serif;
|
24
|
+
}
|
25
|
+
|
26
|
+
.keyword {
|
27
|
+
color: #0000CC;
|
28
|
+
}
|
29
|
+
.term, .concept {
|
30
|
+
/* Xcolor: #6A0072; The color used by NORMA */
|
31
|
+
color: #8A0092;
|
32
|
+
}
|
33
|
+
.vocabulary, .object_type {
|
34
|
+
/* Xcolor: #6A0072; The color used by NORMA */
|
35
|
+
color: #8A0092;
|
36
|
+
}
|
37
|
+
.linking, .copula {
|
38
|
+
color: #0E5400;
|
39
|
+
}
|
40
|
+
.literal, .value {
|
41
|
+
color: #FF990E;
|
42
|
+
}
|
43
|
+
|
44
|
+
dd {
|
45
|
+
margin-bottom: 0.5em;
|
46
|
+
margin-left: 60px;
|
47
|
+
text-indent: -20px;
|
48
|
+
}
|
49
|
+
|
50
|
+
dd ul {
|
51
|
+
margin-left: -80px;
|
52
|
+
text-indent: 80px;
|
53
|
+
}
|
54
|
+
|
55
|
+
|
56
|
+
.glossary-sidebar {
|
57
|
+
position: absolute;
|
58
|
+
top: 0px;
|
59
|
+
bottom: 0px;
|
60
|
+
right: 0px;
|
61
|
+
width: 240px;
|
62
|
+
display: block;
|
63
|
+
margin: 0;
|
64
|
+
padding: 0 16px;
|
65
|
+
border-right: solid #DDD 3px;
|
66
|
+
background: #EEE;
|
67
|
+
}
|
68
|
+
|
69
|
+
.glossary-toc {
|
70
|
+
position: absolute;
|
71
|
+
top: 0px;
|
72
|
+
bottom: 24px;
|
73
|
+
overflow: auto;
|
74
|
+
margin: 0;
|
75
|
+
padding: 0 0;
|
76
|
+
list-style: none;
|
77
|
+
font-family: Menlo, Consolas, Monaco, "Lucida Console", monospace;
|
78
|
+
}
|
79
|
+
|
80
|
+
.glossary-controls {
|
81
|
+
position: absolute; bottom: 0px;
|
82
|
+
}
|
83
|
+
|
84
|
+
.glossary-doc {
|
85
|
+
position: absolute;
|
86
|
+
display: block;
|
87
|
+
background: #FFF;
|
88
|
+
border-right: solid #EEE 3px;
|
89
|
+
font: 300 16px/1.4 "Myriad Pro", "Helvetica Neue", Helvetica, "Arial Unicode MS", Arial, sans-serif;
|
90
|
+
overflow: auto;
|
91
|
+
padding: 0 0 0 30px;
|
92
|
+
top: 0px;
|
93
|
+
bottom: 0px;
|
94
|
+
left: 0px;
|
95
|
+
right: 270px;
|
96
|
+
}
|
97
|
+
|
98
|
+
.glossary-toc li {
|
99
|
+
margin-left: 20px;
|
100
|
+
text-indent: -20px;
|
101
|
+
}
|
102
|
+
|
103
|
+
.glossary-doc dl {
|
104
|
+
margin-bottom: 1600px;
|
105
|
+
}
|
106
|
+
|
107
|
+
.glossary-doc dd {
|
108
|
+
margin-bottom: 30px;
|
109
|
+
}
|
110
|
+
|
111
|
+
.glossary-constraint {
|
112
|
+
background: #EDC;
|
113
|
+
}
|
114
|
+
|
115
|
+
.value {
|
116
|
+
display: inline;
|
117
|
+
}
|
118
|
+
|
119
|
+
.keyword,
|
120
|
+
.glossary-facttype,
|
121
|
+
.glossary-reading {
|
122
|
+
display: inline;
|
123
|
+
XXbackground: #E8E8E8;
|
124
|
+
}
|
@@ -293,8 +293,9 @@ module ActiveFacts
|
|
293
293
|
|
294
294
|
# Alternate identification of objectified fact type?
|
295
295
|
primary_supertype = supertypes[0]
|
296
|
-
|
297
|
-
|
296
|
+
if fact_type.all_role.size > 1 and
|
297
|
+
pi = fact_type.entity_type.preferred_identifier and
|
298
|
+
primary_supertype && primary_supertype.preferred_identifier != pi
|
298
299
|
puts identified_by(o, pi) + ';'
|
299
300
|
return
|
300
301
|
end
|
@@ -46,6 +46,7 @@ module ActiveFacts
|
|
46
46
|
if o.is_a?(ActiveFacts::Metamodel::EntityType) and
|
47
47
|
p = o.preferred_identifier and
|
48
48
|
(rrs = p.role_sequence.all_role_ref).size == 1 and
|
49
|
+
!(o.fact_type && o.fact_type.all_role.size == 1) and
|
49
50
|
(r = rrs.single.role).fact_type != o.fact_type and
|
50
51
|
r.object_type.is_a?(ActiveFacts::Metamodel::ValueType) and
|
51
52
|
!r.fact_type.is_a?(ActiveFacts::Metamodel::TypeInheritance)
|
@@ -210,7 +210,9 @@ module ActiveFacts
|
|
210
210
|
# Here, we must find the role_ref containing the adjectives that we need for each identifier,
|
211
211
|
# which will be attached to the uniqueness constraint on this object in the binary FT that
|
212
212
|
# attaches that identifying role.
|
213
|
-
identifying_role_refs =
|
213
|
+
identifying_role_refs =
|
214
|
+
(o.fact_type && o.fact_type.all_role.size == 1 ? o.fact_type.preferred_reading : pi).
|
215
|
+
role_sequence.all_role_ref_in_order
|
214
216
|
|
215
217
|
# We need to get the adjectives for the roles from the identifying fact's preferred readings:
|
216
218
|
identifying_facts = ([o.fact_type]+identifying_role_refs.map{|rr| rr.role.fact_type }).compact.uniq
|
@@ -336,6 +338,7 @@ module ActiveFacts
|
|
336
338
|
return if skip_fact_type(fact_type)
|
337
339
|
|
338
340
|
if (et = fact_type.entity_type) &&
|
341
|
+
fact_type.all_role.size > 1 &&
|
339
342
|
(pi = et.preferred_identifier) &&
|
340
343
|
pi.role_sequence.all_role_ref.detect{|rr| rr.role.fact_type != fact_type }
|
341
344
|
# trace "Dumping objectified FT #{et.name} as an entity, non-fact PI"
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require 'activefacts/metamodel'
|
2
|
+
require 'activefacts/rmap'
|
3
|
+
require 'active_support'
|
4
|
+
require 'digest/sha1'
|
5
|
+
|
6
|
+
module ActiveFacts
|
7
|
+
module RMap
|
8
|
+
def self.rails_name_trunc name
|
9
|
+
if name.length > 63
|
10
|
+
hash = Digest::SHA1.hexdigest name
|
11
|
+
name = name[0, 53] + '__' + hash[0, 8]
|
12
|
+
end
|
13
|
+
name
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.rails_plural_name name
|
17
|
+
# Crunch spaces and pluralise the first part, all in snake_case
|
18
|
+
name.pop if name.is_a?(Array) and name.last == []
|
19
|
+
name = name[0]*'_' if name.is_a?(Array) and name.size == 1
|
20
|
+
if name.is_a?(Array)
|
21
|
+
name = ActiveSupport::Inflector.tableize((name[0]*'_').gsub(/\s+/, '_')) +
|
22
|
+
'_' +
|
23
|
+
ActiveSupport::Inflector.underscore((name[1..-1].flatten*'_').gsub(/\s+/, '_'))
|
24
|
+
else
|
25
|
+
ActiveSupport::Inflector.tableize(name.gsub(/\s+/, '_'))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.rails_singular_name name
|
30
|
+
# Crunch spaces and convert to snake_case
|
31
|
+
name = name.flatten*'_' if name.is_a?(Array)
|
32
|
+
ActiveSupport::Inflector.underscore(name.gsub(/\s+/, '_'))
|
33
|
+
end
|
34
|
+
|
35
|
+
class Column
|
36
|
+
def rails_name
|
37
|
+
RMap::rails_singular_name(name('_'))
|
38
|
+
end
|
39
|
+
|
40
|
+
def rails_type
|
41
|
+
type_name, params, constraints = *type()
|
42
|
+
rails_type = case type_name
|
43
|
+
when /^Auto ?Counter$/i
|
44
|
+
'serial' # REVISIT: Need to detect surrogate ID fields and handle them correctly
|
45
|
+
|
46
|
+
when /^[Ug]uid$/i
|
47
|
+
'uuid'
|
48
|
+
|
49
|
+
when /^Unsigned ?Integer$/i,
|
50
|
+
/^Integer$/i,
|
51
|
+
/^Signed ?Integer$/i,
|
52
|
+
/^Unsigned ?Small ?Integer$/i,
|
53
|
+
/^Signed ?Small ?Integer$/i,
|
54
|
+
/^Unsigned ?Tiny ?Integer$/i
|
55
|
+
length = nil
|
56
|
+
'integer'
|
57
|
+
|
58
|
+
when /^Decimal$/i
|
59
|
+
'decimal'
|
60
|
+
|
61
|
+
when /^Float$/i, /^Double$/i, /^Real$/i
|
62
|
+
'float'
|
63
|
+
|
64
|
+
when /^Fixed ?Length ?Text$/i, /^Char$/i
|
65
|
+
'string'
|
66
|
+
when /^Variable ?Length ?Text$/i, /^String$/i
|
67
|
+
'string'
|
68
|
+
when /^Large ?Length ?Text$/i, /^Text$/i
|
69
|
+
'text'
|
70
|
+
|
71
|
+
when /^Date ?And ?Time$/i, /^Date ?Time$/i
|
72
|
+
'datetime'
|
73
|
+
when /^Date$/i
|
74
|
+
'datetime'
|
75
|
+
when /^Time$/i
|
76
|
+
'time'
|
77
|
+
when /^Auto ?Time ?Stamp$/i
|
78
|
+
'timestamp'
|
79
|
+
|
80
|
+
when /^Money$/i
|
81
|
+
'decimal'
|
82
|
+
when /^Picture ?Raw ?Data$/i, /^Image$/i, /^Variable ?Length ?Raw ?Data$/i, /^Blob$/i
|
83
|
+
'binary'
|
84
|
+
when /^BIT$/i, /^Boolean$/i
|
85
|
+
'boolean'
|
86
|
+
else
|
87
|
+
type_name # raise "ActiveRecord type unknown for standard type #{type}"
|
88
|
+
end
|
89
|
+
[rails_type, params[:length]]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class Index
|
94
|
+
def rails_name
|
95
|
+
column_names = columns.map{|c| c.rails_name }
|
96
|
+
index_name = "index_#{on.rails_name+'_on_'+column_names*'_'}"
|
97
|
+
RMap.rails_name_trunc index_name
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
class ForeignKey
|
102
|
+
def rails_from_association_name
|
103
|
+
RMap::rails_singular_name(to_name.join('_'))
|
104
|
+
end
|
105
|
+
|
106
|
+
def rails_to_association
|
107
|
+
jump = jump_reference
|
108
|
+
if jump.is_one_to_one
|
109
|
+
[ "has_one", RMap::rails_singular_name(from_name)]
|
110
|
+
else
|
111
|
+
[ "has_many", RMap::rails_plural_name(from_name)]
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
module Metamodel
|
118
|
+
class ObjectType
|
119
|
+
def rails_name
|
120
|
+
RMap::rails_plural_name(name)
|
121
|
+
end
|
122
|
+
|
123
|
+
def rails_singular_name
|
124
|
+
RMap::rails_singular_name(name)
|
125
|
+
end
|
126
|
+
|
127
|
+
def rails_class_name
|
128
|
+
ActiveSupport::Inflector.camelize(name.gsub(/\s+/, '_'))
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -222,7 +222,7 @@ module ActiveFacts
|
|
222
222
|
table_role = ref.fact_type.all_role.detect{|r| r.object_type == table}
|
223
223
|
if table_role
|
224
224
|
remote_table = ref.to
|
225
|
-
while remote_table.absorbed_via
|
225
|
+
while remote_table && remote_table.absorbed_via
|
226
226
|
absorbed_into = remote_table.absorbed_via.from
|
227
227
|
remote_table = absorbed_into
|
228
228
|
end
|
@@ -15,7 +15,7 @@ module ActiveFacts
|
|
15
15
|
def add_surrogate type_name = 'Auto Counter', suffix = 'ID'
|
16
16
|
# Find or assert the surrogate value type
|
17
17
|
auto_counter = vocabulary.valid_value_type_name(type_name) ||
|
18
|
-
constellation.ValueType(:vocabulary => vocabulary, :name => type_name, :concept => :new)
|
18
|
+
constellation.ValueType(:vocabulary => vocabulary, :name => type_name, :concept => [:new, :implication_rule => 'Surrogate key transform'])
|
19
19
|
|
20
20
|
# Create a subtype to identify this entity type:
|
21
21
|
vt_name = self.name + ' '+suffix
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activefacts-generators
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.8.
|
4
|
+
version: 1.8.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Clifford Heath
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-05-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -62,47 +62,47 @@ dependencies:
|
|
62
62
|
name: activefacts-metamodel
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
|
-
- - ">="
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version: '1.8'
|
68
65
|
- - "~>"
|
69
66
|
- !ruby/object:Gem::Version
|
70
67
|
version: '1'
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '1.8'
|
71
71
|
type: :runtime
|
72
72
|
prerelease: false
|
73
73
|
version_requirements: !ruby/object:Gem::Requirement
|
74
74
|
requirements:
|
75
|
-
- - ">="
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: '1.8'
|
78
75
|
- - "~>"
|
79
76
|
- !ruby/object:Gem::Version
|
80
77
|
version: '1'
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '1.8'
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: activefacts-rmap
|
83
83
|
requirement: !ruby/object:Gem::Requirement
|
84
84
|
requirements:
|
85
|
-
- - ">="
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version: '1.8'
|
88
85
|
- - "~>"
|
89
86
|
- !ruby/object:Gem::Version
|
90
87
|
version: '1'
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '1.8'
|
91
91
|
type: :runtime
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
|
-
- - ">="
|
96
|
-
- !ruby/object:Gem::Version
|
97
|
-
version: '1.8'
|
98
95
|
- - "~>"
|
99
96
|
- !ruby/object:Gem::Version
|
100
97
|
version: '1'
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '1.8'
|
101
101
|
- !ruby/object:Gem::Dependency
|
102
102
|
name: activesupport
|
103
103
|
requirement: !ruby/object:Gem::Requirement
|
104
104
|
requirements:
|
105
|
-
- - "
|
105
|
+
- - "~>"
|
106
106
|
- !ruby/object:Gem::Version
|
107
107
|
version: '4.2'
|
108
108
|
- - "~>"
|
@@ -112,7 +112,7 @@ dependencies:
|
|
112
112
|
prerelease: false
|
113
113
|
version_requirements: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- - "
|
115
|
+
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '4.2'
|
118
118
|
- - "~>"
|
@@ -134,6 +134,7 @@ files:
|
|
134
134
|
- README.md
|
135
135
|
- Rakefile
|
136
136
|
- activefacts-generators.gemspec
|
137
|
+
- css/orm2.css
|
137
138
|
- lib/activefacts/dependency_analyser.rb
|
138
139
|
- lib/activefacts/generators/absorption.rb
|
139
140
|
- lib/activefacts/generators/composition.rb
|
@@ -158,6 +159,7 @@ files:
|
|
158
159
|
- lib/activefacts/generators/traits/datavault.rb
|
159
160
|
- lib/activefacts/generators/traits/oo.rb
|
160
161
|
- lib/activefacts/generators/traits/ordered.rb
|
162
|
+
- lib/activefacts/generators/traits/rails.rb
|
161
163
|
- lib/activefacts/generators/traits/ruby.rb
|
162
164
|
- lib/activefacts/generators/traits/scala.rb
|
163
165
|
- lib/activefacts/generators/transform/datavault.rb
|
@@ -183,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
183
185
|
version: '0'
|
184
186
|
requirements: []
|
185
187
|
rubyforge_project:
|
186
|
-
rubygems_version: 2.
|
188
|
+
rubygems_version: 2.4.5
|
187
189
|
signing_key:
|
188
190
|
specification_version: 4
|
189
191
|
summary: Code Generators for the ActiveFacts suite
|