go-on-rails 0.0.7 → 0.0.8

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: 893993277d5b0ef18340c36e309155b3e34cf3d4
4
- data.tar.gz: 68709edcb71c6e4f1f8ce3dffb25ae4276e2623d
3
+ metadata.gz: ca05e99e94cb8cfda6430e5c757669ebad458d58
4
+ data.tar.gz: 5f2b5a426d3f4c36263edb3d98d79d4c7d94f7e7
5
5
  SHA512:
6
- metadata.gz: a443051416f1b2352355b3be7e4875ed3c5919c82aff0f599cfddbf68b9979547fe270d5468201eb5c94190a0e38332575f7f44f42ca117917c4862a387655fd
7
- data.tar.gz: de5c41b9abc3fb7849dbeb9271c0d965ce083376cec0e74c602af7a7898753ced6ad8cb3ae2d90880a15f98bb6041da9149d7a4e3181acee7de3662c6b92f120
6
+ metadata.gz: 4d2874934773f3139d68ed4cccbde2c22631be8e2048541b3b702687f73bebdcb655ba493d420069df61da34becdb9f6b2fab2cfd97a5be402fe5ccef2e0afbc
7
+ data.tar.gz: 0c05600084919d689bef80208d4582323ca8e3cb141cfc7d4e3645c9071ff8aba357b57bb14fcda7f6fa2c01b03dfb31313fd331d05203c5b45dd803f2cf8722
data/README.md CHANGED
@@ -21,7 +21,7 @@ One or more examples will be given later on.
21
21
  Add this line to your application's Gemfile:
22
22
 
23
23
  ```ruby
24
- gem 'go-on-rails', '~> 0.0.7'
24
+ gem 'go-on-rails', '~> 0.0.8'
25
25
  ```
26
26
 
27
27
  And then execute:
@@ -72,6 +72,7 @@ And the gem is still under development, so there're a lot of known issues.
72
72
  * the generated Golang codes includes the association between models, basic relations like has_many, has_one, belongs_to have been supported
73
73
  * so some association functions is available
74
74
  * and the :dependent action is triggered when destroying some related model
75
+ * some validation like presense, length restriction and format are supported
75
76
  * databases specific functions between mysql, postgres are not covered yet
76
77
  * model callbacks are not available
77
78
  * 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.
@@ -86,7 +87,7 @@ When I had the idea to convert Rails app or build Golang app with Rails tools, I
86
87
 
87
88
  There're two branches at present: `master` and `dev`.
88
89
 
89
- The branch `master` has the files only for the generator needs, as the `dev` branch has a whole Rails environment for development: models, seeds for testing, and under `go_app` directory there's a file named `modles_test.go` used to test generated Golang codes.
90
+ The `dev` branch has a whole Rails environment for development: models, seeds for testing, and under `go_app` directory there's a file named `modles_test.go` used to test generated Golang codes.
90
91
 
91
92
  - Fork the project switch to branch `dev`.
92
93
  - Make your feature addition or bug fix.
@@ -11,7 +11,7 @@ module GoOnRails
11
11
  def get_schema_info
12
12
  info = {struct_body: "", has_assoc_dependent: false, assoc_info: {has_many: {}, has_one: {}, belongs_to: {}}}
13
13
  self.klass.reflect_on_all_associations.each do |assoc|
14
- tags = ["json:\"#{assoc.name.to_s},omitempty\" db:\"#{assoc.name.to_s}\""]
14
+ tags = ["json:\"#{assoc.name.to_s},omitempty\" db:\"#{assoc.name.to_s}\" valid:\"-\""]
15
15
  case assoc.macro
16
16
  when :has_many
17
17
  col_name = assoc.name.to_s.camelize
@@ -33,12 +33,13 @@ module GoOnRails
33
33
 
34
34
  self.max_col_size = get_max_col_size
35
35
  self.max_type_size = get_max_type_size
