go-on-rails 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: df621fc93adc16e27b7cb0ea6629daae00a423ee
4
- data.tar.gz: 678bb116033389245337cbff83cfe473780c52d5
3
+ metadata.gz: 9440dee24a0661bf808bf44778dd5d9d95671a9c
4
+ data.tar.gz: ca2e1a666a7650cb3dd695cb97ccf1e00797cf2d
5
5
  SHA512:
6
- metadata.gz: 25dfa07d3c00ce9d93901040cb898faf9c5a911b6367fa12f6803f91dd0177894db4dc95a031cc2054176a2a5426801e5a850b376f43d4a3b1f7648485fc1228
7
- data.tar.gz: 7257cf5af21b9d489b8fbcd0fd4e808f21ee6ef13e758adcc87079dad457b420e67837f4e91281780fe7cac8bea07bbe0c3b87485a1f33a7014ec981ce773d57
6
+ metadata.gz: e69cb0445523bbb0a172b47cdf319f14d72196621b85240479727edfb416a9b2887089ee748521da03d7442ce93e332481145781db25533955a3fd75c45f4a6b
7
+ data.tar.gz: fb805efaf9e5ad7b66d523f0c4b303e99f09f1ffa6cea6b6e94b6d5510c521348b2f507d39d1c14bd3660a1726fbbcbf731a8d87e6a1dee4cfe38097e49c8c09
data/README.md CHANGED
@@ -1,36 +1,35 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/go-on-rails.svg)](https://badge.fury.io/rb/go-on-rails)
2
2
  [![Build Status](https://travis-ci.org/goonr/go-on-rails.svg?branch=dev)](https://travis-ci.org/goonr/go-on-rails)
3
- [![Join the chat at https://gitter.im/goonr/Lobby](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/goonr/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
3
+ [![Maintainability](https://api.codeclimate.com/v1/badges/6fba1f226f027a14c19b/maintainability)](https://codeclimate.com/github/goonr/go-on-rails/maintainability)
4
4
 
5
5
  <img align="right" width="260" height="260" src="./go-on-rails.png">
6
6
 
7
- go-on-rails
8
- ====
7
+ # Go on Rails
9
8
 
10
9
  [中文文档](./README_zh.md)
11
10
 
12
- go-on-rails is a Rails generator aims to:
11
+ `go-on-rails` is a Rails generator aims to:
13
12
 
14
- 1. Integrate some APIs written in Golang to existed Rails app for high performance
15
- 2. Use your farmiliar Rails tools to develope and manage a Golang app project
13
+ 1. Help to develop and integrate some APIs written in Golang to existed Rails app for high performance
14
+ 2. Use your farmiliar Rails tools to develop and manage a Golang app project
16
15
  3. Convert a *not very complicated* Rails app to Golang equivalent
17
16
 
18
17
  Here's some examples:
19
- * a simple [example(tutorial)](https://github.com/goonr/example_simple) on the basic usage of go-on-rails generator
18
+ * A simple [example(tutorial)](https://github.com/goonr/example_simple) on the basic usage of go-on-rails generator
20
19
  * [An advanced example](https://github.com/goonr/example_with_admin) shows how to integrate Go APIs in a Rails project
21
20
  * [Another example](https://github.com/goonr/example_read_rails_session) shows how to handle a Rails session to get an user's info in a go-on-rails generated Go API
22
21
 
23
22
  ## Prerequisites
24
23
 
25
24
  * Rails 4.2+
26
- * Golang 1.5.x
25
+ * Golang 1.7.x
27
26
 
28
27
  ## Installation
29
28
 
30
29
  Add this line to your application's Gemfile:
31
30
 
32
31
  ```ruby
33
- gem 'go-on-rails', '~> 0.1.12'
32
+ gem 'go-on-rails', '~> 0.3.0'
34
33
  ```
35
34
 
36
35
  And then execute:
@@ -44,20 +43,23 @@ $ gem install go-on-rails
44
43
  ```
45
44
  ## Usage
46
45
 
47
- 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.
46
+ You must have an existed Rails app or to create a new one before you try go-on-rails to generate Golang codes.
48
47
 
49
- After that you can just run the command to convert the application:
48
+ After that you can run the command just as other Rails generators:
50
49
 
51
50
  ```bash
52
- rails g gor [dev(elopment) | pro(duction) | test] [-m model_a model_b model_c ...]
51
+ bundle exec rails g gor [dev(elopment) | pro(duction) | test] [-m model_a model_b model_c ...]
52
+
53
+ # OR (on rails version < 5.0)
54
+ bundle exec rake g gor ...
53
55
  ```
54
56
 
55
- Then a directory named "go_app" with Golang codes will be generated under your Rails app root path.
57
+ Then a folder named `go_app` that includes Golang codes will be generated under your Rails app root path.
56
58
 
57
- Install the dependent Golang packages:
59
+ Install the dependent Golang packages for this Go project:
58
60
 
59
61
  ```bash
60
- rails gor:deps
62
+ bundle exec rails gor:deps
61
63
  ```
62
64
 
63
65
  Then change to the `go_app` directory and run:
@@ -66,12 +68,12 @@ Then change to the `go_app` directory and run:
66
68
  go run main.go
67
69
  ```
68
70
 
69
- You can visit the page in http://localhost:3000 by default.
71
+ You can visit the page in http://localhost:4000 by default.
70
72
 
71
73
  More command details about go-on-rails generator:
72
74
 
73
75
  ```bash
74
- rails g gor --help
76
+ bundle exec rails g gor --help
75
77
  ```
76
78
 
77
79
  ## What will be generated?
@@ -87,15 +89,16 @@ rails g gor --help
87
89
  You can view the godoc page of all functions in http://localhost:7979/doc/models.html after run:
88
90
 
89
91
  ```bash
90
- rails gor:doc
92
+ bundle exec rails gor:doc
91
93
  ```
92
94
 
93
- there's [a sample project](https://github.com/goonr/gor_models_sample) generated by go-on-rails, you can view its godoc at godoc.org, [more details](https://github.com/goonr/gor_models_sample).
95
+ Besides, there's [a sample project](https://github.com/goonr/gor_models_sample) generated by go-on-rails, you can view its [godoc](https://godoc.org/github.com/goonr/gor_models_sample) at godoc.org just now to get a picture of what functions are generated.
94
96
 
95
- And the gem is still under development, so there're a lot of known issues.
96
97
 
97
98
  ## Known issues and TODOs
98
99
 
100
+ The gem is still under development, so there're some known issues.
101
+
99
102
  * databases specific functions between MySQL and Postgres or other databases are not covered yet
100
103
  * sql.NullType not supported yet, so you'd better in the migrations set those columns "not null" with a default value that's consistent with Golang's zero value specification, such as "" default for string and text typed column, and 0 default for int, etc. And now we have an alternative approch for manipulating the database nullable fields, see the wiki [Working with database nullable fields](https://github.com/goonr/go-on-rails/wiki/Working-with-database-nullable-fields)
101
104
 
@@ -118,6 +121,8 @@ And the gem is still under development, so there're a lot of known issues.
118
121
 
119
122
  * [Built-in Pagination](https://github.com/goonr/go-on-rails/wiki/Pagination)
120
123
  * [Working with database nullable fields](https://github.com/goonr/go-on-rails/wiki/Working-with-database-nullable-fields)
124
+ * [Some Make commands](https://github.com/goonr/go-on-rails/wiki/Some-Make-commands)
125
+ * [Dockerize a Go-on-Rails application](https://github.com/goonr/go-on-rails/wiki/Dockerize-a-Go-on-Rails-application)
121
126
 
122
127
  ## Golang dependencies by default
123
128
 
@@ -63,6 +63,10 @@ class GorGenerator < Rails::Generators::Base
63
63
  template "home_controller.go.erb", "go_app/controllers/home_controller.go"
64
64
  copy_file "index.tmpl", "go_app/views/index.tmpl"
65
65
  copy_file "favicon.ico", "go_app/public/favicon.ico"
66
+ # generate config files for make and dockerization
67
+ template "docker-compose.yml.erb", "docker-compose.yml"
68
+ template "Dockerfile.go_app.erb", "go_app/Dockerfile"
69
+ copy_file "Makefile", "go_app/Makefile"
66
70
  end
67
71
 
68
72
  # use gofmt to prettify the generated Golang files
@@ -81,25 +85,26 @@ class GorGenerator < Rails::Generators::Base
81
85
  end
82
86
 
83
87
  def read_database_config rails_env
84
- db_conf = Rails.configuration.database_configuration[rails_env]
85
- db_conf["host"] = "localhost" unless db_conf["host"]
86
- case db_conf["adapter"]
88
+ @db_config = Rails.configuration.database_configuration[rails_env].symbolize_keys
89
+ @db_config[:host] ||= "localhost"
90
+ case @db_config[:adapter]
87
91
  when "sqlite3"
88
92
  @db_config[:driver_name] = "sqlite3"
89
- @db_config[:dsn] = Rails.root.join(db_conf["database"]).to_s
93
+ @db_config[:dsn] = Rails.root.join(@db_config[:database]).to_s
90
94
  @db_config[:driver_package] = "_ \"github.com/goonr/go-sqlite3\""
91
95
  when "mysql2"
92
96
  @db_config[:driver_name] = "mysql"
93
- db_conf["port"] = 3306 unless db_conf["port"]
97
+ @db_config[:port] ||= "3306"
94
98
  # MySQL DSN format: username:password@protocol(address)/dbname?param=value
95
99
  # See more: https://github.com/go-sql-driver/mysql
96
100
  format = "%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True&loc=Local"
97
- @db_config[:dsn] = sprintf(format, *db_conf.values_at("username", "password", "host", "port", "database", "encoding"))
101
+ @db_config[:dsn] = sprintf(format, *@db_config.values_at(:username, :password, :host, :port, :database, :encoding))
98
102
  @db_config[:driver_package] = "_ \"github.com/go-sql-driver/mysql\""
99
103
  when "postgresql"
100
104
  @db_config[:driver_name] = "postgres"
101
- format = "host=%s user=%s dbname=%s sslmode=disable password=%s"
102
- @db_config[:dsn] = sprintf(format, *db_conf.values_at("host", "username", "database", "password"))
105
+ @db_config[:port] ||= "5432"
106
+ format = "host=%s port=%s user=%s dbname=%s sslmode=disable password=%s"
107
+ @db_config[:dsn] = sprintf(format, *@db_config.values_at(:host, :port, :username, :database, :password))
103
108
  @db_config[:driver_package] = "_ \"github.com/lib/pq\""
104
109
  end
105
110
  end
@@ -0,0 +1,20 @@
1
+ # Multi-stage builds require Docker 17.05 or higher on the daemon and client.
2
+ # see: https://docs.docker.com/engine/userguide/eng-image/multistage-build/
3
+
4
+ # build the go app binary
5
+ FROM golang:1.9.2 as builder
6
+ WORKDIR /root/
7
+ COPY . /root/
8
+ <%- if %w[127.0.0.1 localhost].include? @db_config[:host] and @db_config[:driver_name] != "sqlite3" -%>
9
+ RUN perl -pi -e "s/tcp\(.*?:/tcp\(database:/; s/host=\S+? /host=database /" models/db.go
10
+ <%- end -%>
11
+ RUN make deps
12
+ RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o myapp .
13
+
14
+ # use the binary app to build the target image
15
+ FROM alpine:latest
16
+ WORKDIR /root/
17
+ ADD views /root/views
18
+ ADD public /root/public
19
+ COPY --from=builder /root/myapp .
20
+ CMD ["./myapp"]
@@ -0,0 +1,32 @@
1
+ GO := go
2
+ MYAPP := myapp
3
+ IMAGE := $(MYAPP)
4
+ TAG := latest
5
+
6
+ $(MYAPP):
7
+ $(GO) build -o $(MYAPP)
8
+
9
+ clean:
10
+ -rm $(MYAPP)
11
+
12
+ build: $(MYAPP)
13
+ @:
14
+
15
+ deps:
16
+ $(GO) get -u github.com/jmoiron/sqlx \
17
+ github.com/gin-gonic/gin \
18
+ github.com/goonr/go-sqlite3 \
19
+ github.com/go-sql-driver/mysql \
20
+ github.com/lib/pq \
21
+ github.com/asaskevich/govalidator
22
+
23
+ test:
24
+ $(GO) test -v ./models
25
+
26
+ run: $(MYAPP)
27
+ ./$(MYAPP)
28
+
29
+ image: clean
30
+ docker build -t $(USER)/$(IMAGE):$(TAG) .
31
+
32
+ .PHONY: build clean deps test run image
@@ -0,0 +1,37 @@
1
+ version: '3'
2
+
3
+ services:
4
+ <%- if %w[127.0.0.1 localhost].include? @db_config[:host] and @db_config[:driver_name] != "sqlite3" -%>
5
+ # generated according to the config/database.yml
6
+ database:
7
+ image: <%= @db_config[:driver_name] %>
8
+ ports:
9
+ - '<%= @db_config[:port] %>:<%= @db_config[:port] %>'
10
+ <%- end -%>
11
+
12
+ # rails app part. You need to modify this part by your project
13
+ # and create a Dockerfile for it before you run any docker-compose command
14
+ rails_app:
15
+ build: .
16
+ command: bundle exec rails s -p 3000 -b '0.0.0.0'
17
+ ports:
18
+ - "3000:3000"
19
+ <%- if %w[127.0.0.1 localhost].include? @db_config[:host] and @db_config[:driver_name] != "sqlite3" -%>
20
+ depends_on:
21
+ - database
22
+ <%- end -%>
23
+
24
+ # golang app part. It depends on the rails_app to initialize the database
25
+ go_app:
26
+ build: ./go_app
27
+ command: ./myapp -port 4000
28
+ environment:
29
+ # Gin webserver run mode. Or "debug" for debugging
30
+ - GIN_MODE=release
31
+ ports:
32
+ - "4000:4000"
33
+ depends_on:
34
+ <%- if %w[127.0.0.1 localhost].include? @db_config[:host] and @db_config[:driver_name] != "sqlite3" -%>
35
+ - database
36
+ <%- end -%>
37
+ - rails_app
@@ -8,8 +8,8 @@ import (
8
8
  )
9
9
 
10
10
  func main() {
11
- // The app will run on port 3000 by default, you can custom it with the flag -port
12
- servePort := flag.String("port", "3000", "Http Server Port")
11
+ // The app will run on port 4000 by default, you can custom it with the flag -port
12
+ servePort := flag.String("port", "4000", "Http Server Port")
13
13
  flag.Parse()
14
14
 
15
15
  // Here we are instantiating the router
@@ -2,7 +2,7 @@ namespace :gor do
2
2
  desc 'Install dependent Golang packages'
3
3
  task :deps do
4
4
  puts 'Beginning to install Go deps...'
5
- system "go get \
5
+ system "go get -u \
6
6
  github.com/jmoiron/sqlx \
7
7
  github.com/gin-gonic/gin \
8
8
  github.com/goonr/go-sqlite3 \
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.2.0
4
+ version: 0.3.0
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-21 00:00:00.000000000 Z
11
+ date: 2018-01-11 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
@@ -25,7 +25,10 @@ files:
25
25
  - lib/generators/gor/converter.rb
26
26
  - lib/generators/gor/validator.rb
27
27
  - lib/generators/gor_generator.rb
28
+ - lib/generators/templates/Dockerfile.go_app.erb
29
+ - lib/generators/templates/Makefile
28
30
  - lib/generators/templates/db.go.erb
31
+ - lib/generators/templates/docker-compose.yml.erb
29
32
  - lib/generators/templates/favicon.ico
30
33
  - lib/generators/templates/gor_model.go.erb
31
34
  - lib/generators/templates/home_controller.go.erb