activefacts 0.8.13 → 0.8.15

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -74,13 +74,19 @@ lib/activefacts/cql/nodes.rb
74
74
  lib/activefacts/cql/parser.rb
75
75
  lib/activefacts/generate/absorption.rb
76
76
  lib/activefacts/generate/cql.rb
77
+ lib/activefacts/generate/dm.rb
78
+ lib/activefacts/generate/help.rb
79
+ lib/activefacts/generate/html/glossary.rb
80
+ lib/activefacts/generate/json.rb
77
81
  lib/activefacts/generate/null.rb
78
82
  lib/activefacts/generate/oo.rb
79
83
  lib/activefacts/generate/ordered.rb
84
+ lib/activefacts/generate/records.rb
80
85
  lib/activefacts/generate/ruby.rb
81
86
  lib/activefacts/generate/sql/mysql.rb
82
87
  lib/activefacts/generate/sql/server.rb
83
88
  lib/activefacts/generate/text.rb
89
+ lib/activefacts/generate/version.rb
84
90
  lib/activefacts/input/cql.rb
85
91
  lib/activefacts/input/orm.rb
86
92
  lib/activefacts/persistence.rb
data/Rakefile CHANGED
@@ -1,64 +1,91 @@
1
- %w[rubygems hoe rake rake/clean fileutils newgem thread rubigen].each { |f|
2
- require f
3
- }
4
- Hoe.plugin :gemspec
5
-
6
- require 'rspec'
7
- require 'rspec/core/rake_task'
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'fileutils'
4
+ require File.dirname(__FILE__) + '/lib/activefacts'
8
5
 
9
- gem "rspec", :require => "spec/rake/spectask"
6
+ def File.read_utf(path)
7
+ open path, 'rb' do |f|
8
+ f.read.sub %r/\A\xEF\xBB\xBF/, ''
9
+ end
10
+ end
10
11
 
11
- require File.dirname(__FILE__) + '/lib/activefacts'
12
+ def paragraphs_of path, *paragraphs
13
+ File.read_utf(path).delete("\r").split(/\n\n+/).values_at(*paragraphs)
14
+ end
12
15
 
