rails_age 0.5.2 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -7
- data/README.md +108 -57
- data/config/initializers/types.rb +20 -0
- data/lib/apache_age/edge.rb +5 -0
- data/lib/apache_age/entities/common_methods.rb +6 -0
- data/lib/apache_age/entities/edge.rb +4 -3
- data/lib/apache_age/entities/node.rb +53 -0
- data/lib/apache_age/entities/vertex.rb +1 -1
- data/lib/apache_age/node.rb +36 -0
- data/lib/apache_age/types/age_type_factory.rb +46 -0
- data/lib/apache_age/validators/expected_node_type.rb +17 -0
- data/lib/apache_age/validators/unique_node.rb +32 -0
- data/lib/apache_age/validators/{vertex_type_validator.rb → vertex_type_validator copy.rb } +2 -1
- data/lib/generators/apache_age/edge/templates/edge.rb.tt +3 -3
- data/lib/generators/apache_age/generator_entity_helpers.rb +5 -2
- data/lib/generators/apache_age/scaffold_edge/USAGE +16 -0
- data/lib/generators/apache_age/scaffold_edge/scaffold_edge_generator.rb +67 -0
- data/lib/generators/apache_age/scaffold_edge/scaffold_node_generator.rb +67 -0
- data/lib/generators/apache_age/scaffold_edge/templates/controller.rb.tt +50 -0
- data/lib/generators/apache_age/{scaffold_node/templates/views/_form.html.erb copy.tt → scaffold_edge/templates/views/_form.html.erb.tt} +10 -0
- data/lib/generators/apache_age/{scaffold_node/templates/views/index.html.erb copy.tt → scaffold_edge/templates/views/index.html.erb.tt} +1 -1
- data/lib/generators/apache_age/{scaffold_node/templates/views/partial.html.erb copy.tt → scaffold_edge/templates/views/partial.html.erb.tt} +11 -2
- data/lib/generators/apache_age/{scaffold_node/templates/views/show.html.erb copy.tt → scaffold_edge/templates/views/show.html.erb.tt} +1 -1
- data/lib/generators/apache_age/scaffold_node/scaffold_node_generator.rb +19 -20
- data/lib/rails_age/version.rb +1 -1
- data/lib/rails_age.rb +7 -1
- data/lib/tasks/config_types.rake +4 -4
- metadata +49 -10
- /data/lib/generators/apache_age/{scaffold_node/templates/views/edit.html.erb copy.tt → scaffold_edge/templates/views/edit.html.erb.tt} +0 -0
- /data/lib/generators/apache_age/{scaffold_node/templates/views/new.html.erb copy.tt → scaffold_edge/templates/views/new.html.erb.tt} +0 -0
- /data/lib/generators/apache_age/scaffold_node/templates/{node_controller.rb.tt → controller.rb.tt} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd10883497fc245765a9e8313265e4d06c7a602a2f83cad592ecb5a951ab488d
|
4
|
+
data.tar.gz: ce03c6dc4535e2a54dddc9f2b9df8e4b413c6aeb690ee00138c4120fe1d72ce1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dcb00b35abd3a931c95ffce304c079eee2d1ba1b09ee3aa17f9c9150f4bc3b55276e7670cf3925e4ae484a117bef66bddc0242efc0cbc8295da03538ae628805
|
7
|
+
data.tar.gz: d6ac9aaa1ba0b04c9a48ed320e53a4de65a74e6cb6574f42c407b0c1124fafc650def68df4c41beaad27607b6f1fa22a7962518108c2fc39cd7c0e95f76d8c09
|
data/CHANGELOG.md
CHANGED
@@ -20,24 +20,34 @@ breaking change?: namespaces (by default) will use their own schema? (add to dat
|
|
20
20
|
|
21
21
|
- **multiple AGE Schema**
|
22
22
|
|
23
|
-
## VERSION 0.5.
|
23
|
+
## VERSION 0.5.4 - 2024-xx-xx
|
24
24
|
|
25
|
-
- **
|
26
|
-
*
|
27
|
-
|
28
|
-
## VERSION 0.5.2 - 2024-xx-xx
|
25
|
+
- **Fix**
|
26
|
+
* show validation errors in scaffold views
|
29
27
|
|
30
28
|
- **Edge Generator**
|
31
29
|
* add start-/end-nodes types to edge generator (would make scaffold easier), ie:
|
32
30
|
`rails generate apache_age:edge HasPet owner_role start_node:person end_node:pet`
|
33
31
|
with property and specified start-/end-nodes (person and pet nodes must have already been created)
|
34
32
|
|
33
|
+
- **Edge Scaffold** (generates edge, type, view and controller)
|
34
|
+
* add `rails generate apache_age:edge_scaffold HasJob employee_role start_node:person end_node:company`
|
35
|
+
|
36
|
+
## VERSION 0.5.3 - 2024-06-23
|
37
|
+
|
38
|
+
- **Edge Scaffold** (generates edge, type, view and controller) - without start-/end-nodes types!?
|
39
|
+
* add `rails generate apache_age:edge_scaffold HasJob employee_role`
|
40
|
+
* add system test (to dummy app after scaffold_node is run)
|
41
|
+
|
42
|
+
- **Node Scaffold** (generates node, type, view and controller)
|
43
|
+
* add system test (to dummy app after scaffold_node is run)
|
44
|
+
|
35
45
|
## VERSION 0.5.2 - 2024-06-16
|
36
46
|
|
37
47
|
- **Node Scaffold** (generates node, type, view and controller)
|
38
48
|
* add `rails generate apache_age:node_scaffold Person first_name last_name age:integer`
|
39
49
|
|
40
|
-
## VERSION 0.5.1 - 2024-06-16
|
50
|
+
## VERSION 0.5.1 - 2024-06-16 (yanked)
|
41
51
|
|
42
52
|
**yanked** (2024-06-16) - had an issue with the generator
|
43
53
|
|
@@ -50,7 +60,7 @@ breaking change?: namespaces (by default) will use their own schema? (add to dat
|
|
50
60
|
|
51
61
|
- **Edge Generator**
|
52
62
|
* add `rails generate apache_age:edge HasPet owner_role`
|
53
|
-
caveate: start_node and end_node are of type `:
|
63
|
+
caveate: start_node and end_node are of type `:node` in the generator but can be changed manually in the class file - having trouble with the generator loading the types (the generator rejects custom types - but rails still works with custom types)
|
54
64
|
|
55
65
|
## VERSION 0.4.1 - 2024-06-15
|
56
66
|
|
data/README.md
CHANGED
@@ -1,25 +1,76 @@
|
|
1
1
|
# RailsAge
|
2
2
|
|
3
|
-
|
3
|
+
Apache Age integration within a Rails application.
|
4
4
|
|
5
|
-
##
|
5
|
+
## Quick Start - Essentials
|
6
6
|
|
7
7
|
**NOTE:** you must be using Postgres as your database! Apache Age requires it.
|
8
8
|
|
9
|
-
|
9
|
+
```bash
|
10
|
+
bundle add rails_age
|
11
|
+
bundle install
|
12
|
+
bin/rails apache_age:install
|
13
|
+
# optional: prevents `bin/rails db:migrate` from modifying the schema file,
|
14
|
+
# bin/rails apache_age:override_db_migrate
|
15
|
+
git add .
|
16
|
+
git commit -m "Add & configure Apache Age within Rails"
|
17
|
+
```
|
18
|
+
|
19
|
+
## Generators
|
20
|
+
|
21
|
+
**NODES**
|
22
|
+
|
23
|
+
```bash
|
24
|
+
rails generate apache_age:scaffold_node Company company_name
|
25
|
+
|
26
|
+
rails generate apache_age:scaffold_node Person first_name last_name
|
27
|
+
```
|
28
|
+
|
29
|
+
**EDGES**
|
10
30
|
|
31
|
+
```bash
|
32
|
+
rails generate apache_age:scaffold_edge HasJob employee_role start_date:date
|
33
|
+
```
|
34
|
+
|
35
|
+
Ideally, edit the HasJob class so that `start_node` would use a type `:person` and the `end_node` uses at type `:company`
|
36
|
+
|
37
|
+
ie:
|
11
38
|
```ruby
|
12
|
-
|
39
|
+
# app/edges/has_job.rb
|
40
|
+
class HasJob
|
41
|
+
include ApacheAge::Entities::Edge
|
42
|
+
|
43
|
+
attribute :employee_role, :string
|
44
|
+
attribute :start_node, :person # instead of `:node`
|
45
|
+
attribute :end_node, :company # instead of `:node`
|
46
|
+
|
47
|
+
validates :employee_role, presence: true
|
48
|
+
validate :validate_unique_edge
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def validate_unique_edge
|
53
|
+
ApacheAge::Validators::UniqueEdge
|
54
|
+
.new(attributes: %i[employee_role start_node end_node])
|
55
|
+
.validate(self)
|
56
|
+
end
|
57
|
+
end
|
13
58
|
```
|
14
59
|
|
15
|
-
##
|
60
|
+
## Installation in Detail
|
16
61
|
|
17
62
|
using the installer, creates the migration to install age, runs the migration, and adjusts the schema file, and updates the `config/database.yml` file.
|
18
63
|
|
19
|
-
|
20
|
-
|
64
|
+
### Install Apache Age
|
65
|
+
|
66
|
+
see: [Apache AGE Installation](https://age.apache.org/age-manual/master/intro/setup.html#installation)
|
67
|
+
(The docker install is probably the easiest way to get started with a new application - for existing applications you may need to compile the extension from source.)
|
68
|
+
|
69
|
+
Verify your PostgreSQL AGE with the following commands:
|
70
|
+
|
21
71
|
```bash
|
22
|
-
psql -h localhost -p 5455 -U docker_username
|
72
|
+
$ psql -h localhost -p 5455 -U docker_username
|
73
|
+
|
23
74
|
> CREATE EXTENSION IF NOT EXISTS age;
|
24
75
|
> LOAD 'age';
|
25
76
|
> SET search_path = ag_catalog, "$user", public;
|
@@ -27,7 +78,12 @@ psql -h localhost -p 5455 -U docker_username
|
|
27
78
|
> \q
|
28
79
|
```
|
29
80
|
|
81
|
+
### Install and Configure Rails (if not done already)
|
82
|
+
|
83
|
+
AGE REQUIRES POSTGRESQL!
|
84
|
+
|
30
85
|
create a new Rails app (WITH POSTGRESQL!)
|
86
|
+
|
31
87
|
```bash
|
32
88
|
rails new age_demo -d postgresql
|
33
89
|
cd age_demo
|
@@ -35,6 +91,7 @@ git add .
|
|
35
91
|
git commit -m "Initial Rails App"
|
36
92
|
```
|
37
93
|
configure `config/database.yml` when using the docker version of AGE DB my config looks like:
|
94
|
+
|
38
95
|
```yaml
|
39
96
|
port: 5455
|
40
97
|
host: localhost
|
@@ -42,15 +99,19 @@ username: docker_username
|
|
42
99
|
password: dockerized_password
|
43
100
|
```
|
44
101
|
|
45
|
-
|
102
|
+
If both the Rails DB config and AGE DB are correctly configured, you should be able to run the following command without error:
|
103
|
+
|
46
104
|
```bash
|
47
105
|
rails db:create
|
48
106
|
rails db:migrate
|
49
107
|
git add .
|
50
|
-
git commit -m "
|
108
|
+
git commit -m "Basic Rails Configuration"
|
51
109
|
```
|
52
110
|
|
53
|
-
install Apache Age
|
111
|
+
### install Apache Age Plugin
|
112
|
+
|
113
|
+
NOTE: _ignore the `unknown OID` warnings_
|
114
|
+
|
54
115
|
```bash
|
55
116
|
bundle add rails_age
|
56
117
|
bundle install
|
@@ -62,62 +123,52 @@ git add .
|
|
62
123
|
git commit -m "Add & configure Apache Age within Rails"
|
63
124
|
```
|
64
125
|
|
65
|
-
|
126
|
+
### Optional Migration override (OPTIONAL)
|
127
|
+
|
128
|
+
run `bin/rails apache_age:override_db_migrate` to ensure that running `rails db:migrate` does not inappropriately modify the schema file.
|
129
|
+
|
130
|
+
However, if you are familiar with the schema file and git then you can safely ignore this step and manage the changes after a migration manually - only submitting changes directly related to the newest migration and not those related AGE.
|
131
|
+
|
132
|
+
**NOTE:**
|
133
|
+
* **You can run `bin/rails apache_age:config_schema` at any time to repair the schema file as needed.**
|
134
|
+
( **You can run `bin/rails apache_age:install` at any time to repair any AGE related config file**
|
135
|
+
|
136
|
+
If you are using `db/structure.sql` you will need to manually configure Apache Age (RailsAge).
|
137
|
+
|
138
|
+
### NODE Scaffold Generation
|
139
|
+
|
66
140
|
```bash
|
67
|
-
rails generate apache_age:
|
68
|
-
|
69
|
-
|
141
|
+
rails generate apache_age:scaffold_node Company company_name:string
|
142
|
+
|
143
|
+
# string is the default type (so it can be omitted)
|
144
|
+
rails generate apache_age:scaffold_node Person first_name last_name
|
145
|
+
|
146
|
+
# with a namespace
|
147
|
+
rails generate apache_age:scaffold_node Animals/Pet pet_name birthdate:date
|
70
148
|
```
|
71
|
-
|
149
|
+
|
150
|
+
### EDGE Scaffold Generation**
|
151
|
+
|
152
|
+
NOTE: the generator will only allow `:node` (default type) for start_node and end_node, however, it is strongly recommended to specify the start_node and end_node types manually. _Hopefully, I can find a way to get the generators to recognize and allow the usage of custom node types. Thus eventually, I hope: `rails generate apache_age:node HasPet start_node:person end_node:pet caretaker_role` will work._
|
153
|
+
|
72
154
|
```bash
|
73
|
-
# when start node and end node are not specified they are of type `:vertex`
|
74
|
-
# this is generally not recommended - exept when very generic relationships are needed
|
75
155
|
rails generate apache_age:edge HasJob employee_role begin_date:date
|
76
|
-
|
77
|
-
# # this is recommended - (but not yet working) add explicit start_node and end_node types manually
|
78
|
-
# rails generate apache_age:node HasPet start_node:person end_node:pet caretaker_role
|
79
156
|
```
|
80
157
|
|
81
|
-
|
82
|
-
|
83
|
-
For now, if you are using `db/structure.sql` you will need to manually configure Apache Age (RailsAge) as described below.
|
158
|
+
_edge scaffold is coming soon._
|
84
159
|
|
85
|
-
|
160
|
+
```bash
|
161
|
+
# without a namespace
|
162
|
+
rails generate apache_age:scaffold_edge HasPet caretaker_role
|
86
163
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
fred = Person.new(first_name: 'Fredrick Jay', last_name: 'Flintstone')
|
91
|
-
fred.valid?
|
92
|
-
fred.save
|
93
|
-
fred.to_h # should have an ID
|
94
|
-
|
95
|
-
# fails because of a missing required field (Property)
|
96
|
-
incomplete = Person.new(first_name: 'Fredrick Jay')
|
97
|
-
incomplete.valid?
|
98
|
-
incomplete.errors
|
99
|
-
incomplete.to_h
|
100
|
-
|
101
|
-
# fails because of uniqueness constraints
|
102
|
-
jay = Person.create(first_name: 'Fredrick Jay', last_name: 'Flintstone')
|
103
|
-
jay.to_h
|
104
|
-
=> {:id=>nil, :first_name=>"Fredrick Jay", :last_name=>"Flintstone"}
|
105
|
-
jay.valid?
|
106
|
-
=> false
|
107
|
-
jay.errors
|
108
|
-
=> #<ActiveModel::Errors [#<ActiveModel::Error attribute=base, type=record not unique, options={}>, #<ActiveModel::Error attribute=first_name, type=property combination not unique, options={}>, #<ActiveModel::Error attribute=last_name, type=property combination not unique, options={}>]>
|
109
|
-
irb(main):008> jav.to_h
|
110
|
-
=> {:id=>nil, :first_name=>"Fredrick Jay", :last_name=>"Flintstone"}
|
111
|
-
|
112
|
-
# .create is a shortcut for .new and .save
|
113
|
-
quarry = Company.create(company_name: 'Bedrock Quarry')
|
114
|
-
quarry.to_h # should have an ID
|
115
|
-
|
116
|
-
# create an edge (no generator yet)
|
117
|
-
job = HasJob.create(start_node: fred, end_node: quarry, employee_role: 'Crane Operator')
|
118
|
-
job.to_h # should have an ID
|
164
|
+
# with a namespace
|
165
|
+
rails generate apache_age:scaffold_edge People/HasSpouse spousal_role
|
119
166
|
```
|
120
167
|
|
168
|
+
### AGE Usage within Rails Console
|
169
|
+
|
170
|
+
see [AGE Usage within Rails Console](AGE_CONSOLE_USAGE.md)
|
171
|
+
|
121
172
|
## Manual Install, Config and Usage
|
122
173
|
|
123
174
|
see [Manuel Installation, Configuration and Usage](MANUAL_INSTALL.md)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# config/initializers/types.rb
|
2
|
+
|
3
|
+
require 'apache_age/types/age_type_factory'
|
4
|
+
# USAGE (with edges or nodes) - ie:
|
5
|
+
# require_dependency 'nodes/company'
|
6
|
+
# ActiveModel::Type.register(
|
7
|
+
# :company, ApacheAge::Types::AgeTypeFactory.create_type_for(Nodes::Company)
|
8
|
+
# )
|
9
|
+
|
10
|
+
Rails.application.config.to_prepare do
|
11
|
+
# Register AGE types
|
12
|
+
require_dependency 'apache_age/node'
|
13
|
+
ActiveModel::Type.register(
|
14
|
+
:node, ApacheAge::Types::AgeTypeFactory.create_type_for(ApacheAge::Node)
|
15
|
+
)
|
16
|
+
require_dependency 'apache_age/edge'
|
17
|
+
ActiveModel::Type.register(
|
18
|
+
:edge, ApacheAge::Types::AgeTypeFactory.create_type_for(ApacheAge::Edge)
|
19
|
+
)
|
20
|
+
end
|
@@ -7,6 +7,12 @@ module ApacheAge
|
|
7
7
|
def persisted? = id.present?
|
8
8
|
def to_s = ":#{age_label} #{properties_to_s}"
|
9
9
|
|
10
|
+
# default display value
|
11
|
+
def display
|
12
|
+
info = age_properties&.values&.first
|
13
|
+
info.blank? ? "#{age_label} (#{id})" : "#{info} (#{age_label})"
|
14
|
+
end
|
15
|
+
|
10
16
|
def to_h
|
11
17
|
base_h = attributes.to_hash
|
12
18
|
if age_type == 'edge'
|
@@ -9,11 +9,12 @@ module ApacheAge
|
|
9
9
|
include ActiveModel::Attributes
|
10
10
|
|
11
11
|
attribute :id, :integer
|
12
|
+
# attribute :label, :string
|
12
13
|
attribute :end_id, :integer
|
13
14
|
attribute :start_id, :integer
|
14
|
-
#
|
15
|
-
attribute :end_node
|
16
|
-
attribute :start_node
|
15
|
+
# override with a specific node type in the defining class
|
16
|
+
attribute :end_node
|
17
|
+
attribute :start_node
|
17
18
|
|
18
19
|
validates :end_node, :start_node, presence: true
|
19
20
|
validate :validate_nodes
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module ApacheAge
|
2
|
+
module Entities
|
3
|
+
module Vertex
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
include ActiveModel::Model
|
8
|
+
include ActiveModel::Dirty
|
9
|
+
include ActiveModel::Attributes
|
10
|
+
|
11
|
+
attribute :id, :integer
|
12
|
+
|
13
|
+
extend ApacheAge::Entities::ClassMethods
|
14
|
+
include ApacheAge::Entities::CommonMethods
|
15
|
+
end
|
16
|
+
|
17
|
+
def age_type = 'vertex'
|
18
|
+
|
19
|
+
# AgeSchema::Nodes::Company.create(company_name: 'Bedrock Quarry')
|
20
|
+
# SELECT *
|
21
|
+
# FROM cypher('age_schema', $$
|
22
|
+
# CREATE (company:Company {company_name: 'Bedrock Quarry'})
|
23
|
+
# RETURN company
|
24
|
+
# $$) as (Company agtype);
|
25
|
+
def create_sql
|
26
|
+
alias_name = age_alias || age_label.downcase
|
27
|
+
<<-SQL
|
28
|
+
SELECT *
|
29
|
+
FROM cypher('#{age_graph}', $$
|
30
|
+
CREATE (#{alias_name}#{self})
|
31
|
+
RETURN #{alias_name}
|
32
|
+
$$) as (#{age_label} agtype);
|
33
|
+
SQL
|
34
|
+
end
|
35
|
+
|
36
|
+
# So far just properties of string type with '' around them
|
37
|
+
def update_sql
|
38
|
+
alias_name = age_alias || age_label.downcase
|
39
|
+
set_caluse =
|
40
|
+
age_properties.map { |k, v| v ? "#{alias_name}.#{k} = '#{v}'" : "#{alias_name}.#{k} = NULL" }.join(', ')
|
41
|
+
<<-SQL
|
42
|
+
SELECT *
|
43
|
+
FROM cypher('#{age_graph}', $$
|
44
|
+
MATCH (#{alias_name}:#{age_label})
|
45
|
+
WHERE id(#{alias_name}) = #{id}
|
46
|
+
SET #{set_caluse}
|
47
|
+
RETURN #{alias_name}
|
48
|
+
$$) as (#{age_label} agtype);
|
49
|
+
SQL
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module ApacheAge
|
2
|
+
class Node
|
3
|
+
include ApacheAge::Entities::Node
|
4
|
+
|
5
|
+
attribute :label, :string
|
6
|
+
attribute :properties
|
7
|
+
# attribute :properties, :hash
|
8
|
+
|
9
|
+
# def display = [label, properties&.values&.first].compact.join(' - ')
|
10
|
+
def display
|
11
|
+
info = properties&.values&.first
|
12
|
+
info.blank? ? "#{label} (#{id})" : "#{info} (#{label})"
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.all
|
16
|
+
all_nodes_sql = <<~SQL
|
17
|
+
SELECT *
|
18
|
+
FROM cypher('age_schema', $$
|
19
|
+
MATCH (node)
|
20
|
+
RETURN node
|
21
|
+
$$) as (node agtype);
|
22
|
+
SQL
|
23
|
+
age_results = ActiveRecord::Base.connection.execute(all_nodes_sql)
|
24
|
+
return [] if age_results.values.count.zero?
|
25
|
+
|
26
|
+
age_results.values.map do |result|
|
27
|
+
json_string = result.first.split('::').first
|
28
|
+
hash = JSON.parse(json_string)
|
29
|
+
attribs = hash.slice('id', 'label').symbolize_keys
|
30
|
+
attribs[:properties] = hash['properties'].symbolize_keys
|
31
|
+
|
32
|
+
new(**attribs)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# lib/apache_age/types/age_type_factory.rb
|
2
|
+
# Automatically generates ActiveModel::Type classes
|
3
|
+
# Dynamically builds this (as a concrete example):
|
4
|
+
# module ApacheAge
|
5
|
+
# module Types
|
6
|
+
# class CompanyType < ActiveModel::Type::Value
|
7
|
+
# def cast(value)
|
8
|
+
# case value
|
9
|
+
# when Nodes::Company
|
10
|
+
# value
|
11
|
+
# when Hash
|
12
|
+
# Nodes::Company.new(value)
|
13
|
+
# else
|
14
|
+
# nil
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
# def serialize(value)
|
18
|
+
# value.is_a?(Nodes::Company) ? value.attributes : nil
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
# end
|
23
|
+
module ApacheAge
|
24
|
+
module Types
|
25
|
+
class AgeTypeFactory
|
26
|
+
def self.create_type_for(klass)
|
27
|
+
Class.new(ActiveModel::Type::Value) do
|
28
|
+
define_method(:cast) do |value|
|
29
|
+
case value
|
30
|
+
when klass
|
31
|
+
value
|
32
|
+
when Hash
|
33
|
+
klass.new(value)
|
34
|
+
else
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
define_method(:serialize) do |value|
|
40
|
+
value.is_a?(klass) ? value.attributes : nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ApacheAge
|
2
|
+
module Validators
|
3
|
+
module ExpectedNodeType
|
4
|
+
def
|
5
|
+
# Register the AGE types vertex_attribute(attribute_name, type_symbol, klass)
|
6
|
+
attribute attribute_name, type_symbol
|
7
|
+
|
8
|
+
validate do
|
9
|
+
value = send(attribute_name)
|
10
|
+
unless value.is_a?(klass)
|
11
|
+
errors.add(attribute_name, "must be a #{klass.name}")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# lib/apache_age/validators/unique_node.rb
|
2
|
+
|
3
|
+
# Usage:
|
4
|
+
# validates_with(
|
5
|
+
# ApacheAge::Validators::UniqueNode,
|
6
|
+
# attributes: [:first_name, :last_name, :gender]
|
7
|
+
# )
|
8
|
+
|
9
|
+
module ApacheAge
|
10
|
+
module Validators
|
11
|
+
class UniqueNode < ActiveModel::Validator
|
12
|
+
def validate(record)
|
13
|
+
allowed_keys = record.age_properties.keys
|
14
|
+
attributes = options[:attributes]
|
15
|
+
return if attributes.blank?
|
16
|
+
|
17
|
+
record_attribs =
|
18
|
+
attributes
|
19
|
+
.map { |attr| [attr, record.send(attr)] }
|
20
|
+
.to_h.symbolize_keys
|
21
|
+
.slice(*allowed_keys)
|
22
|
+
query = record.class.find_by(record_attribs)
|
23
|
+
|
24
|
+
# if no match is found or if it finds itself, it's valid
|
25
|
+
return if query.blank? || (query.id == record.id)
|
26
|
+
|
27
|
+
record.errors.add(:base, 'record not unique')
|
28
|
+
attributes.each { record.errors.add(_1, 'property combination not unique') }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -4,10 +4,10 @@ class <%= class_name %>
|
|
4
4
|
<%- attributes_list.each do |attribute| -%>
|
5
5
|
attribute :<%= attribute[:name] %>, :<%= attribute[:reference] || attribute[:type] %>
|
6
6
|
<%- end -%>
|
7
|
-
# recommendation for (start_node and end_node): change `:
|
7
|
+
# recommendation for (start_node and end_node): change `:node` with the actual 'node' type
|
8
8
|
# see `config/initializers/apache_age.rb` for the list of available node types
|
9
|
-
attribute :start_node
|
10
|
-
attribute :end_node
|
9
|
+
attribute :start_node
|
10
|
+
attribute :end_node
|
11
11
|
|
12
12
|
<%- attributes_list.each do |attribute| -%>
|
13
13
|
validates :<%= attribute[:name] %>, presence: true
|
@@ -3,12 +3,15 @@
|
|
3
3
|
module ApacheAge
|
4
4
|
module GeneratorEntityHelpers
|
5
5
|
def generate_age_entity(age_type)
|
6
|
-
template
|
6
|
+
template(
|
7
|
+
"#{age_type}.rb.tt",
|
8
|
+
File.join(Rails.root, "app/#{age_type}s", class_path, "#{file_name}.rb")
|
9
|
+
)
|
7
10
|
add_type_config
|
8
11
|
end
|
9
12
|
|
10
13
|
def destroy_age_entity(age_type)
|
11
|
-
file_path = File.join(
|
14
|
+
file_path = File.join(Rails.root, "app/#{age_type}s", class_path, "#{file_name}.rb")
|
12
15
|
File.delete(file_path) if File.exist?(file_path)
|
13
16
|
remove_type_config
|
14
17
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Description:
|
2
|
+
Explain the generator
|
3
|
+
|
4
|
+
Example:
|
5
|
+
bin/rails generate apache_age:scaffold_edge HasPet careciver_role
|
6
|
+
|
7
|
+
This will create:
|
8
|
+
create app/edge/has_pet.rb
|
9
|
+
modified: config/initializers/types.rb
|
10
|
+
create app/controllers/has_pets_controller.rb
|
11
|
+
route resources :has_pets
|
12
|
+
create app/views/pets/index.html.erb
|
13
|
+
create app/views/pets/edit.html.erb
|
14
|
+
create app/views/pets/show.html.erb
|
15
|
+
create app/views/pets/new.html.erb
|
16
|
+
create app/views/pets/partial.html.erb
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# lib/generators/apache_age/scaffold_edge/scaffold_edge_generator.rb
|
2
|
+
|
3
|
+
require 'rails/generators'
|
4
|
+
require 'rails/generators/named_base'
|
5
|
+
require 'rails/generators/resource_helpers'
|
6
|
+
|
7
|
+
module ApacheAge
|
8
|
+
class ScaffoldEdgeGenerator < Rails::Generators::NamedBase
|
9
|
+
include Rails::Generators::ResourceHelpers
|
10
|
+
|
11
|
+
desc "Generates an edge, and its controller and views with the given attributes."
|
12
|
+
|
13
|
+
source_root File.expand_path("templates", __dir__)
|
14
|
+
|
15
|
+
argument :attributes, type: :array, default: [], banner: "field:type field:type"
|
16
|
+
|
17
|
+
def create_model_file
|
18
|
+
invoke 'apache_age:edge', [name] + attributes.collect { |attr| "#{attr.name}:#{attr.type}" }
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_controller_files
|
22
|
+
template(
|
23
|
+
"controller.rb.tt",
|
24
|
+
File.join(Rails.root, "app/controllers", controller_class_path, "#{controller_file_name}_controller.rb")
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
def create_route
|
29
|
+
route_content = route_text(class_path, file_name)
|
30
|
+
inject_into_file(
|
31
|
+
File.join(Rails.root, 'config', 'routes.rb'), "\n#{route_content}",
|
32
|
+
after: "Rails.application.routes.draw do"
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
def copy_view_files
|
37
|
+
available_views.each do |view|
|
38
|
+
view_name = view == 'partial' ? "_#{singular_table_name}" : view
|
39
|
+
filename = filename_with_extensions(view_name)
|
40
|
+
template(
|
41
|
+
"views/#{view}.html.erb.tt",
|
42
|
+
File.join(Rails.root, "app/views", controller_file_path, filename)
|
43
|
+
)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def available_views
|
50
|
+
%w[index edit show new partial _form]
|
51
|
+
end
|
52
|
+
|
53
|
+
def filename_with_extensions(view)
|
54
|
+
[view, :html, :erb].compact.join('.')
|
55
|
+
end
|
56
|
+
|
57
|
+
def route_text(class_path, file_name)
|
58
|
+
return " resources :#{file_name.pluralize}" if class_path.empty?
|
59
|
+
|
60
|
+
<<-RUBY
|
61
|
+
namespace :#{class_path.join(':')} do
|
62
|
+
resources :#{file_name.pluralize}
|
63
|
+
end
|
64
|
+
RUBY
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# lib/generators/apache_age/scaffold_node/scaffold_node_generator.rb
|
2
|
+
|
3
|
+
require 'rails/generators'
|
4
|
+
require 'rails/generators/named_base'
|
5
|
+
require 'rails/generators/resource_helpers'
|
6
|
+
|
7
|
+
module ApacheAge
|
8
|
+
class ScaffoldNodeGenerator < Rails::Generators::NamedBase
|
9
|
+
include Rails::Generators::ResourceHelpers
|
10
|
+
|
11
|
+
desc "Generates a node, and its controller and views with the given attributes."
|
12
|
+
|
13
|
+
source_root File.expand_path("templates", __dir__)
|
14
|
+
|
15
|
+
argument :attributes, type: :array, default: [], banner: "field:type field:type"
|
16
|
+
|
17
|
+
def create_model_file
|
18
|
+
invoke 'apache_age:edge', [name] + attributes.collect { |attr| "#{attr.name}:#{attr.type}" }
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_controller_files
|
22
|
+
template(
|
23
|
+
"controller.rb.tt",
|
24
|
+
File.join(Rails.root, "app/controllers", controller_class_path, "#{controller_file_name}_controller.rb")
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
def create_route
|
29
|
+
route_content = route_text(class_path, file_name)
|
30
|
+
inject_into_file(
|
31
|
+
File.join(Rails.root, 'config', 'routes.rb'), "\n#{route_content}",
|
32
|
+
after: "Rails.application.routes.draw do"
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
def copy_view_files
|
37
|
+
available_views.each do |view|
|
38
|
+
view_name = view == 'partial' ? "_#{singular_table_name}" : view
|
39
|
+
filename = filename_with_extensions(view_name)
|
40
|
+
template(
|
41
|
+
"views/#{view}.html.erb.tt",
|
42
|
+
File.join(Rails.root, "app/views", controller_file_path, filename)
|
43
|
+
)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def available_views
|
50
|
+
%w[index edit show new partial _form]
|
51
|
+
end
|
52
|
+
|
53
|
+
def filename_with_extensions(view)
|
54
|
+
[view, :html, :erb].compact.join('.')
|
55
|
+
end
|
56
|
+
|
57
|
+
def route_text(class_path, file_name)
|
58
|
+
return " resources :#{file_name.pluralize}" if class_path.empty?
|
59
|
+
|
60
|
+
<<-RUBY
|
61
|
+
namespace :#{class_path.join(':')} do
|
62
|
+
resources :#{file_name.pluralize}
|
63
|
+
end
|
64
|
+
RUBY
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class <%= controller_class_name %>Controller < ApplicationController
|
2
|
+
before_action :set_<%= singular_table_name %>, only: %i[show edit update destroy]
|
3
|
+
|
4
|
+
def index
|
5
|
+
@<%= plural_table_name %> = <%= class_name %>.all
|
6
|
+
end
|
7
|
+
|
8
|
+
def show
|
9
|
+
end
|
10
|
+
|
11
|
+
def new
|
12
|
+
@<%= singular_table_name %> = <%= class_name %>.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def edit
|
16
|
+
end
|
17
|
+
|
18
|
+
def create
|
19
|
+
@<%= singular_table_name %> = <%= class_name %>.new(<%= singular_table_name %>_params)
|
20
|
+
|
21
|
+
if @<%= singular_table_name %>.save
|
22
|
+
redirect_to @<%= singular_table_name %>, notice: '<%= human_name %> was successfully created.'
|
23
|
+
else
|
24
|
+
render :new
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def update
|
29
|
+
if @<%= singular_table_name %>.update(<%= singular_table_name %>_params)
|
30
|
+
redirect_to @<%= singular_table_name %>, notice: '<%= human_name %> was successfully updated.'
|
31
|
+
else
|
32
|
+
render :edit
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def destroy
|
37
|
+
@<%= singular_table_name %>.destroy
|
38
|
+
redirect_to <%= index_helper %>_url, notice: '<%= human_name %> was successfully destroyed.'
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def set_<%= singular_table_name %>
|
44
|
+
@<%= singular_table_name %> = <%= class_name %>.find(params[:id])
|
45
|
+
end
|
46
|
+
|
47
|
+
def <%= singular_table_name %>_params
|
48
|
+
params.require(:<%= singular_table_name %>).permit(<%= (attributes + %i[start_id end_id]).map { |attr| ":#{attr.name}" }.join(', ') %>)
|
49
|
+
end
|
50
|
+
end
|
@@ -31,6 +31,16 @@
|
|
31
31
|
</div>
|
32
32
|
|
33
33
|
<% end -%>
|
34
|
+
<div>
|
35
|
+
<%%= form.label :start_node, style: "display: block" %>
|
36
|
+
<%%= form.collection_select(:start_id, ApacheAge::Node.all, :id, :display, prompt: 'Select a Start-Node') %>
|
37
|
+
</div>
|
38
|
+
|
39
|
+
<div>
|
40
|
+
<%%= form.label :end_node, style: "display: block" %>
|
41
|
+
<%%= form.collection_select(:end_id, ApacheAge::Node.all, :id, :display, prompt: 'Select an End-Node') %>
|
42
|
+
</div>
|
43
|
+
|
34
44
|
<div>
|
35
45
|
<%%= form.submit %>
|
36
46
|
</div>
|
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
<div id="<%= plural_table_name %>">
|
8
8
|
<%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
|
9
|
-
<%%= render <%= singular_table_name %> %>
|
9
|
+
<%%= render '<%= singular_table_name %>', <%= singular_table_name %>: <%= singular_table_name %> %>
|
10
10
|
<p>
|
11
11
|
<%%= link_to "Show this <%= human_name.downcase %>", <%= model_resource_name(singular_table_name) %> %>
|
12
12
|
</p>
|
@@ -5,8 +5,8 @@
|
|
5
5
|
<% if attribute.attachment? -%>
|
6
6
|
<%%= link_to <%= singular_table_name %>.<%= attribute.column_name %>.filename, <%= singular_table_name %>.<%= attribute.column_name %> if <%= singular_table_name %>.<%= attribute.column_name %>.attached? %>
|
7
7
|
<% elsif attribute.attachments? -%>
|
8
|
-
<%% <%= singular_table_name %>.<%= attribute.column_name %>.each do |<%= attribute.
|
9
|
-
<div><%%= link_to <%= attribute.
|
8
|
+
<%% <%= singular_table_name %>.<%= attribute.column_name %>.each do |<%= attribute.singular_name %>| %>
|
9
|
+
<div><%%= link_to <%= attribute.singular_name %>.filename, <%= attribute.singular_name %> %></div>
|
10
10
|
<%% end %>
|
11
11
|
<% else -%>
|
12
12
|
<%%= <%= singular_table_name %>.<%= attribute.column_name %> %>
|
@@ -14,4 +14,13 @@
|
|
14
14
|
</p>
|
15
15
|
|
16
16
|
<% end -%>
|
17
|
+
<p>
|
18
|
+
<strong>Start-Node:</strong>
|
19
|
+
<%%= <%= singular_table_name %>.start_node.display %>
|
20
|
+
</p>
|
21
|
+
|
22
|
+
<p>
|
23
|
+
<strong>End-Node:</strong>
|
24
|
+
<%%= <%= singular_table_name %>.end_node.display %>
|
25
|
+
</p>
|
17
26
|
</div>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<p style="color: green"><%%= notice %></p>
|
2
2
|
|
3
|
-
<%%= render @<%= singular_table_name %> %>
|
3
|
+
<%%= render '<%= singular_table_name %>', <%= singular_table_name %>: @<%= singular_table_name %> %>
|
4
4
|
|
5
5
|
<div>
|
6
6
|
<%%= link_to "Edit this <%= human_name.downcase %>", <%= edit_helper(type: :path) %> %> |
|
@@ -4,14 +4,9 @@ require 'rails/generators'
|
|
4
4
|
require 'rails/generators/named_base'
|
5
5
|
require 'rails/generators/resource_helpers'
|
6
6
|
|
7
|
-
require_relative '../generator_entity_helpers'
|
8
|
-
require_relative '../generator_resource_helpers'
|
9
|
-
|
10
7
|
module ApacheAge
|
11
8
|
class ScaffoldNodeGenerator < Rails::Generators::NamedBase
|
12
9
|
include Rails::Generators::ResourceHelpers
|
13
|
-
# include ApacheAge::GeneratorEntityHelpers
|
14
|
-
# include ApacheAge::GeneratorResourceHelpers
|
15
10
|
|
16
11
|
desc "Generates a node, and its controller and views with the given attributes."
|
17
12
|
|
@@ -25,24 +20,27 @@ module ApacheAge
|
|
25
20
|
|
26
21
|
def create_controller_files
|
27
22
|
template(
|
28
|
-
"
|
29
|
-
File.join("app/controllers", controller_class_path, "#{controller_file_name}_controller.rb")
|
23
|
+
"controller.rb.tt",
|
24
|
+
File.join(Rails.root, "app/controllers", controller_class_path, "#{controller_file_name}_controller.rb")
|
30
25
|
)
|
31
26
|
end
|
32
27
|
|
33
28
|
def create_route
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
29
|
+
route_content = route_text(class_path, file_name)
|
30
|
+
inject_into_file(
|
31
|
+
File.join(Rails.root, 'config', 'routes.rb'), "\n#{route_content}",
|
32
|
+
after: "Rails.application.routes.draw do"
|
33
|
+
)
|
39
34
|
end
|
40
35
|
|
41
36
|
def copy_view_files
|
42
37
|
available_views.each do |view|
|
43
38
|
view_name = view == 'partial' ? "_#{singular_table_name}" : view
|
44
39
|
filename = filename_with_extensions(view_name)
|
45
|
-
template
|
40
|
+
template(
|
41
|
+
"views/#{view}.html.erb.tt",
|
42
|
+
File.join(Rails.root, "app/views", controller_file_path, filename)
|
43
|
+
)
|
46
44
|
end
|
47
45
|
end
|
48
46
|
|
@@ -56,13 +54,14 @@ module ApacheAge
|
|
56
54
|
[view, :html, :erb].compact.join('.')
|
57
55
|
end
|
58
56
|
|
59
|
-
def
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
57
|
+
def route_text(class_path, file_name)
|
58
|
+
return " resources :#{file_name.pluralize}" if class_path.empty?
|
59
|
+
|
60
|
+
<<-RUBY
|
61
|
+
namespace :#{class_path.join(':')} do
|
62
|
+
resources :#{file_name.pluralize}
|
63
|
+
end
|
64
|
+
RUBY
|
66
65
|
end
|
67
66
|
end
|
68
67
|
end
|
data/lib/rails_age/version.rb
CHANGED
data/lib/rails_age.rb
CHANGED
@@ -8,10 +8,16 @@ end
|
|
8
8
|
module ApacheAge
|
9
9
|
require 'apache_age/entities/class_methods'
|
10
10
|
require 'apache_age/entities/common_methods'
|
11
|
-
require 'apache_age/entities/edge'
|
12
11
|
require 'apache_age/entities/entity'
|
13
12
|
require 'apache_age/entities/vertex'
|
13
|
+
require 'apache_age/entities/node'
|
14
|
+
require 'apache_age/entities/edge'
|
15
|
+
require 'apache_age/node'
|
16
|
+
require 'apache_age/edge'
|
17
|
+
require 'apache_age/validators/expected_node_type'
|
18
|
+
require 'apache_age/validators/unique_node'
|
14
19
|
require 'apache_age/validators/unique_edge'
|
15
20
|
require 'apache_age/validators/unique_vertex'
|
21
|
+
require 'apache_age/types/age_type_factory'
|
16
22
|
require 'apache_age/types/age_type_generator'
|
17
23
|
end
|
data/lib/tasks/config_types.rake
CHANGED
@@ -17,16 +17,16 @@ namespace :apache_age do
|
|
17
17
|
RUBY
|
18
18
|
node_type_content =
|
19
19
|
<<-RUBY
|
20
|
-
require_dependency 'apache_age/
|
20
|
+
require_dependency 'apache_age/node'
|
21
21
|
ActiveModel::Type.register(
|
22
|
-
:
|
22
|
+
:node, ApacheAge::Types::AgeTypeGenerator.create_type_for(ApacheAge::Node)
|
23
23
|
)
|
24
24
|
RUBY
|
25
25
|
edge_type_content =
|
26
26
|
<<-RUBY
|
27
|
-
require_dependency 'apache_age/
|
27
|
+
require_dependency 'apache_age/edge'
|
28
28
|
ActiveModel::Type.register(
|
29
|
-
:edge, ApacheAge::Types::AgeTypeGenerator.create_type_for(ApacheAge::
|
29
|
+
:edge, ApacheAge::Types::AgeTypeGenerator.create_type_for(ApacheAge::Edge)
|
30
30
|
)
|
31
31
|
RUBY
|
32
32
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_age
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bill Tihen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-06-
|
11
|
+
date: 2024-06-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -44,6 +44,34 @@ dependencies:
|
|
44
44
|
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '6.0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: capybara
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '3.4'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '3.4'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: selenium-webdriver
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
47
75
|
description: This plugin integrates Apache AGE for PostgreSQL with Rails 7.x, providing
|
48
76
|
tools and helpers for working with graph databases within a Rails application.
|
49
77
|
email:
|
@@ -64,18 +92,25 @@ files:
|
|
64
92
|
- app/mailers/rails_age/application_mailer.rb
|
65
93
|
- app/models/rails_age/application_record.rb
|
66
94
|
- app/views/layouts/rails_age/application.html.erb
|
95
|
+
- config/initializers/types.rb
|
67
96
|
- config/routes.rb
|
68
97
|
- db/migrate/20240521062349_add_apache_age.rb
|
69
98
|
- db/schema.rb
|
99
|
+
- lib/apache_age/edge.rb
|
70
100
|
- lib/apache_age/entities/class_methods.rb
|
71
101
|
- lib/apache_age/entities/common_methods.rb
|
72
102
|
- lib/apache_age/entities/edge.rb
|
73
103
|
- lib/apache_age/entities/entity.rb
|
104
|
+
- lib/apache_age/entities/node.rb
|
74
105
|
- lib/apache_age/entities/vertex.rb
|
106
|
+
- lib/apache_age/node.rb
|
107
|
+
- lib/apache_age/types/age_type_factory.rb
|
75
108
|
- lib/apache_age/types/age_type_generator.rb
|
109
|
+
- lib/apache_age/validators/expected_node_type.rb
|
76
110
|
- lib/apache_age/validators/unique_edge.rb
|
111
|
+
- lib/apache_age/validators/unique_node.rb
|
77
112
|
- lib/apache_age/validators/unique_vertex.rb
|
78
|
-
- lib/apache_age/validators/vertex_type_validator.rb
|
113
|
+
- lib/apache_age/validators/vertex_type_validator copy.rb
|
79
114
|
- lib/generators/apache_age/edge/USAGE
|
80
115
|
- lib/generators/apache_age/edge/edge_generator.rb
|
81
116
|
- lib/generators/apache_age/edge/templates/edge.rb.tt
|
@@ -84,20 +119,24 @@ files:
|
|
84
119
|
- lib/generators/apache_age/node/USAGE
|
85
120
|
- lib/generators/apache_age/node/node_generator.rb
|
86
121
|
- lib/generators/apache_age/node/templates/node.rb.tt
|
122
|
+
- lib/generators/apache_age/scaffold_edge/USAGE
|
123
|
+
- lib/generators/apache_age/scaffold_edge/scaffold_edge_generator.rb
|
124
|
+
- lib/generators/apache_age/scaffold_edge/scaffold_node_generator.rb
|
125
|
+
- lib/generators/apache_age/scaffold_edge/templates/controller.rb.tt
|
126
|
+
- lib/generators/apache_age/scaffold_edge/templates/views/_form.html.erb.tt
|
127
|
+
- lib/generators/apache_age/scaffold_edge/templates/views/edit.html.erb.tt
|
128
|
+
- lib/generators/apache_age/scaffold_edge/templates/views/index.html.erb.tt
|
129
|
+
- lib/generators/apache_age/scaffold_edge/templates/views/new.html.erb.tt
|
130
|
+
- lib/generators/apache_age/scaffold_edge/templates/views/partial.html.erb.tt
|
131
|
+
- lib/generators/apache_age/scaffold_edge/templates/views/show.html.erb.tt
|
87
132
|
- lib/generators/apache_age/scaffold_node/USAGE
|
88
133
|
- lib/generators/apache_age/scaffold_node/scaffold_node_generator.rb
|
89
|
-
- lib/generators/apache_age/scaffold_node/templates/
|
90
|
-
- lib/generators/apache_age/scaffold_node/templates/views/_form.html.erb copy.tt
|
134
|
+
- lib/generators/apache_age/scaffold_node/templates/controller.rb.tt
|
91
135
|
- lib/generators/apache_age/scaffold_node/templates/views/_form.html.erb.tt
|
92
|
-
- lib/generators/apache_age/scaffold_node/templates/views/edit.html.erb copy.tt
|
93
136
|
- lib/generators/apache_age/scaffold_node/templates/views/edit.html.erb.tt
|
94
|
-
- lib/generators/apache_age/scaffold_node/templates/views/index.html.erb copy.tt
|
95
137
|
- lib/generators/apache_age/scaffold_node/templates/views/index.html.erb.tt
|
96
|
-
- lib/generators/apache_age/scaffold_node/templates/views/new.html.erb copy.tt
|
97
138
|
- lib/generators/apache_age/scaffold_node/templates/views/new.html.erb.tt
|
98
|
-
- lib/generators/apache_age/scaffold_node/templates/views/partial.html.erb copy.tt
|
99
139
|
- lib/generators/apache_age/scaffold_node/templates/views/partial.html.erb.tt
|
100
|
-
- lib/generators/apache_age/scaffold_node/templates/views/show.html.erb copy.tt
|
101
140
|
- lib/generators/apache_age/scaffold_node/templates/views/show.html.erb.tt
|
102
141
|
- lib/rails_age.rb
|
103
142
|
- lib/rails_age/engine.rb
|
File without changes
|
File without changes
|
/data/lib/generators/apache_age/scaffold_node/templates/{node_controller.rb.tt → controller.rb.tt}
RENAMED
File without changes
|