ns_service_pack 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG CHANGED
@@ -1,8 +1,19 @@
1
+ #== TODO
2
+
1
3
  #==============History:
4
+ #==0.1.7
5
+
6
+ #==0.1.6
7
+ * Fix README 文件中的忘加Ns::的bug
8
+ * 增大page_size的每页限制,原来250改为5000
9
+ * mapping列表中移除键值中的mapping
10
+ * 查找时提供select支持
11
+ * 增加业务删除接口支持: destroy
12
+ * Fix oracle 引用的bug
13
+
2
14
  #==0.1.4
3
15
  * 移除layout中对主项目中application js/css的调用
4
16
 
5
-
6
17
  #==0.1.3
7
18
  * 为内置视图添加layout
8
19
  * 添加对以前版本的兼容(load mapping时的键值变化)
data/README.rdoc CHANGED
@@ -36,8 +36,8 @@
36
36
 
37
37
  * 获取最新版本: gem install ns_service_pack
38
38
  * rails项目根目录下: nsp install && bundle install(此步检查下Gemfile,确保引用最新,或gem 'ns_service_pack', '~>0.1')
39
- * 相关Models中明确引用: include FieldMapping
40
- * ApplicationController或!子类!中添加引用: include ControllerServicable
39
+ * 相关Models中明确引用: include Ns::FieldMapping
40
+ * ApplicationController或!子类!中添加引用: include Ns::ControllerServicable
41
41
 
42
42
  # 验证是否成功?
43
43
  * 访问: http://service_post:port/, 非生产环境会重定向到/interfaces, 点击示例中的链接(动态生成)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.1.6
@@ -5,7 +5,7 @@
5
5
  <%if v.is_a?(Hash)%>
6
6
  <%v.each_with_index do |e1, i|%>
7
7
  <tr>
8
- <td> <%= i==0 ? k : ''%></td>
8
+ <td> <%= i==0 ? k.to_s.gsub('_mapping', '') : ''%></td>
9
9
  <td> <%= e1[0]%> </td>
10
10
  <td> <%= e1[1]%> </td>
11
11
  </tr>
@@ -29,7 +29,7 @@ class Ns::ScaffoldGenerator < Rails::Generators::ScaffoldGenerator
29
29
  #TODO MOVE dev interface TO this gem controller