13
- # Generate all the Rake tasks
14
- # Run 'rake -T' to see list of generated tasks (from gem root directory)
15
- $hoe = Hoe.spec('activefacts') do |p|
16
- p.version = ActiveFacts::VERSION
17
- p.summary = "A semantic modeling and query language (CQL) and application runtime (the Constellation API)"
18
- p.description = %q{
16
+ require 'jeweler'
17
+ Jeweler::Tasks.new do |gem|
18
+ gem.name = "activefacts"
19
+ gem.homepage = "http://github.com/cjheath/activefacts"
20
+ gem.license = "MIT"
21
+ gem.version = ActiveFacts::VERSION
22
+ gem.summary = "A semantic modeling and query language (CQL) and application runtime (the Constellation API)"
23
+ gem.description = %q{
19
24
  ActiveFacts provides a semantic modeling language, the Constellation
20
25
  Query Language (CQL). CQL combines natural language verbalisation and
21
26
  formal logic, producing a formal language that reads like plain
22
27
  English. ActiveFacts converts semantic models from CQL to relational
23
28
  and object models in SQL, Ruby and other languages.
24
29
  }
25
- # p.url = "http://dataconstellation.com/ActiveFacts/"
26
- p.developer('Clifford Heath', 'cjh@dataconstellation.org')
27
- p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
28
- p.post_install_message = 'For more information on ActiveFacts, see http://dataconstellation.com/ActiveFacts'
29
- p.rubyforge_name = "cjheath@rubyforge.org"
30
- p.extra_deps = [
31
- ['activefacts-api','>= 0.8.12'],
32
- ['treetop','>= 1.4.1'],
33
- ['rake','>= 0.8.7'],
34
- ]
35
- p.extra_dev_deps = [
36
- ['newgem', ">= #{::Newgem::VERSION}"]
37
- ]
38
- p.spec_extras[:extensions] = 'lib/activefacts/cql/Rakefile'
39
- # Magic Hoe hook to prevent the generation of diagrams:
40
- ENV['NODOT'] = 'yes'
41
- p.spec_extras[:rdoc_options] = ['-S'] +
30
+ # gem.url = "http://dataconstellation.com/ActiveFacts/"
31
+
32
+ gem.email = "cjh@dataconstellation.com"
33
+ gem.authors = ["Clifford Heath"]
34
+ gem.add_dependency "activefacts-api", "~>0.9.1"
35
+ gem.add_dependency "treetop"
36
+ gem.add_dependency "nokogiri"
37
+ gem.add_development_dependency "rspec", "~> 2.3.0"
38
+ gem.add_development_dependency "bundler", "~> 1.0.0"
39
+ gem.add_development_dependency "jeweler", "~> 1.5.2"
40
+ # gem.add_development_dependency "rcov", ">= 0"
41
+ gem.add_development_dependency "rdoc", ">= 2.4.2"
42
+
43
+ # gem.changes = paragraphs_of("History.txt", 0..1).join("\n\n")
44
+ gem.extensions = ['lib/activefacts/cql/Rakefile']
45
+ gem.post_install_message = 'For more information on ActiveFacts, see http://dataconstellation.com/ActiveFacts'
46
+
47
+ gem.files = File.open("Manifest.txt"){|f| f.read.split(/\n/)}
48
+ gem.executables = gem.files.grep(%r{^bin/}).map{|f| f.sub('bin/', '')}
49
+ gem.rdoc_options = ['-S'] +
42
50
  # RDoc used to have these options: -A has_one -A one_to_one -A maybe
43
51
  %w{
44
52
  -x lib/activefacts/cql/.*.rb
45
53
  -x lib/activefacts/vocabulary/.*.rb
46
54
  }
47
- p.clean_globs |= %w[**/.DS_Store tmp *.log]
48
- path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
49
- p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
50
- p.rsync_args = '-av --delete --ignore-errors'
51
55
  end
56
+ Jeweler::RubygemsDotOrgTasks.new
57
+
58
+ # Dir['tasks/**/*.rake'].each { |t| load t }
59
+
60
+ require 'rspec'
61
+ require 'rspec/core/rake_task'
52
62
 
53
- require 'newgem/tasks' # load /tasks/*.rake
54
- Dir['tasks/**/*.rake'].each { |t| load t }
63
+ gem "rspec", :require => "spec/rake/spectask"
55
64
 
56
- # TODO - want other tests/tasks run by default? Add them to the list
57
- # task :default => [:spec, :features]
65
+ task :default => :spec
58
66
 
59
- RSpec::Core::RakeTask.new do |t|
67
+ desc "Run Rspec tests"
68
+ RSpec::Core::RakeTask.new(:spec) do |t|
60
69
  t.ruby_opts = ['-I', "lib"]
70
+ t.rspec_opts = %w{-f d}
61
71
  # t.pattern = FileList['spec/**/*_spec.rb']
62
72
  # t.rcov = true
63
73
  # t.rcov_opts = ['--exclude', 'spec,/usr/lib/ruby' ]
64
74
  end
75
+
76
+ desc "Run RSpec tests and produce coverage files (results viewable in coverage/index.html)"
77
+ RSpec::Core::RakeTask.new(:coverage) do |spec|
78
+ if RUBY_VERSION < '1.9'
79
+ spec.rcov_opts = [
80
+ '--exclude', 'spec',
81
+ '--exclude', 'gem/*'
82
+ ]
83
+ spec.rcov = true
84
+ else
85
+ spec.rspec_opts = ['--require', 'simplecov_helper']
86
+ end
87
+ end
88
+
89
+ task :cov => :coverage
90
+ task :rcov => :coverage
91
+ task :simplecov => :coverage
data/TODO ADDED
@@ -0,0 +1,308 @@
1
+ ActiveFacts ToDo list
2
+
3
+ Metamodel
4
+ ALWAYS Integrate Metamodel changes through lib/activefacts/vocabulary/metamodel.rb
5
+ SOON Add Terms for Object Types
6
+ using Words? (which include adjectives/rolenames)
7
+ Notes (Extend context notes)
8
+ comments in CQL?
9
+ Derivation notes?
10
+ HelpText?
11
+ FBM Standards Metamodel
12
+ Migrate towards standard terminology
13
+ Make ORM model emit good CQL
14
+ Use UUIDs
15
+ Renamed from ("Person (was called User) ...")
16
+ Multiple revisions?
17
+ Extensions (new vocabularies?) for Metamodel
18
+ security
19
+ processes
20
+ discussion/conversation
21
+ Implement abstract supertypes?
22
+ Allow Object naming "Paris means City 'Paris'"
23
+ Use subtype extension in Metamodel (based on abstract SBVR supertypes as shown?)
24
+ Meaning
25
+ Concept
26
+ NounConcept
27
+ ObjectType
28
+ RolePlaying
29
+ FactType
30
+ Fact
31
+ Value
32
+ Query
33
+ Lexeme (language/locale sensitive text)
34
+ Term
35
+ Reading (template text, adjectives)
36
+ Value (literal)
37
+ Or just have per-locale syntax parser/generator to/from canonical form?
38
+ Role names
39
+ need to attach to RoleRefs instead of Roles
40
+ Refactor RoleRef and RoleSequence so RoleSequence isn't re-used out of context
41
+ Index/access-path/ordering pragmas
42
+ Temporal literals (expressions using current time)
43
+ Temporal: e.g. Date/Time {{/not} {after/before}} Date/Time
44
+ SOON Refactor Derived Fact Types (Queries) using new terminology
45
+
46
+ CQL
47
+ Object Types
48
+ ValueTypes
49
+ Change so Data Types are not inherited
50
+ Implement named parameters
51
+ Autogenerated
52
+ On assert (UUID)
53
+ On save (ID, Timestamp, etc)
54
+ Partial auto-counters (Role, *Ordinal*)
55
+ Implement base VTs
56
+ SOON "vt is written;" syntax
57
+ Entity Types
58
+ SOON "Et is identified;" forward-reference syntax
59
+ Allow other possessive pronouns "Ship is identified by her Name"
60
+ Allow shorthand for multi-part identification
61
+ "Person is identified by his given-Name and family-Name;"
62
+ Subtypes
63
+ Support Role subtypes as distinct (subtype migration allowed)
64
+ Subtyping fact type role names?
65
+ Object Names
66
+ "Paris means City 'Paris'"
67
+
68
+ Joins
69
+ SOON Anti-joins (no, none, negation, "it is not the case that", etc)
70
+ SOON Double-contraction "Person who came to Party and was not invited to"
71
+ SOON Outer joins ("maybe")
72
+ SOON Compile Value join nodes
73
+ STARTED, DIFFICULT Implement comparison operators as derived fact types (<, etc)
74
+ Automatically detect type conversion joins
75
+
76
+ Queries
77
+ Expression clauses
78
+ Redo grammar as normal clause (A < B -> A rel B)
79
+ User-defined expression operators/clauses?
80
+ Fact Type Negation (A rel no B, no A rel B)
81
+ "returning" clause
82
+ Invoke queries using defined role names:
83
+ Company has young Person (as Director) where ...
84
+ (invoke as "Company has young Director")
85
+ Temporal terms and phrases
86
+ "now" "4 year ago", "3 minutes from now"
87
+ Temporal ValueType to act as a Universal fact type over the domain
88
+ e.g. Time.hour -> all possible hours
89
+ Figure out what base constraints propagate to the result set
90
+ Allow "which" to project roles from a query "which Person gatecrashed Party?"
91
+ Value range restrictions (in {1,2,4}) instead of (restricted to {...})
92
+
93
+ Linguistic aspects
94
+ UTF-8 Support
95
+ Other languages
96
+ Define syntax for and handle Gender
97
+ French
98
+ Spanish
99
+ Use filename to select (Bar.fr.cql or Bar.cql.fr?)
100
+ Use metamodel predicates instead of pragmas
101
+ e.g. for "Object type is independent", say "Object Type 'Foo' is independent";
102
+ How to handle Fact Type names in the above syntax? Objectify? But need ring constraint roles.
103
+ Vocabulary name is implicit here...
104
+ SOON Allow more than one Business Context Note per item
105
+ Fact type binding
106
+ Use non-local role names in fact type matching?
107
+ Check that subscripts are being tested properly
108
+ Implement some/that binding
109
+ subscripts not necessary where "that" is unambiguous.
110
+ which/that: "which Person likes that Person?"
111
+ Double-hyphen for hyphenated adjectives
112
+
113
+ Constraints
114
+ SOON Implement "maybe" to make min-frequency non-mandatory
115
+ Value Literal syntax constraints
116
+ Regexp: "vt is written to match /xyz/"
117
+ Regexp for role values
118
+ subtype of Value Constraint
119
+ PEG Grammars for literals? (extend CQL grammar)
120
+ Ring constraints
121
+ how to handle ambiguous rings, e.g. in ternaries?
122
+ how to handle multiple rings in one FT?
123
+ Think about syntax to allow this
124
+ Populate Ring Types in metamodel (five unaries?)
125
+ Constraint names (esp Presence Constraints, they become index names)
126
+ Temporal Modeling ([at most] one at a time)
127
+ single table mapping
128
+ two tables mappings (current/history)
129
+ Add Exclusion constraint syntax using negative clause:
130
+ Person is ceo if and only if no Manager manages (that?) Person
131
+ Similar case exists for subset constraint?
132
+ A rel B only if no B rel C - think through
133
+ Delay creation of default identifying constraints for objectified fact types
134
+ Perhaps before relational/object mapping?
135
+ Or don't create them at all - handle missing PI for OFTs instead
136
+ Asserted instances
137
+ "including {'foo', 'bar', ...}" akin to "restricted to"...
138
+
139
+ Importing vocabularies
140
+ Distinguish "import" from "use"?
141
+ Bind to imported ValueTypes (and other object types?)
142
+ Base vocabularies for SQL
143
+ Multiple SQL base vocabs, using db pref to choose between.
144
+
145
+ CQL Verbaliser
146
+ SOON Detect new fact types that would be interpreted as an existing (only adjectives differ), and use single reading (before double-reading) e.g. other-Role of RingConstraint
147
+ Implement some/that binding
148
+ use some/that where "that" is unambiguous
149
+ Don't emit some/that until binding will use it properly
150
+ Instance data verbalisation
151
+ Emit objectification joins
152
+ Contractions (use Verbaliser!)
153
+ Emit example fact from ORM2009 presentation
154
+ Output clustering
155
+ Emit Value Types just before first use
156
+ Emit Constraints as soon as possible
157
+ Choose "focus" items with most 1st and 2nd generation dependencies, and do all precursors/followers before choosing another
158
+ Left-contraction of joins "Xyz is ... and is ...;"
159
+
160
+ Units
161
+ SOON Store sample data with specified unit
162
+ Handle storing numeric Instance values (noted to be in the lexical form; but strings aren't!)
163
+ SOON Save Units on ValueTypes
164
+ Generate conversion formula to fundamental types
165
+
166
+ CQL Shell
167
+ Save definitions, including instances
168
+ /sql; generate the SQL for this vocabulary
169
+ /valid; check all metamodel constraints over the vocabulary, and/or vocabulary constraints over the population
170
+ Queries
171
+ /population {open, check, create} database_name
172
+ /ruby
173
+ /cql
174
+
175
+ NORMA reader
176
+ NORMA Joins
177
+ Detect and store implicit joins in presence constraints (if needed???)
178
+ Convert all NORMA Join paths
179
+ NORMA input: Warn when preferred reading role order doesn't match the preferred identifier for objectified FTs
180
+ Import instance data for objectified fact types
181
+ Double-hyphen for hyphenated adjectives
182
+
183
+ Generators
184
+ Ruby generator
185
+ Emit a module method for each example population
186
+
187
+ Relational Composition
188
+ Subtype Mapping
189
+ extension (subtype in separate table)
190
+ partition (separate and include all supertype roles)
191
+ Make sure all test scenarios are covered
192
+ Transforms
193
+ Rails ID injection
194
+ Subtype discriminator injection where no mandatory role on subtype
195
+ Don't introduce additional discriminator for sub-sub-type
196
+ Detect non-exclusive subtypes and discriminate combinations
197
+ Column name generation
198
+ Provide alternative generation pattern(s) (snake-case)
199
+ Duplicate column names (detect, handle)
200
+ SQL Generation
201
+ Auto-generated column types
202
+ IDentity fields
203
+ GUIDs
204
+ partial auto-counters (Ordinal)
205
+ Timestamps
206
+ other auto-counters?
207
+ Foreign Key fields
208
+ Index both ends
209
+ Determine cascading based on mandatory-ness
210
+ Emit triggers where PK is in a subtype (and view was generated)
211
+ Existing database/vocabulary
212
+ Minimal impact vs refactor and migrate
213
+
214
+ Runtime API
215
+ Autogenerated Data Types
216
+ GUID, Ordinal
217
+ Entity
218
+ Save identifying roles as Role objects not symbols
219
+ SOON Propagate retract() properly (replace delete?)
220
+ Subtype migration
221
+ Replace instance by instance of different class, de-/re-assign all roles?
222
+ Re-use same role proxy/ies?
223
+ Role value array proxy class
224
+ Handle sorting by residual fields in counterpart's key
225
+ Detect & preserve adds/deletes
226
+ Correctly handle values across multiple constellations or in no constellation
227
+ Verbalisation
228
+ SOON Add readings to API
229
+ Redo all verbalisation to use readings
230
+ Use existing verbalise for to_s
231
+ Ensure that all objects and classes verbalise and to_s
232
+ SOON verbalise Role Value Array
233
+ verbalise takes optional "verbalisation context" object
234
+ Which objects have already been verbalised
235
+ What role names and/or subscripts have been assigned
236
+ Possible to implement as a single-pass process?
237
+ Queries
238
+ Query DSL/API in Ruby?
239
+ CQL Query conversion to SQL (via Ruby?)
240
+ Constellation boundaries
241
+ Record unpopulated roles and object types during query execution (nil != mu)
242
+ Hard vs soft boundary (Auto-fetch vs exception)
243
+ RDBMS Platform Support
244
+ DataObjects (SQL Server, MySQL, PostgreSQL, Oracle, DB2)
245
+ Enumerate tables instead of needing "table" keyword
246
+ Log changes to allow update
247
+
248
+ Database reverse engineering
249
+ Read Linda Bird's PhD thesis
250
+ Extract raw schema info
251
+ Tables
252
+ Columns & types
253
+ Null constraints
254
+ Unique & primary keys
255
+ Foreign keys
256
+ Check constraints
257
+ Naming Heuristics
258
+ Rails
259
+ Intuition (FK naming)
260
+ Load Rails models
261
+ Detect pluralisation
262
+ intuit common reference modes (e.g. thing_ID)
263
+ Examine data for likely FKs
264
+ count, min, max, median, distinct, count(NULL)
265
+ Check non-violation of possible FKs:
266
+ select count(*) where not exists ...
267
+ Decompose to elementary form
268
+ Schema transform by manual selection (GUI?)
269
+ Deabsorb (incl to use existing type)
270
+ Alias name
271
+ Project subclass using discriminator
272
+ ... other transforms
273
+
274
+ Test stubs/mocks
275
+ Quality/usage metrics
276
+ Mock API
277
+ Mock data
278
+ Use sample population as test data
279
+ incorporate Faker, Machinist, etc
280
+
281
+ Packaging and documentation
282
+ Split into multiple gems?
283
+
284
+ Example models
285
+ Convert microformat RDF: http://microformats.org/about, http://www.data-vocabulary.org/
286
+
287
+ APRIMO
288
+ Overall design
289
+ Subscription, list/search models, friends
290
+ Diagram view
291
+ CQL view
292
+ Object type browser
293
+ Object Types
294
+ Fact Types
295
+ Constraints
296
+ Instance data
297
+ Query builder
298
+ AJAX
299
+ Design JSON API
300
+ Server
301
+ Stand-alone???
302
+ Metamodel Diagrams
303
+ Convert from metamodel to JSON
304
+ Database
305
+ Derived Fact Types
306
+ Constellation declarations
307
+ Process models
308
+ Units