36
+ validation = GoOnRails::Validator.new(self.klass)
36
37
 
37
38
  self.klass.columns.each_with_index do |col, index|
38
39
  tags = []
39
40
 
40
41
  # add struct tag
41
- tags << struct_tag(col)
42
+ tags << struct_tag(col, validation)
42
43
 
43
44
  col_type = col.type.to_s
44
45
  struct_info[:has_datetime_type] = true if %w(datetime time).include? col_type
@@ -88,11 +89,12 @@ module GoOnRails
88
89
  builder.get_schema_info
89
90
  end
90
91
 
91
- def struct_tag(col)
92
- "json:\"#{col.name},omitempty\" db:\"#{col.name}\""
92
+ def struct_tag(col, validation)
93
+ valid_tags = validation.build_validator_tag(col)
94
+ "json:\"#{col.name},omitempty\" db:\"#{col.name}\" #{valid_tags}"
93
95
  end
94
-
95
96
  end
96
97
  end
97
98
 
98
99
  require_relative 'association'
100
+ require_relative 'validator'
@@ -0,0 +1,60 @@
1
+ module GoOnRails
2
+ class Validator
3
+ TAG_DELIM = ","
4
+
5
+ def initialize(klass)
6
+ @klass = klass
7
+ end
8
+ attr_reader :klass
9
+
10
+ def build_validator_tag(col)
11
+ # ignore checking for some automaticly created fields
12
+ return "valid:\"-\"" if %w(id created_at updated_at).include?(col.name)
13
+ tags = []
14
+
15
+ validators = self.klass.validators_on col.name
16
+
17
+ validators.each do |validator|
18
+ tags.concat get_validation(validator, col)
19
+ end
20
+
21
+ tags << 'optional' if col.null && !tags.empty? && tags.exclude?('required')
22
+
23
+ if tags.present?
24
+ return "valid:\"#{tags.uniq.join(TAG_DELIM)}\""
25
+ else
26
+ return "valid:\"-\""
27
+ end
28
+ end
29
+
30
+ def get_validation(validator, col)
31
+ rules = []
32
+ case validator.class.to_s
33
+ when "ActiveRecord::Validations::PresenceValidator"
34
+ rules << "required"
35
+ when "ActiveModel::Validations::FormatValidator"
36
+ if validator.options && validator.options[:with] && ['string', 'text'].include?(col.type.to_s)
37
+ re = $1 || ".*" if validator.options[:with].inspect =~ /\/(.*)\//
38
+ rules << "matches(#{re})"
39
+ end
40
+ when "ActiveModel::Validations::NumericalityValidator"
41
+ if validator.options && validator.options[:only_integer]
42
+ rules << "IsInt"
43
+ else
44
+ rules << "IsNumeric"
45
+ end
46
+ when "ActiveRecord::Validations::LengthValidator"
47
+ if validator.options && ['string', 'text'].include?(col.type.to_s)
48
+ if validator.options[:is]
49
+ min = max = validator.options[:is]
50
+ else
51
+ min = validator.options[:minimum] ? validator.options[:minimum] : 0
52
+ max = validator.options[:maximum] ? validator.options[:maximum] : 4_294_967_295
53
+ end
54
+ rules << sprintf("length(%d|%d)", min, max)
55
+ end
56
+ end
57
+ rules
58
+ end
59
+ end
60
+ end
@@ -16,6 +16,8 @@ import (
16
16
  <%- if @struct_info[:has_datetime_type] -%>
17
17
  "time"
18
18
  <%- end -%>
19
+
20
+ "github.com/asaskevich/govalidator"
19
21
  )
20
22
 
