go-on-rails 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +19 -3
- data/lib/generators/gor/gor_generator.rb +11 -0
- data/lib/generators/gor/templates/gor_model.go.erb +29 -8
- data/lib/tasks/gor.rake +13 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d2c69a6ebce31c2804821e2984af576d8a45212
|
4
|
+
data.tar.gz: fcd5211c4a7eb06c15f8fb82ee37cb71f36ade55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7706dd9487899a009c937f4cc114c197e839ffc8a3f89b115de3f59b3301013030b6950207c796b6c236870f9fdfa13a2ae4360663a6db33d27f0c73c533b93a
|
7
|
+
data.tar.gz: 0b60b8ded7ee6f87c8533c0cae640dcc07cb1724ee24ec98caed7c2f85e8407ed71a35eedbe3db02170598a729b472e2d4a1b8cef12116e830b4b1578fa24662
|
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
go-on-rails
|
4
4
|
====
|
5
5
|
|
6
|
-
go-on-rails
|
6
|
+
go-on-rails is a Rails generator created for three scenarios:
|
7
7
|
|
8
8
|
1. Integrate some APIs written in Golang to existed Rails app for high performance
|
9
9
|
2. Use your farmiliar Rails tools to develope and manage a Golang app project
|
@@ -37,7 +37,7 @@ $ gem install go-on-rails
|
|
37
37
|
|
38
38
|
You must have a Rails app or to create one before you can try go-on-rails generator to convert a Rails app to Golang codes.
|
39
39
|
|
40
|
-
|
40
|
+
After that you can just run the command to convert the application:
|
41
41
|
|
42
42
|
```bash
|
43
43
|
rails g gor [dev(elopment) | pro(duction) | test] [-m model_a model_b model_c ...]
|
@@ -70,8 +70,17 @@ rails g gor --help
|
|
70
70
|
* Go project directory layout (all under the `go_app` directory, like `views`, `controllers`, `public`)
|
71
71
|
* A Go data struct corresponding to each activerecord model
|
72
72
|
* And each struct related CRUD functions/methods like FindModel, UpdateModel, DestroyModle etc. All these models related program files under the `go_app/models` directory
|
73
|
+
* And godoc files for all the functions under `go_app/models/doc`
|
73
74
|
* We use [Gin](https://github.com/gin-gonic/gin) as the default web framework, but you can change it to anyone that you favor in `main.go` and `controllers` programs
|
74
75
|
|
76
|
+
### View the godoc of all functions
|
77
|
+
|
78
|
+
You can view the godoc page of all functions in http://localhost:7979/doc/models.html after run:
|
79
|
+
|
80
|
+
```bash
|
81
|
+
rails gor:doc
|
82
|
+
```
|
83
|
+
|
75
84
|
And the gem is still under development, so there're a lot of known issues.
|
76
85
|
|
77
86
|
## Known issues and TODOs
|
@@ -120,7 +129,14 @@ The `dev` branch has a whole Rails environment for development: models, seeds fo
|
|
120
129
|
|
121
130
|
### Testing
|
122
131
|
|
123
|
-
|
132
|
+
We create four models for testing:
|
133
|
+
|
134
|
+
- Physician
|
135
|
+
- Patient
|
136
|
+
- Appointment
|
137
|
+
- Picture
|
138
|
+
|
139
|
+
Run `rails db:seed` to use the data defined in `db/seeds.rb`. And change to `go_app/models` directory to run `go test` to test generated models-related functions. The test covers a small part of the functions currently. More will be added later on.
|
124
140
|
|
125
141
|
## License
|
126
142
|
|
@@ -60,6 +60,9 @@ class GorGenerator < Rails::Generators::Base
|
|
60
60
|
|
61
61
|
# use gofmt to prettify the generated Golang files
|
62
62
|
gofmt_go_files
|
63
|
+
|
64
|
+
# generate go docs for models
|
65
|
+
generate_go_docs
|
63
66
|
end
|
64
67
|
|
65
68
|
private
|
@@ -96,6 +99,14 @@ class GorGenerator < Rails::Generators::Base
|
|
96
99
|
go_files = Rails.root.join('go_app', 'models/*.go').to_s
|
97
100
|
system "gofmt -w #{go_files} > /dev/null 2>&1"
|
98
101
|
end
|
102
|
+
|
103
|
+
def generate_go_docs
|
104
|
+
models_dir = Rails.root.join('go_app', 'models').to_s
|
105
|
+
return unless Dir.exist?(File.expand_path(models_dir))
|
106
|
+
doc_dir = File.join(models_dir, "doc")
|
107
|
+
Dir.mkdir(doc_dir) unless Dir.exist?(doc_dir)
|
108
|
+
system "godoc -html #{models_dir} | awk '{ gsub(\"/src/target\", \"\"); print }' > #{doc_dir}/models.html"
|
109
|
+
end
|
99
110
|
end
|
100
111
|
|
101
112
|
require_relative 'go-on-rails/converter'
|
@@ -2,10 +2,7 @@
|
|
2
2
|
<%- model_name_underscore = @model_name.underscore -%>
|
3
3
|
<%- col_names = @struct_info[:col_names] -%>
|
4
4
|
<%- has_assoc = !@struct_info[:assoc_info][:has_many].empty? || !@struct_info[:assoc_info][:has_one].empty? -%>
|
5
|
-
// Package models
|
6
|
-
// https://rubygems.org/gems/go-on-rails
|
7
|
-
// Or on Github: https://github.com/goonr/go-on-rails
|
8
|
-
// By B1nj0y <idegorepl@gmail.com>
|
5
|
+
// Package models includes the functions on the model <%= @model_name %>.
|
9
6
|
package models
|
10
7
|
|
11
8
|
import (
|
@@ -20,6 +17,11 @@ import (
|
|
20
17
|
"github.com/asaskevich/govalidator"
|
21
18
|
)
|
22
19
|
|
20
|
+
// set flags to output more detailed log
|
21
|
+
func init() {
|
22
|
+
log.SetFlags(log.LstdFlags | log.Lshortfile)
|
23
|
+
}
|
24
|
+
|
23
25
|
type <%= @model_name %> struct {
|
24
26
|
<%= @struct_info[:struct_body] -%>
|
25
27
|
}
|
@@ -380,6 +382,8 @@ func Find<%= @model_name.pluralize %>BySql(sql string, args ...interface{}) (<%=
|
|
380
382
|
return <%= param_name_plural %>, nil
|
381
383
|
}
|
382
384
|
|
385
|
+
// Create<%= @model_name %> use a named params to create a single <%= @model_name %> record.
|
386
|
+
// A named params is key-value map like map[string]interface{}{"first_name": "John", "age": 23} .
|
383
387
|
func Create<%= @model_name %>(am map[string]interface{}) (int64, error) {
|
384
388
|
if len(am) == 0 {
|
385
389
|
return 0, fmt.Errorf("Zero key in the attributes map!")
|
@@ -413,6 +417,7 @@ func Create<%= @model_name %>(am map[string]interface{}) (int64, error) {
|
|
413
417
|
return lastId, nil
|
414
418
|
}
|
415
419
|
|
420
|
+
// Create is a method for <%= @model_name %> to create a record
|
416
421
|
func (_<%= model_name_underscore %> *<%= @model_name %>) Create() (int64, error) {
|
417
422
|
ok, err := govalidator.ValidateStruct(_<%= model_name_underscore %>)
|
418
423
|
if !ok {
|
@@ -446,7 +451,7 @@ func (_<%= model_name_underscore %> *<%= @model_name %>) Create() (int64, error)
|
|
446
451
|
<%- unless @struct_info[:assoc_info][:has_many].empty? -%>
|
447
452
|
<%- has_many = @struct_info[:assoc_info][:has_many] -%>
|
448
453
|
<%- has_many.each do |k, v| -%>
|
449
|
-
// <%= k.pluralize %>Create used to create the associated objects
|
454
|
+
// <%= k.pluralize %>Create is used for <%= @model_name %> to create the associated objects <%= k.pluralize %>
|
450
455
|
func (_<%= model_name_underscore %> *<%= @model_name %>) <%= k.pluralize %>Create(am map[string]interface{}) error {
|
451
456
|
<%- if v[:through] -%>
|
452
457
|
// FIXME: use transaction to create these associated objects
|
@@ -470,7 +475,9 @@ func (_<%= model_name_underscore %> *<%= @model_name %>) <%= k.pluralize %>Creat
|
|
470
475
|
return err
|
471
476
|
}
|
472
477
|
|
473
|
-
// Get<%= k.pluralize %> used to get associated objects
|
478
|
+
// Get<%= k.pluralize %> is used for <%= @model_name %> to get associated objects <%= k.pluralize %>
|
479
|
+
// Say you have a <%= @model_name %> object named <%= model_name_underscore %>, when you call <%= model_name_underscore %>.Get<%= k.pluralize %>(),
|
480
|
+
// the object will get the associated <%= k.pluralize %> attributes evaluated in the struct
|
474
481
|
func (_<%= model_name_underscore %> *<%= @model_name %>) Get<%= k.pluralize %>() error {
|
475
482
|
_<%= k.underscore.pluralize %>, err := <%= @model_name %>Get<%= k.pluralize %>(_<%= model_name_underscore %>.Id)
|
476
483
|
if err == nil {
|
@@ -510,6 +517,7 @@ func <%= @model_name %>Get<%= k.pluralize %>(id int64) ([]<%= v[:class_name] %>,
|
|
510
517
|
<%- unless @struct_info[:assoc_info][:has_one].empty? -%>
|
511
518
|
<%- has_one = @struct_info[:assoc_info][:has_one] -%>
|
512
519
|
<%- has_one.each do |k, v| -%>
|
520
|
+
// Create<%= k %> is a method used for <%= @model_name %> model
|
513
521
|
func (_<%= model_name_underscore %> *<%= @model_name %>) Create<%= k %>(am map[string]interface{}) error {
|
514
522
|
<%- if v[:foreign_key] -%>
|
515
523
|
am["<%= v[:foreign_key] %>"] = _<%= model_name_underscore %>.Id
|
@@ -527,6 +535,7 @@ func (_<%= model_name_underscore %> *<%= @model_name %>) Create<%= k %>(am map[s
|
|
527
535
|
<%- belongs_to.each do |k, v| -%>
|
528
536
|
<%-# don't create virtual table for polymorphic model -%>
|
529
537
|
<%- next if v[:polymorphic] -%>
|
538
|
+
// Create<%= k %> is a method for a <%= @model_name %> object to create an associated <%= k %> record
|
530
539
|
func (_<%= model_name_underscore %> *<%= @model_name %>) Create<%= k %>(am map[string]interface{}) error {
|
531
540
|
<%- if v[:foreign_key] -%>
|
532
541
|
am["<%= v[:foreign_key] %>"] = _<%= model_name_underscore %>.Id
|
@@ -539,6 +548,7 @@ func (_<%= model_name_underscore %> *<%= @model_name %>) Create<%= k %>(am map[s
|
|
539
548
|
<%- end -%>
|
540
549
|
<%- end -%>
|
541
550
|
|
551
|
+
// Destroy is method used for a <%= @model_name %> object to be destroyed.
|
542
552
|
func (_<%= model_name_underscore %> *<%= @model_name %>) Destroy() error {
|
543
553
|
if _<%= model_name_underscore %>.Id == 0 {
|
544
554
|
return errors.New("Invalid Id field: it can't be a zero value")
|
@@ -547,6 +557,7 @@ func (_<%= model_name_underscore %> *<%= @model_name %>) Destroy() error {
|
|
547
557
|
return err
|
548
558
|
}
|
549
559
|
|
560
|
+
// Destroy<%= @model_name %> will destroy a <%= @model_name %> record specified by id parameter.
|
550
561
|
func Destroy<%= @model_name %>(id int64) error {
|
551
562
|
<%- if @struct_info[:has_assoc_dependent] -%>
|
552
563
|
// Destroy association objects at first
|
@@ -561,6 +572,7 @@ func Destroy<%= @model_name %>(id int64) error {
|
|
561
572
|
return nil
|
562
573
|
}
|
563
574
|
|
575
|
+
// Destroy<%= @model_name.pluralize %> will destroy <%= @model_name %> records those specified by the ids parameters.
|
564
576
|
func Destroy<%= @model_name.pluralize %>(ids ...int64) (int64, error) {
|
565
577
|
if len(ids) == 0 {
|
566
578
|
msg := "At least one or more ids needed"
|
@@ -621,7 +633,8 @@ func Destroy<%= @model_name.pluralize %>Where(where string, args ...interface{})
|
|
621
633
|
}
|
622
634
|
|
623
635
|
<%- if @struct_info[:has_assoc_dependent] -%>
|
624
|
-
//
|
636
|
+
// destroy<%= @model_name %>Associations is a private function used to destroy a <%= @model_name %> record's associated objects.
|
637
|
+
// The func not return err temporarily.
|
625
638
|
func destroy<%= @model_name %>Associations(ids ...int64) {
|
626
639
|
idsHolder := ""
|
627
640
|
if len(ids) > 1 {
|
@@ -696,6 +709,8 @@ func destroy<%= @model_name %>Associations(ids ...int64) {
|
|
696
709
|
}
|
697
710
|
<%- end -%>
|
698
711
|
|
712
|
+
// Save method is used for a <%= @model_name %> object to update an existed record mainly.
|
713
|
+
// If no id provided a new record will be created. A UPSERT action will be implemented further.
|
699
714
|
func (_<%= model_name_underscore %> *<%= @model_name %>) Save() error {
|
700
715
|
ok, err := govalidator.ValidateStruct(_<%= model_name_underscore %>)
|
701
716
|
if !ok {
|
@@ -707,7 +722,8 @@ func (_<%= model_name_underscore %> *<%= @model_name %>) Save() error {
|
|
707
722
|
return errors.New(errMsg)
|
708
723
|
}
|
709
724
|
if _<%= model_name_underscore %>.Id == 0 {
|
710
|
-
|
725
|
+
_, err = _<%= model_name_underscore %>.Create()
|
726
|
+
return err
|
711
727
|
}
|
712
728
|
<%- if @struct_info[:timestamp_cols].include? "updated_at" -%>
|
713
729
|
_<%= model_name_underscore %>.UpdatedAt = time.Now()
|
@@ -719,6 +735,7 @@ func (_<%= model_name_underscore %> *<%= @model_name %>) Save() error {
|
|
719
735
|
return err
|
720
736
|
}
|
721
737
|
|
738
|
+
// Update<%= @model_name %> is used to update a record with a id and map[string]interface{} typed key-value parameters.
|
722
739
|
func Update<%= @model_name %>(id int64, am map[string]interface{}) error {
|
723
740
|
if len(am) == 0 {
|
724
741
|
return errors.New("Zero key in the attributes map!")
|
@@ -747,6 +764,7 @@ func Update<%= @model_name %>(id int64, am map[string]interface{}) error {
|
|
747
764
|
return nil
|
748
765
|
}
|
749
766
|
|
767
|
+
// Update is a method used to update a <%= @model_name %> record with the map[string]interface{} typed key-value parameters.
|
750
768
|
func (_<%= model_name_underscore %> *<%= @model_name %>) Update(am map[string]interface{}) error {
|
751
769
|
if _<%= model_name_underscore %>.Id == 0 {
|
752
770
|
return errors.New("Invalid Id field: it can't be a zero value")
|
@@ -763,6 +781,7 @@ func (_<%= model_name_underscore %> *<%= @model_name %>) UpdateAttributes(am map
|
|
763
781
|
return err
|
764
782
|
}
|
765
783
|
|
784
|
+
// UpdateColumns method is supposed to be used to update <%= @model_name %> records as corresponding update_columns in Rails
|
766
785
|
func (_<%= model_name_underscore %> *<%= @model_name %>) UpdateColumns(am map[string]interface{}) error {
|
767
786
|
if _<%= model_name_underscore %>.Id == 0 {
|
768
787
|
return errors.New("Invalid Id field: it can't be a zero value")
|
@@ -771,6 +790,8 @@ func (_<%= model_name_underscore %> *<%= @model_name %>) UpdateColumns(am map[st
|
|
771
790
|
return err
|
772
791
|
}
|
773
792
|
|
793
|
+
// Update<%= @model_name.pluralize %>BySql is used to update <%= @model_name %> records by a SQL clause
|
794
|
+
// that use '?' binding syntax
|
774
795
|
func Update<%= @model_name.pluralize %>BySql(sql string, args ...interface{}) (int64, error) {
|
775
796
|
if sql == "" {
|
776
797
|
return 0, errors.New("A blank SQL clause")
|
data/lib/tasks/gor.rake
CHANGED
@@ -17,4 +17,17 @@ namespace :gor do
|
|
17
17
|
go_files = Rails.root.join('go_app', 'models/*.go').to_s
|
18
18
|
system "gofmt -w #{go_files} > /dev/null 2>&1"
|
19
19
|
end
|
20
|
+
|
21
|
+
desc 'View the doc of all the functions generated on models'
|
22
|
+
task :doc do
|
23
|
+
models_dir = Rails.root.join('go_app', 'models').to_s
|
24
|
+
puts 'Please open "http://localhost:7979/doc/models.html" to view the doc of all functions generated on models.'
|
25
|
+
puts 'Use Ctrl-C to terminate this server!'
|
26
|
+
if RUBY_PLATFORM =~ /darwin/
|
27
|
+
system 'open http://localhost:7979/doc/models.html'
|
28
|
+
elsif RUBY_PLATFORM =~ /cygwin|mswin|mingw|bccwin|wince|emx/
|
29
|
+
system 'start http://localhost:7979/doc/models.html'
|
30
|
+
end
|
31
|
+
system "godoc -goroot #{models_dir} -http=:7979"
|
32
|
+
end
|
20
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: go-on-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- B1nj0y
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-08-07 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Modeling, developing and testing your Golang app with your familiar Rails
|
14
14
|
tools like rails generate, db migration, console etc. It is more meant to help integrating
|