30
30
  gsub_file('config/routes.rb', /^\s*resources :#{plural_name}$/) do
31
31
  <<-Doc
32
- resources :#{plural_name}, :except=>[:edit, :destroy]
32
+ resources :#{plural_name}, :except=>[:edit]
33
33
  Doc
34
34
  end
35
35
  end
@@ -18,6 +18,7 @@ module Ns
18
18
  end
19
19
 
20
20
  def self.delete()
21
+ request('delete', url, params)
21
22
  end
22
23
 
23
24
  def self.request(action = 'get', url = '', data_params = {})
@@ -32,6 +33,12 @@ module Ns
32
33
  raise ResultError.new(result)
33
34
  end
34
35
  end
36
+
37
+ def self.ajax_request(action = 'get', url = '', data_params = {})
38
+ #TODO 网路异常处理
39
+ json_response = RestClient.send(action, url, :data=>data_params)
40
+ #render :json=>json_response
41
+ end
35
42
 
36
43
  def self.unpack(json_response_str = nil)
37
44
  Result.new(JSON.parse(json_response_str))
@@ -2,55 +2,24 @@
2
2
  module Ns
3
3
  module ControllerServicable
4
4
  def index
5
- @result = paginate(params) do |start, page_size|
5
+ @result = model_class.paginate(params) do |start, page_size|
6
6
  get_page_data(start, page_size, params)
7
7
  end
8
8
  render :json=>ResultPacker.data(@result.as_json)
9
9
  end
10
-
10
+
11
11
  #return [total_count, page_data]
12
12
  #可在子类中覆盖定制
13
13
  def get_page_data(start = 0, size = 10, params = {})
14
- where_conds = if @conds.present?
15
- @conds
16
- else
17
- query_conditionize(params, @conds)
18
- end
14
+ where_conds = @conds.present? ? @conds : model_class.arrayify_conds(params)
19
15
  logger.debug "====>conds: #{where_conds.inspect}"
20
16
  conds = {:conditions=>where_conds}
21
17
  total_count = model_class.count(conds)
22
- page_params = conds.merge!(:offset=>start, :limit=>size, :order=>params[:order])
18
+ page_params = conds.merge!(:select=>model_class.select_fields(params[:select]),
19
+ :offset=>start, :limit=>size, :order=>params[:order])
23
20
  page_data = model_class.all(page_params)
24
21
  [total_count, page_data]
25
22
  end
26
-
27
- def query_conditionize(params = {}, conds = {})
28
- #清除空条件
29
- params.delete_if{|k, v| v.blank? }
30
- #TODO 有@conds时如何融入???
31
- #hash结构
32
- conds = model_class.db_hashize(params)
33
- end
34
-
35
- #分页方法 # 加入文档说明
36
- def paginate(params = {})
37
- current_page = params[:current_page].to_i
38
- current_page = current_page < 1 ? 1 : current_page
39
- page_size = params[:page_size].to_i
40
- page_size = page_size <= 0 ? 10 : page_size
41
- page_size = page_size > 250 ? 250 : page_size
42
- offset = (current_page-1)*page_size
43
- #返回总数和当前页数据 起始位置, 数量
44
- total_count, page_data = yield(offset, page_size)
45
- {
46
- :total_size=>total_count,
47
- :page_size=>page_size,
48
- :current_page=>current_page,
49
- :page_from=>offset + 1,
50
- :page_to=>offset + page_data.size,
51
- :page_items=>page_data
52
- }
53
- end
54
23
 
55
24
  #get a new buz obj with db default value
56
25
  def new
@@ -60,15 +29,15 @@ module Ns
60
29
 
61
30
  #查找单条记录
62
31
  def show
63
- @_obj = model_class.find(params[:id])
64
- render :json=>ResultPacker.data(@_obj.as_json)
32
+ @_obj = model_class._find_resource(params)
33
+ render :json=>ResultPacker.data(@_obj, "获取#{model_class.name}##{@_obj.respond_to?(:id) ? @_obj.id : @_obj.object_id}成功!")
65
34
  end
66
-
35
+
67
36
  #创建记录
68
37
  def create
69
38
  @_obj = model_class.new_from_buz(params[:data])
70
39
  if @_obj.save
71
- render :json=>ResultPacker.data(@_obj)
40
+ render :json=>ResultPacker.data(@_obj, "创建#{model_class.name}##{@_obj.respond_to?(:id) ? @_obj.id : @_obj.object_id}成功!")
72
41
  else
73
42
  render :json=>ResultPacker.help(valid_errors(model_class.buz_hashize(@_obj.errors.to_hash)))
74
43
  end
@@ -78,12 +47,27 @@ module Ns
78
47
  def update
79
48
  @_obj = model_class.find(params[:id])
80
49
  if @_obj.update_from_buz(params[:data])
81
- render :json=>ResultPacker.data(@_obj)
50
+ render :json=>ResultPacker.data(@_obj, "更新#{model_class.name}##{@_obj.respond_to?(:id) ? @_obj.id : @_obj.object_id}成功!")
82
51
  else
83
52
  render :json=>ResultPacker.help(valid_errors(model_class.buz_hashize(@_obj.errors.to_hash)))
84
53
  end
85
54
  end
86
55
 
56
+ #更新记录 # 在获取时要做过滤判断!! TODO
57
+ def destroy
58
+ @_obj = model_class.find(params[:id])
59
+ if model_class.mapping.keys.include?(:status) && !params.key?(:force_del)
60
+ if @_obj.update_from_buz(:status=>'作废')
61
+ render :json=>ResultPacker.data(@_obj, "该记录已被逻辑删除(状态标记为:作废!)")
62
+ else
63
+ render :json=>ResultPacker.help(valid_errors(model_class.buz_hashize(@_obj.errors.to_hash)))
64
+ end
65
+ else
66
+ @_obj.destroy
67
+ render :json=>ResultPacker.data(@_obj, "警告:资源(#{model_class.name}##{@_obj.respond_to?(:id) ? @_obj.id : @_obj.object_id})已被物理删除!此资源不具备逻辑删除条件具有status业务属性或被内部强制删除!")
68
+ end
69
+ end
70
+
87
71
  protected
88
72
  #验证错误回传
89
73
  def valid_errors(error_hash = {})
@@ -40,8 +40,119 @@ module Ns
40
40
  def update_from_buz(params={})
41
41
  update_attributes(self.class.db_hashize(params))
42
42
  end
43
+
44
+ #获取对象的某个属性的业务值
45
+ def buz_value(buz_attr = nil)
46
+ result = nil
47
+ if buz_attr
48
+ db_key = self.class.mapping[buz_attr.to_sym]
49
+ if db_key
50
+ db_value = send(db_key)
51
+ #TODO BETTER
52
+ result = self.class.buz_hashize(db_key=>db_value)[buz_attr.to_sym]
53
+ end
54
+ end
55
+ result
56
+ end
57
+
58
+ def erp_admin?(params = {})
59
+ self.class.erp_admin?(params)
60
+ end
43
61
 
44
62
  module ClassMethods
63
+
64
+ def _find_resource(params = {})
65
+ obj = find(params[:id])
66
+ if mapping.keys.include?(:status) && !erp_admin?(params)
67
+ buz_value = get_map_value(:status, obj.send(mapping[:status]))
68
+ if buz_value == '作废'
69
+ raise "资源#{name}##{obj.object_id}已经作废不可用!"
70
+ end
71
+ end
72
+ obj
73
+ end
74
+
75
+ #convert buz array to db array
76
+ def dbize_array(buz_array = [])
77
+ result = nil
78
+ if buz_array && buz_array.is_a?(Array)
79
+ result = buz_array.map do |e|
80
+ db_key = mapping[e.to_sym] rescue nil
81
+ end.compact
82
+ end
83
+ result
84
+ end
85
+
86
+ def select_fields(array = [])
87
+ db_keys = dbize_array(array) || mapping.values
88
+ #FIXME 添加是否是数据属性的判断 better
89
+ attrs = new.attributes.keys.map(&:to_sym)
90
+ db_keys & attrs
91
+ rescue nil
92
+ end
93
+
94
+ #分页方法 # 加入文档说明
95
+ def paginate(params = {})
96
+ current_page = params[:current_page].to_i
97
+ current_page = current_page < 1 ? 1 : current_page
98
+ page_size = params[:page_size].to_i
99
+ page_size = page_size <= 0 ? 10 : page_size
100
+ #increment the limit
101
+ page_size = page_size > 5000 ? 5000 : page_size
102
+ offset = (current_page-1)*page_size
103
+ #返回总数和当前页数据 起始位置, 数量
104
+ total_count, page_data = yield(offset, page_size)
105
+ {
106
+ :total_size=>total_count,
107
+ :page_size=>page_size,
108
+ :current_page=>current_page,
109
+ :page_from=>offset + 1,
110
+ :page_to=>offset + page_data.size,
111
+ :page_items=>page_data
112
+ }
113
+ end
114
+
115
+ #将外界条件转化为一个数组
116
+ def arrayify_conds(params = {})
117
+ #清除空条件
118
+ params.delete_if{|k, v| v.blank? }
119
+
120
+ field_hash = {}
121
+ mapping_hash = {}
122
+ params.each do |k, v|
123
+ the_key = k.to_sym
124
+ if mapping.keys.include?(the_key)
125
+ field_hash[the_key] = get_map_value(the_key, v)
126
+ mapping_hash[the_key] = mapping[the_key]
127
+ end
128
+ end
129
+ result_array = []
130
+ cond_str = ""
131
+ if params[:extra_where_sql]
132
+ cond_str << params[:extra_where_sql].to_s
133
+ end
134
+
135
+ if mapping_hash.present?
136
+ cond_str << " and "
137
+ cond_str << mapping_hash.map do |buz_key, db_key|
138
+ "#{db_key} = :#{buz_key}"
139
+ end.join(" and ")
140
+ end
141
+ unless erp_admin?(params) && mapping.keys.include?(:status)
142
+ cond_str << " and " if cond_str.present?
143
+ cond_str << " #{mapping[:status]} != -1" #TODO FIXME -1 use
144
+ end
145
+
146
+ result_array << cond_str
147
+ result_array << field_hash
148
+ result_array
149
+ end
150
+
151
+ #@params invoke_src: erp_admin
152
+ def erp_admin?(params = {})
153
+ params[:invoke_src] == 'erp_admin'
154
+ end
155
+
45
156
  #Fix a bug on 20111117 by shang, this override the original method name
46
157
  def __model_clazz_name
47
158
  self.name.underscore
@@ -1,4 +1,4 @@
1
- #coding: utf-8
1
+ #encoding: utf-8
2
2
  =begin
3
3
  * 20111115 find bug
4
4
  避免每次重新生成CodeHash的对象
@@ -4,7 +4,7 @@
4
4
  # It is recommended to set time zone in TZ environment variable so that the same timezone will be used by Ruby and by Oracle session
5
5
  #ENV['TZ'] = 'UTC'
6
6
 
7
- if defined?(ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter)
7
+ if defined?(ActiveRecord::ConnectionAdapters::OracleEnhancedRailtie)
8
8
  ActiveSupport.on_load(:active_record) do
9
9
  ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.class_eval do
10
10
  # id columns and columns which end with _id will always be converted to integers
@@ -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.5"
8
+ s.version = "0.1.6"
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-12-05"
12
+ s.date = "2011-12-07"
13
13
  s.description = "abstract some common pattern to service pack"
14
14
  s.email = "cao7113@hotmail.com"
15
15
  s.executables = ["nsp"]
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.5
4
+ version: 0.1.6
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-12-05 00:00:00.000000000Z
12
+ date: 2011-12-07 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
16
- requirement: &89924740 !ruby/object:Gem::Requirement
16
+ requirement: &85246320 !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: *89924740
24
+ version_requirements: *85246320
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: thor
27
- requirement: &89924450 !ruby/object:Gem::Requirement
27
+ requirement: &85246000 !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: *89924450
35
+ version_requirements: *85246000
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: shoulda
38
- requirement: &89924150 !ruby/object:Gem::Requirement
38
+ requirement: &85245700 !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: *89924150
46
+ version_requirements: *85245700
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bundler
49
- requirement: &89923850 !ruby/object:Gem::Requirement
49
+ requirement: &85245420 !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: *89923850
57
+ version_requirements: *85245420
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: jeweler
60
- requirement: &89923580 !ruby/object:Gem::Requirement
60
+ requirement: &85245180 !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: *89923580
68
+ version_requirements: *85245180
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rcov
71
- requirement: &89923340 !ruby/object:Gem::Requirement
71
+ requirement: &85244940 !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: *89923340
79
+ version_requirements: *85244940
80
80
  description: abstract some common pattern to service pack
81
81
  email: cao7113@hotmail.com
82
82
  executables:
@@ -141,7 +141,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
141
141
  version: '0'
142
142
  segments:
143
143
  - 0
144
- hash: 1046210893
144
+ hash: -447924557
145
145
  required_rubygems_version: !ruby/object:Gem::Requirement
146
146
  none: false
147
147
  requirements: