ns_service_pack 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,8 +1,13 @@
1
1
  #==============History:
2
- * 增加service scaffold generator
2
+
3
+ #==0.1.1
4
+ * 将该gem升级为rails项目中的engine
5
+ * 增加了一个默认的info_controller,反射出当前应用发布的api接口(仅可在非产品模式访问)
6
+
3
7
 
4
8
  #==0.1.0[Note: 重大变更!]
5
- * 初始化配置文件copy由thor任务完成: ns_service_pack init (在rails根目录下)
9
+ * 增加service scaffold generator: rake generator ns:scaffold
10
+ * 初始化配置文件copy由thor任务完成: ns_service_pack install (在rails根目录下)
6
11
  * 将ApplicationControllerModule重命名为:Ns::ControllerServicable
7
12
  * 在initializers/ns_service_pack.rb中默认只加载配置信息,不再为controller和model包含mapping的功能,由最终用户
8
13
  决定是否使用,这样做性能和可定制性更好(后来加上scaffold功能,减少人为操作!)
data/README.rdoc CHANGED
@@ -9,10 +9,10 @@
9
9
  * 提供数据库层-业务层字段自动转换
10
10
 
11
11
  == TODO TASK LIST
12
- * 添加一个默认controller用于展现interface等信息
13
12
  * 规划文档和内容调整
14
13
  * 写完整测试
15
14
  * index默认查询条件加入,传入条件的merge(目前已提供传入条件的精确搜索)
15
+ * 如何用get请求模拟post请求
16
16
 
17
17
  #==NS Service Pack使用指南
18
18
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
@@ -0,0 +1,37 @@
1
+ #encoding: utf-8
2
+ class Ns::InfoController < ApplicationController
3
+ unloadable #??? 什么意思?
4
+ #动态查看该模块发布接口列表
5
+ def interfaces
6
+ @routes = Rails.application.routes.routes
7
+ #删除一些无需关注的路由: /assets, /rails/info/properties, /interfaces
8
+ @routes.delete_if{|r| r.path =~ /\/assets|\/rails\/info|\/interfaces/}
9
+ #验证接口是否改变的校验码
10
+ @version_code = @routes.join(';').hash
11
+ respond_to do |format|
12
+ format.html #interfaces.html.erb
13
+ format.json {render json: @routes.map{|r| r.path}}
14
+ end
15
+ end
16
+
17
+ #获取字段映射对照表
18
+ def mappings
19
+ @data = GlobalConst.mappings
20
+ #验证接口是否改变的校验码
21
+ @version_code = @data.hash
22
+ respond_to do |format|
23
+ format.html
24
+ format.json {render json: @data}
25
+ end
26
+ end
27
+
28
+ def constants
29
+ @data = GlobalConst.constants
30
+ #验证接口是否改变的校验码
31
+ @version_code = @data.hash
32
+ respond_to do |format|
33
+ format.html {render :action=>:mappings}
34
+ format.json {render json: @data}
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,42 @@
1
+ <p>模块发布接口列表(版本码:<%=@version_code%> 获取日期:<%= Time.now.to_s(:db)%>):</p>
2
+
3
+ <table border='1'>
4
+ <tr>
5
+ <th>No.</th>
6
+ <th>HttpMethod</th>
7
+ <th>Path</th>
8
+ <th>Sample</th>
9
+ <th>Requirements </th>
10
+ </tr>
11
+ <%@routes.each_with_index do |r, i|%>
12
+ <tr>
13
+ <td>
14
+ <%= i+1 %>
15
+ </td>
16
+ <td>
17
+ <%= r.verb%>
18
+ </td>
19
+ <td>
20
+ <%= r.path%>
21
+ </td>
22
+ <td>
23
+ <%#= link_to r.name || "示例", "#{r.path.sub('(.:format)', '.json').sub(':id', '1')}}" %>
24
+ <%if r.verb.to_s.upcase == 'GET' %>
25
+ <%=link_to r.name || "示例", "#{r.path.sub('(.:format)', '.json').sub(':id', '1')}" %>
26
+ <%else%>
27
+ <%= "#{r.path.sub('(.:format)', '').sub(':id', '1')}" %>
28
+ <%end%>
29
+ </td>
30
+ <td>
31
+ <%= r.requirements%>
32
+ </td>
33
+ </tr>
34
+ <%end%>
35
+ </table>
36
+
37
+ <div>
38
+ <span>注:</span>
39
+ <ul>
40
+ <li>:format 一般为 json</li>
41
+ </ul>
42
+ </div>
@@ -0,0 +1,21 @@
1
+ <p>业务-数据库字段对照表(版本码:<%=@version_code%> 获取日期:<%= Time.now.to_s(:db)%>):</p>
2
+
3
+ <table border='1'>
4
+ <%@data.each do |k, v|%>
5
+ <%if v.is_a?(Hash)%>
6
+ <%v.each_with_index do |e1, i|%>
7
+ <tr>
8
+ <td> <%= i==0 ? k : ''%></td>
9
+ <td> <%= e1[0]%> </td>
10
+ <td> <%= e1[1]%> </td>
11
+ </tr>
12
+ <%end%>
13
+ <%else%>
14
+ <tr>
15
+ <td> <%= k%> </td>
16
+ <td> <%= v%> </td>
17
+ <td> &nbsp; </td>
18
+ </tr>
19
+ <%end%>
20
+ <%end%>
21
+ </table>
data/config/routes.rb ADDED
@@ -0,0 +1,10 @@
1
+ #encoding: utf-8
2
+
3
+ # 发布的接口仅在非生产模式可访问
4
+ unless Rails.env.production?
5
+ Rails.application.routes.draw do
6
+ get 'interfaces', :to=>"ns/info#interfaces"
7
+ get 'constants', :to=>"ns/info#constants"
8
+ get 'mappings', :to=>"ns/info#mappings"
9
+ end
10
+ end
@@ -25,17 +25,11 @@ class Ns::ScaffoldGenerator < Rails::Generators::ScaffoldGenerator
25
25
  end
