active-orient 0.5 → 0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -2
  3. data/README.md +78 -35
  4. data/VERSION +1 -1
  5. data/active-orient.gemspec +4 -4
  6. data/bin/active-orient-console +8 -5
  7. data/config/boot.rb +2 -4
  8. data/config/config.yml +1 -1
  9. data/config/connect.yml +2 -2
  10. data/examples/time_graph.md +162 -0
  11. data/gratefuldeadconcerts.md +94 -0
  12. data/lib/active-orient.rb +4 -2
  13. data/lib/base.rb +53 -20
  14. data/lib/base_properties.rb +2 -3
  15. data/lib/class_utils.rb +3 -4
  16. data/lib/database_utils.rb +14 -5
  17. data/lib/init.rb +11 -1
  18. data/lib/model/edge.rb +12 -10
  19. data/lib/model/model.rb +17 -3
  20. data/lib/model/the_class.rb +60 -40
  21. data/lib/model/the_record.rb +63 -51
  22. data/lib/model/vertex.rb +114 -10
  23. data/lib/orient.rb +24 -33
  24. data/lib/orientdb_private.rb +31 -31
  25. data/lib/other.rb +55 -5
  26. data/lib/rest/change.rb +17 -4
  27. data/lib/rest/create.rb +38 -24
  28. data/lib/rest/delete.rb +3 -2
  29. data/lib/rest/operations.rb +37 -27
  30. data/lib/rest/read.rb +2 -2
  31. data/lib/rest/rest.rb +4 -3
  32. data/lib/support.rb +17 -16
  33. data/linkmap.md +75 -0
  34. data/namespace.md +111 -0
  35. data/rails.md +125 -0
  36. data/rails/activeorient.rb +53 -0
  37. data/{examples/time_graph/config → rails}/config.yml +3 -1
  38. data/{examples/time_graph/config → rails}/connect.yml +2 -2
  39. data/usecase_oo.md +3 -1
  40. metadata +21 -38
  41. data/examples/createTime.rb +0 -91
  42. data/examples/time_graph/Gemfile +0 -21
  43. data/examples/time_graph/Guardfile +0 -26
  44. data/examples/time_graph/README.md +0 -129
  45. data/examples/time_graph/bin/active-orient-console +0 -35
  46. data/examples/time_graph/config/boot.rb +0 -119
  47. data/examples/time_graph/config/init_db.rb +0 -59
  48. data/examples/time_graph/createTime.rb +0 -51
  49. data/examples/time_graph/lib/createTime.rb +0 -82
  50. data/examples/time_graph/model/day_of.rb +0 -3
  51. data/examples/time_graph/model/e.rb +0 -6
  52. data/examples/time_graph/model/edge.rb +0 -53
  53. data/examples/time_graph/model/monat.rb +0 -19
  54. data/examples/time_graph/model/stunde.rb +0 -16
  55. data/examples/time_graph/model/tag.rb +0 -29
  56. data/examples/time_graph/model/time_base.rb +0 -6
  57. data/examples/time_graph/model/time_of.rb +0 -4
  58. data/examples/time_graph/model/v.rb +0 -3
  59. data/examples/time_graph/model/vertex.rb +0 -32
  60. data/examples/time_graph/spec/lib/create_time_spec.rb +0 -50
  61. data/examples/time_graph/spec/rest_helper.rb +0 -37
  62. data/examples/time_graph/spec/spec_helper.rb +0 -46
  63. data/usecase.md +0 -104
@@ -0,0 +1,75 @@
1
+ # Joining Tables
2
+
3
+ The most important difference between OrientDB and a Relational Database is that relationships are represented by LINKS instead of JOINs.
4
+
5
+ For this reason, the classic JOIN syntax is not supported. OrientDB uses the "dot (.) notation" to navigate LINKS
6
+ (OrientDB-documation)
7
+
8
+ This is supported by ActiveOrient in a very convient way.
9
+
10
+ ## Playing with Arrays and Linkmaps
11
+
12
+ Linkmaps are the OrientDB equivalent to joined tables
13
+ Formally, they are ordinary arrays.
14
+
15
+ They can be created schemaless
16
+
17
+ ```ruby
18
+ DB.create_class :industry
19
+ DB.create_class :property
20
+ property_record= Property.create con_id: 12346, property: []
21
+ industries = ['Construction','HealthCare','Bevarage']
22
+ industries.each{| industry | property_record.property << Industry.create( label: industry ) }
23
+
24
+ Property.last
25
+ => #<Property:0x00000001d1a938 @metadata={"type"=>"d", (...)},
26
+ @attributes={"con_id"=>12346, "property"=>["#34:0", "#35:0", "#36:0"],
27
+ "created_at"=>"2017-02-01T06:28:17.332 01:00", "updated_at"=>"2017-02-01T06:28:17.344 01:00"}>
28
+ ```
29
+
30
+ Stored data in this array is accessible via
31
+
32
+ ```ruby
33
+ p = Property.last
34
+ p.property.label
35
+ => ["Construction", "HealthCare", "Bevarage"]
36
+ p.property[2].label
37
+ => "Bevarage"
38
+ p.property.label[2]
39
+ => "Bevarage"
40
+ p.property[2].label[2]
41
+ => "v"
42
+
43
+ p.property.remove_at 2
44
+ p.property.label
45
+ => ["Construction", "HealthCare"]
46
+
47
+ p.property[2] = Industry.where(label:'Bevarage').first
48
+ p.property.label
49
+ => ["Construction", "HealthCare", "Bevarage"]
50
+ ```
51
+
52
+ The Elements of the Array can be treated like common ruby Arrays. Manipulations are
53
+ performed in ruby-spac. Simply call
54
+ ```ruby
55
+ p.update
56
+ ```
57
+ to transfer the changes into the database. This approach can be extended to linked records as well
58
+
59
+ ```ruby
60
+ p.property[2].label = 'zu'
61
+ p.property[2].update
62
+ p.property.label
63
+ => ["Construction", "HealthCare", "zu"]
64
+ Industry.last.label
65
+ => "zu"
66
+
67
+
68
+ ```
69
+
70
+
71
+
72
+
73
+ (to be continued)
74
+
75
+
@@ -0,0 +1,111 @@
1
+ ## Namespace Support
2
+
3
+ Consider a project, where different tasks are clearly separated.
4
+
5
+ A common case is, to concentrate any gathering of raw data in a separate module, maybe even in a gem.
6
+
7
+ ActiveOrient enables this by switching the "ActiveOrient::Model.namespace" directive.
8
+
9
+ In out case, the "ib-ruby" gem gets data through an api
10
+ The gem provides the logic to convert the raw-data from the server to ActiveOrient::Model-Objects.
11
+ Its located in the model-directory of the gem.
12
+
13
+ Just by including the gem in the Gemfile and requiring the gem, anything is available in our project.
14
+
15
+ The gem defines the ActiveOrient-Environment as follows:
16
+ ```ruby
17
+ module IB
18
+ module ORD
19
+ include ActiveOrient::Init # namespace support
20
+ mattr_accessor :login
21
+
22
+ # establishes a connection to the Database and returns the Connection-Object (an ActiveOrient::OrientDB. …instance)
23
+ def self.connect
24
+
25
+ c = { :server => 'localhost', :port => 2480, :protocol => 'http',
26
+ :user => 'root', :password => 'root', :database => 'temp' }.merge login.presence || {}
27
+ ActiveOrient.default_server= { user: c[:user], password: c[:password] , server: c[:server], port: c[:port] }
28
+ ActiveOrient.database = c[:database]
29
+ logger = Logger.new '/dev/stdout'
30
+ ActiveOrient::Init.define_namespace { IB }
31
+ project_root = File.expand_path('../..', __FILE__)
32
+
33
+ ActiveOrient::Model.model_dir = "#{project_root}/models"
34
+ ActiveOrient::OrientDB.new preallocate: true # connect via http-rest
35
+
36
+ (...)
37
+ ```
38
+ The gem scans through all database classes present, and allocates only those, where a model-file
39
+ is found in the model-directory.
40
+
41
+ This takes place by requiring 'ib-ruby' in 'config/boot.rb'
42
+
43
+ ```ruby
44
+ 76 #read the configuration and model-files from the ib-ruby gem directotry
45
+ 77 require 'ib/ord'
46
+ 78 IB::ORD.login= ActiveOrient.default_server.merge database: ActiveOrient.database
47
+ 79 require 'ib-ruby' # automatically connects to the database
48
+ 80
49
+ 81 # set the model-file for the time-graph
50
+ 82 module TG
51
+ 83 end
52
+ 84 ActiveOrient::Model.model_dir = "#{project_root}/model"
53
+ 85 ActiveOrient::Init.define_namespace { TG }
54
+ 86 puts "Namespace changed: #{ActiveOrient::Model.namespace}"
55
+ 87 ActiveOrient::OrientDB.new preallocate: true
56
+
57
+ ```
58
+
59
+ After row 80, the namspace is changed to "TG" (TimeGraph). The example provides a gem as well. Just
60
+ »require 'orientdb_time_graph'« and call »TG.connect« to include it properly.
61
+
62
+ The code above shows how to integrate the classes within the structure of the project. The difference is the placement
63
+ of the model-files. With the gem, they are located in the root-directory of the gem. The other approach looks in the model-directory of the project (model/tg).
64
+
65
+ Before we start, we switch to the object-layer, where we want to define the working-classes. Their
66
+ logic is defined in model-files in 'model'. And we want to make shure, that all database-classes are allocated
67
+ to ruby classes.
68
+
69
+ ```ruby
70
+ 97 ActiveOrient::Init.define_namespace :object
71
+ 98 ActiveOrient::Model.keep_models_without_file = true
72
+ 99 ORD = ActiveOrient::OrientDB.new preallocate: true
73
+ ```
74
+
75
+ **note** The preallocation-algorithm trys to load any class. If »ActiveOrient::Model.keep_models_without_file«
76
+ is set to false, classes are allocated only, if a model-file is present. As a consequence, any appropopiate
77
+ model-file is loaded.
78
+
79
+ Any previously allocated class can thus be extended, providing a proper model-file. For example: If we
80
+ allocated a class «Contract« in the namspace »IB«, methods for this class are included from the model-dir specified in the gem *and* in the actual-model-directory ( in this case: model/ib/contract.rb ).
81
+
82
+
83
+ As a result something like this appears:
84
+
85
+ ```
86
+ DB-Class -> Ruby-Object
87
+ V -> V
88
+ E -> E
89
+ contract -> IB::Contract
90
+ bag -> IB::Bag
91
+ forex -> IB::Forex
92
+ future -> IB::Future
93
+ option -> IB::Option
94
+ stock -> IB::Stock
95
+ account -> IB::Account
96
+ bar -> IB::Bar
97
+ contract_detail -> IB::ContractDetail
98
+ day_of -> TG::DAY_OF
99
+ time_of -> TG::TIME_OF
100
+ time_base -> TG::TimeBase
101
+ monat -> TG::Monat
102
+ stunde -> TG::Stunde
103
+ tag -> TG::Tag
104
+
105
+ new_test -> NewTest
106
+
107
+ ```
108
+
109
+ By changing the namespace-scope with 'ActiveOrient::Init.define_namespace' its always possible to
110
+ change properties, include links and edges or to add and remove classes in the Sub-Modules.
111
+
@@ -0,0 +1,125 @@
1
+ # Active Orient and Rails
2
+
3
+ The usage of Orientdb via ActiveOrient in Rails requires just a few steps.
4
+ Based on a Rails 5 installation
5
+
6
+ ```ruby
7
+ rvm install 2.4
8
+ rvm use 2.4
9
+ gem install bundler
10
+ gem install nokogiri
11
+ gem install rails
12
+ rails -v # Rails 5.0.1
13
+
14
+ ```
15
+
16
+ create your working directory and initialize the system
17
+
18
+ ```ruby
19
+ mkdir rails_project; cd rails_project
20
+ rails -OCT .
21
+ ```
22
+ This initializes a Rails-Stack, without active-record, action-cable and the test-suite.
23
+ (We will use rspec later)
24
+
25
+ This can be checked by inspecting «/config/application.rb «
26
+
27
+ ```ruby
28
+ rails s puma
29
+ ```
30
+ should work at this stage.
31
+
32
+ ## Modify the Gemfile
33
+ Inform rails to use orientdb and active-orient
34
+
35
+ ```
36
+ echo " gem 'active-orient' , :path => '/home/your_cloned_active_orient_path/activeorient' " >> Gemfile
37
+ # or
38
+
39
+ echo " gem 'active-orient' , :git => 'https://github.com/topofocus/active-orient.git' " >> Gemfile
40
+ ```
41
+
42
+ After that, copy
43
+
44
+ * __active_orient/rails/activeorient.rb__ to /config/initializers in the rails-project dir
45
+ * __active_orient/rails/connect.yml__ to /config
46
+ * __active_orient/rails/config.yml__ to /config
47
+
48
+ and modify the yml-files accordingly.
49
+
50
+ Run the bundler
51
+
52
+ ```
53
+ bundle install & bundle update
54
+ ```
55
+
56
+ The database should be present in the rails console, and
57
+ ```ruby
58
+ rails c
59
+
60
+ V.count
61
+ V.first
62
+ E.count
63
+ puts ActiveOrient::Model.allocated_classes.map{|x,y| "#{"%15s"% x} -> #{y.to_s}" }.join("\n")
64
+
65
+ ```
66
+ should work.
67
+
68
+ **Notice** The spring-facility is running in the background. Stop the server prior reloading
69
+ the console ( ./bin/spring stop ).
70
+
71
+ The final step is to generate Model-Files. In «/config/config.yml» the «:model_dir»-var points to
72
+ the location of the model-files. The default is 'lib/orient'.
73
+
74
+ Upon startup this directory is scanned for autoloading database-files.
75
+
76
+ After envoking the rails console, the logfile displays sucessfully loaded and missing files, ie.
77
+
78
+ ```
79
+ 14.01.(08:28:45) INFO->ModelClass#RequireModelFile:..:model-file not present: /home/topo/workspace/orient-rails/lib/orient/followed_by.rb
80
+ 14.01.(08:28:45) INFO->ModelClass#RequireModelFile:..:/home/topo/workspace/orient-rails/lib/orient/v.rb sucessfully loaded
81
+ ```
82
+
83
+ ## Model-file Example
84
+
85
+ To query the GratefulDeadConcerts Database, «v.rb» hosts the essential model methods.
86
+ As always, use «def self.{method}« for class methods and simply «def {method}» for methods working on the record level.
87
+
88
+ ```
89
+ 1 class V
90
+ 2 def self.artists **attributes
91
+ 3 names 'artist', **attributes
92
+ 4 end
93
+ 5
94
+ 6 def self.songs **attributes
95
+ 7 names 'song', **attributes
96
+ 8 end
97
+ 9
98
+ 10 def self.types
99
+ 11 oo = OrientSupport::OrientQuery
100
+ 12 this_query = oo.new distinct: [:type, :a ]
101
+ 13 query_database( this_query ).a
102
+ 14 end
103
+ 15 private
104
+ 16 def self.names type, sort: :asc, limit: 20, skip: 0
105
+ 17 puts "in names"
106
+ 18 oo = OrientSupport::OrientQuery
107
+ 19 query_database oo.new( where: {type: type },
108
+ 20 order: { name: sort } ,
109
+ 21 limit: limit ,
110
+ 22 skip: skip )
111
+ 23 end
112
+ 24 end
113
+
114
+ ```
115
+
116
+ Now
117
+
118
+ ```ruby
119
+ V.types
120
+ V.artists limit: 15, skip: 34, sort: :desc
121
+ ```
122
+ queries the database, fetches 15 artists and can be used everywhere.
123
+
124
+
125
+
@@ -0,0 +1,53 @@
1
+ project_root = File.expand_path('../../..', __FILE__)
2
+ config_root = File.expand_path('../..', __FILE__)
3
+ begin
4
+ connect_file = File.expand_path('../../connect.yml', __FILE__)
5
+ config_file = File.expand_path('../../config.yml', __FILE__)
6
+ connectyml = YAML.load_file( connect_file )[:orientdb][:admin] if connect_file.present?
7
+ configyml = YAML.load_file( config_file )[:active_orient] if config_file.present?
8
+ databaseyml = YAML.load_file( connect_file )[:orientdb][:database] if connect_file.present?
9
+ rescue Errno::ENOENT => e
10
+ Rails.logger.error{ "config/connect.yml not present" }
11
+ puts "config/connectyml not present"
12
+ Rails.logger.error{ "Using defaults to connect database-server" }
13
+ puts "Using defaults to connect database-server"
14
+
15
+ end
16
+
17
+ ActiveOrient::Model.model_dir = "#{project_root}/#{ configyml.present? ? configyml[:model_dir] : "model" }"
18
+ ActiveOrient::Model.keep_models_without_file = true
19
+ # lib/init.rb
20
+ ActiveOrient::Init.define_namespace yml: configyml, namespace: @namespace
21
+
22
+
23
+
24
+ Rails.logger.formatter = proc do |severity, datetime, progname, msg|
25
+ "#{datetime.strftime("%d.%m.(%X)")}#{"%5s" % severity}->#{progname}:..:#{msg}\n"
26
+ end
27
+ ActiveOrient::Base.logger = Rails.logger
28
+ ActiveOrient::OrientDB.logger = Rails.logger
29
+
30
+ if connectyml.present? and connectyml[:user].present? and connectyml[:pass].present?
31
+ ActiveOrient.default_server= { user: connectyml[:user], password: connectyml[:pass] ,
32
+ server: 'localhost', port: 2480 }
33
+ ActiveOrient.database = @configDatabase.presence || databaseyml[Rails.env.to_sym]
34
+
35
+ ORD = ActiveOrient::OrientDB.new preallocate: @do_not_preallocate.present? ? false : true
36
+ if RUBY_PLATFORM == 'java'
37
+ DB = ActiveOrient::API.new preallocate: false
38
+ else
39
+ DB = ORD
40
+ end
41
+ # ActiveOrient::Init.vertex_and_edge_class
42
+
43
+ ORD.create_classes 'E', 'V'
44
+ E.ref_name = 'E'
45
+ V.ref_name = 'V'
46
+ else
47
+ logger = Logger.new('/dev/stdout')
48
+ logger.error{ "config/connectyml is misconfigurated" }
49
+ logger.error{ "Database Server is NOT available"}
50
+ end
51
+
52
+
53
+
@@ -4,5 +4,7 @@
4
4
  ## :object => No Prefix
5
5
  ## :active_orient => ActiveOrient::{name}
6
6
  :namespace: :object
7
- :model_dir: 'model'
7
+ ## model_dir: Path to model-files relative to the root of the application
8
+ ## ie. app/model or model
9
+ :model_dir: 'lib/orient'
8
10
 
@@ -4,8 +4,8 @@
4
4
  :port: 2480
5
5
  :logger: stdout # 'file' or 'stdout'
6
6
  :database:
7
- :development: time_production
8
- :production: time_dev
7
+ :development: GratefulDeadConcerts
8
+ :production: hcn_data
9
9
  :test: tempera
10
10
  :admin:
11
11
  :user: hctw
@@ -1,7 +1,7 @@
1
1
  ## Usecase
2
2
  Below some typical features are summarized by example
3
3
 
4
- Initialize ActiveOrient by calling »bin/actibe-orient-console t«.
4
+ Initialize ActiveOrient by calling »bin/active-orient-console t«.
5
5
  This connects to the Test-Database.
6
6
 
7
7
  ```ruby
@@ -57,3 +57,5 @@ Attibutes/properties of the Database-Record can be handled as normal ruby objec
57
57
  ```
58
58
 
59
59
  ## Inherence
60
+
61
+ ( to be continued )
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active-orient
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.5'
4
+ version: '0.6'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hartmut Bischoff
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-01 00:00:00.000000000 Z
11
+ date: 2017-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -42,30 +42,30 @@ dependencies:
42
42
  name: activesupport
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '4.2'
47
+ version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '4.2'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: activemodel
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '4.2'
61
+ version: '0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '4.2'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rest-client
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -80,7 +80,7 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
- description: Persistent ORM for OrientDB, based on ActiveModel
83
+ description: Persistent ORM for OrientDB(V.2.2), based on ActiveModel. Rails 5 compatible
84
84
  email:
85
85
  - topofocus@gmail.com
86
86
  executables: []
@@ -101,36 +101,14 @@ files:
101
101
  - config/connect.yml
102
102
  - create_project
103
103
  - examples/books.rb
104
- - examples/createTime.rb
105
104
  - examples/streets.rb
106
105
  - examples/test_commands.rb
107
106
  - examples/test_commands_2.rb
108
107
  - examples/test_commands_2.rb~
109
108
  - examples/test_commands_3.rb
110
109
  - examples/test_commands_4.rb
111
- - examples/time_graph/Gemfile
112
- - examples/time_graph/Guardfile
113
- - examples/time_graph/README.md
114
- - examples/time_graph/bin/active-orient-console
115
- - examples/time_graph/config/boot.rb
116
- - examples/time_graph/config/config.yml
117
- - examples/time_graph/config/connect.yml
118
- - examples/time_graph/config/init_db.rb
119
- - examples/time_graph/createTime.rb
120
- - examples/time_graph/lib/createTime.rb
121
- - examples/time_graph/model/day_of.rb
122
- - examples/time_graph/model/e.rb
123
- - examples/time_graph/model/edge.rb
124
- - examples/time_graph/model/monat.rb
125
- - examples/time_graph/model/stunde.rb
126
- - examples/time_graph/model/tag.rb
127
- - examples/time_graph/model/time_base.rb
128
- - examples/time_graph/model/time_of.rb
129
- - examples/time_graph/model/v.rb
130
- - examples/time_graph/model/vertex.rb
131
- - examples/time_graph/spec/lib/create_time_spec.rb
132
- - examples/time_graph/spec/rest_helper.rb
133
- - examples/time_graph/spec/spec_helper.rb
110
+ - examples/time_graph.md
111
+ - gratefuldeadconcerts.md
134
112
  - lib/active-orient.rb
135
113
  - lib/base.rb
136
114
  - lib/base_properties.rb
@@ -156,8 +134,13 @@ files:
156
134
  - lib/rest/rest.rb
157
135
  - lib/rest_disabled.rb
158
136
  - lib/support.rb
137
+ - linkmap.md
138
+ - namespace.md
159
139
  - old_lib_functions/two_general_class.rb
160
- - usecase.md
140
+ - rails.md
141
+ - rails/activeorient.rb
142
+ - rails/config.yml
143
+ - rails/connect.yml
161
144
  - usecase_oo.md
162
145
  homepage: https://github.com/topofocus/active-orient
163
146
  licenses:
@@ -179,8 +162,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
179
162
  version: '0'
180
163
  requirements: []
181
164
  rubyforge_project:
182
- rubygems_version: 2.4.6
165
+ rubygems_version: 2.6.8
183
166
  signing_key:
184
167
  specification_version: 4
185
- summary: Pure ruby client for OrientDB based on ActiveModel
168
+ summary: Pure ruby client for OrientDB(V.2.2) based on ActiveModel
186
169
  test_files: []