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 +12 -1
- data/README.rdoc +2 -2
- data/VERSION +1 -1
- data/app/views/ns/info/mappings.html.erb +1 -1
- data/lib/generators/ns/scaffold/scaffold_generator.rb +1 -1
- data/lib/ns_service_pack/client.rb +7 -0
- data/lib/ns_service_pack/controller_servicable.rb +25 -41
- data/lib/ns_service_pack/field_mapping.rb +111 -0
- data/lib/ns_service_pack/global_const.rb +1 -1
- data/lib/templates/config/initializers/oracle_db_config.rb +1 -1
- data/ns_service_pack.gemspec +2 -2
- metadata +15 -15
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.
|
1
|
+
0.1.6
|
@@ -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
|
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 =
|
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!(:
|
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.
|
64
|
-
render :json=>ResultPacker.data(@_obj.
|
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
|
@@ -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::
|
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
|
data/ns_service_pack.gemspec
CHANGED
@@ -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.
|
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-
|
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.
|
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-
|
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: &
|
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: *
|
24
|
+
version_requirements: *85246320
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: thor
|
27
|
-
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: *
|
35
|
+
version_requirements: *85246000
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: shoulda
|
38
|
-
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: *
|
46
|
+
version_requirements: *85245700
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: bundler
|
49
|
-
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: *
|
57
|
+
version_requirements: *85245420
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: jeweler
|
60
|
-
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: *
|
68
|
+
version_requirements: *85245180
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rcov
|
71
|
-
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: *
|
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:
|
144
|
+
hash: -447924557
|
145
145
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
146
146
|
none: false
|
147
147
|
requirements:
|