26
26
 
27
27
  desc "Modify the route to add some action support"
28
- def interfaces
28
+ def reroute
29
+ #TODO MOVE dev interface TO this gem controller
29
30
  gsub_file('config/routes.rb', /^\s*resources :#{plural_name}$/) do
30
31
  <<-Doc
31
- resources :#{plural_name}, :except=>[:new, :edit, :destroy] do
32
- collection do
33
- get 'new_buz_obj'
34
- #TODO MOVE INTO THE GEM
35
- get 'field_mapping'
36
- get 'interfaces'
37
- end
38
- end
32
+ resources :#{plural_name}, :except=>[:edit, :destroy]
39
33
  Doc
40
34
  end
41
35
  end
@@ -52,6 +52,12 @@ module Ns
52
52
  }
53
53
  end
54
54
 
55
+ #get a new buz obj with db default value
56
+ def new
57
+ @_data = model_class.buz_hashize
58
+ render :json=>ResultPacker.data(model_class.name.underscore.to_sym=>@_data)
59
+ end
60
+
55
61
  #查找单条记录
56
62
  def show
57
63
  @_obj = model_class.find(params[:id])
@@ -77,32 +83,10 @@ module Ns
77
83
  render :json=>ResultPacker.help(valid_errors(model_class.buz_hashize(@_obj.errors.to_hash)))
78
84
  end
79
85
  end
80
-
81
- #get a new buz obj with db default value
82
- def new_buz_obj
83
- @_data = model_class.buz_hashize
84
- render :json=>ResultPacker.data(model_class.name.underscore.to_sym=>@_data)
85
- end
86
-
87
- #get the mapping info
88
- def field_mapping
89
- @_data = model_class.mapping.data
90
- render :json=>ResultPacker.data(:field_mapping=>@_data)
91
- end
92
-
93
- #动态查看该模块发布接口列表
94
- def interfaces
95
- @routes = Rails.application.routes.routes
96
- #TODO 写一个像rails info一样的那种内置controller
97
- respond_to do |format|
98
- format.html #interfaces.html.erb
99
- format.json {render json: @routes.map{|r| r.path}}
100
- end
101
- end
102
86
 
103
87
  protected
104
88
  #验证错误回传
105
- def valid_errors(error_hash={})
89
+ def valid_errors(error_hash = {})
106
90
  (error_hash||{}).each{|k, v| error_hash[k] = v.join(', ') if v.is_a? Array }