21
23
  type <%= @model_name %> struct {
@@ -318,6 +320,15 @@ func Create<%= @model_name %>(am map[string]interface{}) (int64, error) {
318
320
  }
319
321
 
320
322
  func (var_<%= model_name_underscore %> *<%= @model_name %>) Create() error {
323
+ ok, err := govalidator.ValidateStruct(var_<%= model_name_underscore %>)
324
+ if !ok {
325
+ errMsg := "Validate <%= @model_name %> struct error: Unknown error"
326
+ if err != nil {
327
+ errMsg = "Validate <%= @model_name %> struct error: " + err.Error()
328
+ }
329
+ log.Println(errMsg)
330
+ return errors.New(errMsg)
331
+ }
321
332
  <%- unless @struct_info[:timestamp_cols].empty? -%>
322
333
  t := time.Now()
323
334
  <%- @struct_info[:timestamp_cols].each do |c| -%>
@@ -325,7 +336,7 @@ func (var_<%= model_name_underscore %> *<%= @model_name %>) Create() error {
325
336
  <%- end -%>
326
337
  <%- end -%>
327
338
  sql := `INSERT INTO <%= table_name %> (<%= col_names.join(",") %>) VALUES (:<%= col_names.join(",:") %>)`
328
- _, err := db.NamedExec(sql, var_<%= model_name_underscore %>)
339
+ _, err = db.NamedExec(sql, var_<%= model_name_underscore %>)
329
340
  return err
330
341
  }
331
342
 
@@ -561,6 +572,15 @@ func destroy<%= @model_name %>Associations(ids ...int64) {
561
572
  <%- end -%>
562
573
 
563
574
  func (var_<%= model_name_underscore %> *<%= @model_name %>) Save() error {
575
+ ok, err := govalidator.ValidateStruct(var_<%= model_name_underscore %>)
576
+ if !ok {
577
+ errMsg := "Validate <%= @model_name %> struct error: Unknown error"
578
+ if err != nil {
579
+ errMsg = "Validate <%= @model_name %> struct error: " + err.Error()
580
+ }
581
+ log.Println(errMsg)
582
+ return errors.New(errMsg)
583
+ }
564
584
  if var_<%= model_name_underscore %>.Id == 0 {
565
585
  return errors.New("Invalid Id field: it can't be a zero value")
566
586
  }
@@ -570,7 +590,7 @@ func (var_<%= model_name_underscore %> *<%= @model_name %>) Save() error {
570
590
  sqlFmt := `UPDATE <%= table_name %> SET %s WHERE id = %v`
571
591
  <%- save_col_names = col_names - ["created_at"] -%>
572
592
  sqlStr := fmt.Sprintf(sqlFmt, "<%= save_col_names.zip(save_col_names).map{|c| c.join(" = :")}.join(", ") %>", var_<%= model_name_underscore %>.Id)
573
- _, err := db.NamedExec(sqlStr, var_<%= model_name_underscore %>)
593
+ _, err = db.NamedExec(sqlStr, var_<%= model_name_underscore %>)
574
594
  return err
575
595
  }
576
596
 
data/lib/tasks/gor.rake CHANGED
@@ -8,7 +8,8 @@ namespace :gor do
8
8
  github.com/gorilla/mux \
9
9
  github.com/mattn/go-sqlite3 \
10
10
  github.com/go-sql-driver/mysql \
11
- github.com/lib/pq"
11
+ github.com/lib/pq \
12
+ github.com/asaskevich/govalidator"
12
13
  puts 'Installation completed!'
13
14
  end
14
15
  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.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - B1nj0y
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-02 00:00:00.000000000 Z
11
+ date: 2017-05-05 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
@@ -23,6 +23,7 @@ files:
23
23
  - lib/generators/gor/USAGE
24
24
  - lib/generators/gor/go-on-rails/association.rb
25
25
  - lib/generators/gor/go-on-rails/converter.rb
26
+ - lib/generators/gor/go-on-rails/validator.rb
26
27
  - lib/generators/gor/gor_generator.rb
27
28
  - lib/generators/gor/templates/db.go.erb
28
29
  - lib/generators/gor/templates/favicon.ico