107
91
  end
108
92
  end
@@ -0,0 +1,9 @@
1
+ #encoding: utf-8
2
+
3
+ require 'rails'
4
+ module Ns
5
+ class Engine < Rails::Engine
6
+ engine_name :ns_service_pack
7
+ end
8
+ end
9
+
@@ -65,23 +65,6 @@ module Ns
65
65
  end
66
66
  end
67
67
 
68
- def dump_new(force=true)
69
- if defined?(Rails)
70
- file = "#{Rails.root}/data/#{model_key}.yml.#{Time.now.to_i}"
71
- path = File.dirname(file)
72
- FileUtils.mkpath(path) unless File.directory?(path)
73
- existed = File.exists?(file)
74
- if existed
75
- puts "Warning: #{file} has existed! check it! Default override it!"
76
- end
77
- if !existed || force
78
- File.open(file, 'w+') do |f|
79
- f.puts YAML.dump(buz_hashize)
80
- end
81
- end
82
- end
83
- end
84
-
85
68
  #辅助方法
86
69
  def new_from_buz(params = {})
87
70
  new(db_hashize(params))
@@ -3,6 +3,9 @@
3
3
  * 20111115 find bug
4
4
  避免每次重新生成CodeHash的对象
5
5
  * TODO 在项目中要分自己用的还是提供给外边的
6
+ * 将常量部分和mapping部分进行分离 TODO
7
+ 常量在宿主应用中要引用
8
+ mapping只在插件内部使用,用户只需按要求进行配置
6
9
  =end
7
10
  require 'fileutils'
8
11
  module GlobalConst
@@ -10,12 +13,26 @@ module GlobalConst
10
13
 
11
14
  mattr_accessor :global_data
12
15
  @@global_data = {}
13
-
16
+
17
+ #TODO 加载的时候直接生成方法,而不用这样动态查找,效率会更好吗?
14
18
  def self.method_missing(method_name, *args, &block)
15
19
  ms = method_name.to_sym
16
20
  return @@global_data[ms] if @@global_data.key?(ms)
17
21
  raise "Method name: #{method_name}(#{args.inspect}) is not defined!"
18
22
  end
23
+
24
+ def self.constants
25
+ data = @@global_data.select{|k| k.to_s !~ /\w+_mapping$/}.dup
26
+ data.map{|k, v| data[k] = v.data}
27
+ data
28
+ end
29
+
30
+ # TODO 考虑在数据结构和设置时优化
31
+ def self.mappings
32
+ data = @@global_data.select{|k| k.to_s =~ /\w+_mapping$/}.dup
33
+ data.map{|k, v| data[k] = v.data}
34
+ data
35
+ end
19
36
 
20
37
  def self.load_code_hashes!(hash_or_file = {})
21
38
  if hash_or_file.is_a?(Hash)
@@ -24,14 +41,14 @@ module GlobalConst
24
41
  h = YAML.load(File.open(hash_or_file))
25
42
  unless h.is_a?(Hash)
26
43
  #格式异常检查,过滤掉空和无效文件
27
- puts "==>Warning: Invalid arguments: #{hash_or_file}, it does not evalute to a Hash!你自己去看看,别找我!"
44
+ puts "==>Warning: Invalid arguments: #{hash_or_file}, it does not evalute to a Hash!你自己去看,别找我!"
28
45
  return
29
46
  end
30
47
  end
31
48
  nh = h.symbolize_keys
32
49
  nh.keys.each do |k|
33
50
  if @@global_data.key?(k)
34
- puts "==>Warning: new value(from #{hash_or_file.inspect}) is set for key:#{k}! Please check that is your need!"
51
+ puts "==>Warning: new value(from #{hash_or_file.inspect}) is set for key:#{k}! Please check that!"
35
52
  end
36
53
  @@global_data[k] = CodeHash.new(nh[k])
37
54
  end
@@ -15,3 +15,7 @@ require 'ns_service_pack/controller_servicable'
15
15
  require 'ns_service_pack/client'
16
16
  require 'ns_service_pack/service_config'
17
17
  # TODO FOR optimize
18
+
19
+ # 将本应用作为一个engine
20
+ require 'ns_service_pack/engine' if defined?(Rails)
21
+
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "ns_service_pack"
8
- s.version = "0.1.0"
8
+ s.version = "0.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Caory, Shang, Geogeous"]
12
- s.date = "2011-11-30"
12
+ s.date = "2011-12-01"
13
13
  s.description = "abstract some common pattern to service pack"
14
14
  s.email = "cao7113@hotmail.com"
15
15
  s.executables = ["nsp"]
@@ -26,7 +26,11 @@ Gem::Specification.new do |s|
26
26
  "README.rdoc",
27
27
  "Rakefile",
28
28
  "VERSION",
29
+ "app/controllers/ns/info_controller.rb",
30
+ "app/views/ns/info/interfaces.html.erb",
31
+ "app/views/ns/info/mappings.html.erb",
29
32
  "bin/nsp",
33
+ "config/routes.rb",
30
34
  "lib/generators/ns/scaffold/scaffold_generator.rb",
31
35
  "lib/generators/ns/scaffold/templates/active_record/model/model.rb",
32
36
  "lib/generators/ns/scaffold/templates/rails/scaffold_controller/controller.rb",
@@ -36,6 +40,7 @@ Gem::Specification.new do |s|
36
40
  "lib/ns_service_pack/client.rb",
37
41
  "lib/ns_service_pack/code_hash.rb",
38
42
  "lib/ns_service_pack/controller_servicable.rb",
43
+ "lib/ns_service_pack/engine.rb",
39
44
  "lib/ns_service_pack/field_mapping.rb",
40
45
  "lib/ns_service_pack/global_const.rb",
41
46
  "lib/ns_service_pack/result.rb",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ns_service_pack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-30 00:00:00.000000000Z
12
+ date: 2011-12-01 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
16
- requirement: &78640940 !ruby/object:Gem::Requirement
16
+ requirement: &80545720 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.6.7
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *78640940
24
+ version_requirements: *80545720
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: thor
27
- requirement: &78640700 !ruby/object:Gem::Requirement
27
+ requirement: &80545480 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.14.6
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *78640700
35
+ version_requirements: *80545480
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: shoulda
38
- requirement: &78640460 !ruby/object:Gem::Requirement
38
+ requirement: &80545240 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *78640460
46
+ version_requirements: *80545240
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bundler
49
- requirement: &78640220 !ruby/object:Gem::Requirement
49
+ requirement: &80545000 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.0.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *78640220
57
+ version_requirements: *80545000
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: jeweler
60
- requirement: &78639980 !ruby/object:Gem::Requirement
60
+ requirement: &80544760 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.6.4
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *78639980
68
+ version_requirements: *80544760
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rcov
71
- requirement: &78639740 !ruby/object:Gem::Requirement
71
+ requirement: &80544520 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *78639740
79
+ version_requirements: *80544520
80
80
  description: abstract some common pattern to service pack
81
81
  email: cao7113@hotmail.com
82
82
  executables:
@@ -94,7 +94,11 @@ files:
94
94
  - README.rdoc
95
95
  - Rakefile
96
96
  - VERSION
97
+ - app/controllers/ns/info_controller.rb
98
+ - app/views/ns/info/interfaces.html.erb
99
+ - app/views/ns/info/mappings.html.erb
97
100
  - bin/nsp
101
+ - config/routes.rb
98
102
  - lib/generators/ns/scaffold/scaffold_generator.rb
99
103
  - lib/generators/ns/scaffold/templates/active_record/model/model.rb
100
104
  - lib/generators/ns/scaffold/templates/rails/scaffold_controller/controller.rb
@@ -104,6 +108,7 @@ files:
104
108
  - lib/ns_service_pack/client.rb
105
109
  - lib/ns_service_pack/code_hash.rb
106
110
  - lib/ns_service_pack/controller_servicable.rb
111
+ - lib/ns_service_pack/engine.rb
107
112
  - lib/ns_service_pack/field_mapping.rb
108
113
  - lib/ns_service_pack/global_const.rb
109
114
  - lib/ns_service_pack/result.rb
@@ -134,7 +139,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
134
139
  version: '0'
135
140
  segments:
136
141
  - 0
137
- hash: -733976717
142
+ hash: 373915261
138
143
  required_rubygems_version: !ruby/object:Gem::Requirement
139
144
  none: false
140
145
  requirements: