ns_service_pack 0.0.1
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/Gemfile +0 -0
- data/README +0 -0
- data/Rakefile +0 -0
- data/config/code_hashes.yml.sample +20 -0
- data/config/initializers/ns_service_pack.rb +5 -0
- data/lib/ns_service_pack/application_controller_module.rb +80 -0
- data/lib/ns_service_pack/code_hash.rb +47 -0
- data/lib/ns_service_pack/code_hash.rb~ +37 -0
- data/lib/ns_service_pack/field_mapping.rb +70 -0
- data/lib/ns_service_pack/global_const.rb +62 -0
- data/lib/ns_service_pack/result_packer.rb +25 -0
- data/lib/ns_service_pack/version.rb +3 -0
- data/lib/ns_service_pack.rb +38 -0
- data/lib/ns_service_pack.rb~ +26 -0
- data/ns_service_pack.gemspec +24 -0
- metadata +73 -0
data/Gemfile
ADDED
File without changes
|
data/README
ADDED
File without changes
|
data/Rakefile
ADDED
File without changes
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#coding: utf-8
|
2
|
+
|
3
|
+
#CodeHash数据格式规则:
|
4
|
+
#访问方法名(应是合法方法名)
|
5
|
+
# 键: 值
|
6
|
+
#
|
7
|
+
#数据被输送到GlobalConst命名空间下,通过如下方式访问:
|
8
|
+
#GlobalConst.genders['男'] =>0
|
9
|
+
#GlobalConst.genders[0] =>'男'
|
10
|
+
#GlobalConst.genders[key_or_value_var] =>value_or_key
|
11
|
+
|
12
|
+
genders:
|
13
|
+
男: 0
|
14
|
+
女: 1
|
15
|
+
保密: 2
|
16
|
+
|
17
|
+
booleans:
|
18
|
+
是: true
|
19
|
+
否: false
|
20
|
+
|
@@ -0,0 +1,80 @@
|
|
1
|
+
#coding: utf-8
|
2
|
+
module ApplicationControllerModule
|
3
|
+
def index
|
4
|
+
@conds ||= {}
|
5
|
+
#TODO 添加默认搜索行为
|
6
|
+
result = paginate(model_class, @conds, params)
|
7
|
+
render :json=>ResultPacker.data(result.as_json)
|
8
|
+
end
|
9
|
+
|
10
|
+
#分页方法
|
11
|
+
def paginate(base_class=nil, conds={}, params={})
|
12
|
+
#TODO
|
13
|
+
raise "参数无效!" unless base_class.superclass == ActiveRecord::Base
|
14
|
+
page_num = params[:current_page].to_i
|
15
|
+
page_num = page_num < 1 ? 1 : page_num
|
16
|
+
page_size = params[:page_size].to_i
|
17
|
+
page_size = page_size <= 0 ? 10 : page_size
|
18
|
+
page_size = page_size > 250 ? 250 : page_size
|
19
|
+
offset = (page_num-1)*page_size
|
20
|
+
|
21
|
+
total_count = base_class.count(conds)
|
22
|
+
conds.merge!(:limit=>page_size,
|
23
|
+
:offset=>offset,
|
24
|
+
:order=>params[:order])
|
25
|
+
|
26
|
+
new_conds = conds #yield conds
|
27
|
+
#添加select子句 TODO
|
28
|
+
page_data = base_class.all(new_conds)
|
29
|
+
{
|
30
|
+
:total_size=>total_count,
|
31
|
+
:page_size=>page_size,
|
32
|
+
:current_page=>page_num,
|
33
|
+
:page_from=>offset + 1,
|
34
|
+
:page_to=>offset + page_data.size,
|
35
|
+
:page_items=>page_data
|
36
|
+
}
|
37
|
+
end
|
38
|
+
#查找单条记录
|
39
|
+
def show
|
40
|
+
result = model_class.find(params[:id])
|
41
|
+
render :json=>ResultPacker.data(result.as_json)
|
42
|
+
end
|
43
|
+
|
44
|
+
#创建记录
|
45
|
+
def create
|
46
|
+
c = model_class.new_from_buz(params[:data])
|
47
|
+
if c.save
|
48
|
+
render :json=>ResultPacker.data(c)
|
49
|
+
else
|
50
|
+
render :json=>ResultPacker.help(valid_errors(model_class.buz_hashize(c.errors.to_hash)))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
#更新记录
|
55
|
+
def update
|
56
|
+
c = model_class.find(params[:id])
|
57
|
+
if c.update_from_buz(params[:data])
|
58
|
+
render :json=>ResultPacker.data(c)
|
59
|
+
else
|
60
|
+
render :json=>ResultPacker.help(valid_errors(model_class.buz_hashize(c.errors.to_hash)))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
#验证错误回传
|
65
|
+
def valid_errors(error_hash={})
|
66
|
+
(error_hash||{}).each{|k, v| error_hash[k] = v.join(', ') if v.is_a? Array }
|
67
|
+
end
|
68
|
+
|
69
|
+
#ABORTED NOW
|
70
|
+
def query_fields
|
71
|
+
data = model_class.field_maps.keys.inject({}){|result, k| result[k]=nil; result}
|
72
|
+
#model_class.new.attributes #初始值问题 TODO
|
73
|
+
render :json=>ResultPacker.data(:fields=>data)
|
74
|
+
end
|
75
|
+
|
76
|
+
#动态查看该模块发布接口列表
|
77
|
+
def interfaces
|
78
|
+
@routes = Rails.application.routes.routes
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
#coding: utf-8
|
2
|
+
=begin
|
3
|
+
用一致化方法根据key查值或反查,使用hash方法([]),如
|
4
|
+
code_hash = CodeHash.new({'普通会员'=>0, '高级会员'=>10})
|
5
|
+
code_hash['普通会员'] #=>0
|
6
|
+
dode_hash[0] #=>'普通会员'
|
7
|
+
|
8
|
+
相关概念:
|
9
|
+
key: 人可识别的编码,如‘普通会员’
|
10
|
+
value: 存入数据库的编码,一般为增加数据检索速度
|
11
|
+
|
12
|
+
规则:
|
13
|
+
* 键/值具有唯一性(符合大部分使用情况)
|
14
|
+
* 字符串键统一用字符串访问,而非符号,如code_hash['a'], not code_hash[:a] (因为很多键为汉字)
|
15
|
+
=end
|
16
|
+
class CodeHash
|
17
|
+
attr_accessor :data, :invert_data
|
18
|
+
|
19
|
+
def initialize(code_hash={})
|
20
|
+
@data = code_hash
|
21
|
+
@invert_data = code_hash.invert
|
22
|
+
end
|
23
|
+
|
24
|
+
def [](code)
|
25
|
+
#Fix a bug on 20111115
|
26
|
+
#@data[code] || @invert_data[code]||"真的没找到呀![code=#{code.to_s}]"
|
27
|
+
if @data.key?(code)
|
28
|
+
@data[code]
|
29
|
+
elsif @invert_data.key?(code)
|
30
|
+
@invert_data[code]
|
31
|
+
else
|
32
|
+
"注意:没找到对应键[#{code.to_s}]的值!"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def all
|
37
|
+
@data.merge(@invert_data)
|
38
|
+
end
|
39
|
+
|
40
|
+
def keys
|
41
|
+
@data.keys
|
42
|
+
end
|
43
|
+
|
44
|
+
def values
|
45
|
+
@data.values
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#coding: utf-8
|
2
|
+
=begin
|
3
|
+
用一致化方法根据key查值或反查,使用hash方法([]),如
|
4
|
+
code_hash = CodeHash.new({'普通会员'=>0, '高级会员'=>10})
|
5
|
+
code_hash['普通会员'] #=>0
|
6
|
+
dode_hash[0] #=>'普通会员'
|
7
|
+
相关概念:
|
8
|
+
key: 人可识别的编码,如‘普通会员’
|
9
|
+
value: 存入数据库的编码,一般为增加数据检索速度
|
10
|
+
|
11
|
+
规则:
|
12
|
+
* 键/值具有唯一性(符合大部分使用情况)
|
13
|
+
=end
|
14
|
+
class CodeHash
|
15
|
+
attr_accessor :data, :invert_data
|
16
|
+
|
17
|
+
def initialize(code_hash={})
|
18
|
+
@data = code_hash
|
19
|
+
@invert_data = code_hash.invert
|
20
|
+
end
|
21
|
+
|
22
|
+
def [](code)
|
23
|
+
@data[code] || @invert_data[code]||"真的没找到呀![code=#{code.to_s}]"
|
24
|
+
end
|
25
|
+
|
26
|
+
def all
|
27
|
+
@data.merge(@invert_data)
|
28
|
+
end
|
29
|
+
|
30
|
+
def keys
|
31
|
+
@data.keys
|
32
|
+
end
|
33
|
+
|
34
|
+
def values
|
35
|
+
@data.values
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
#coding: utf-8
|
2
|
+
=begin
|
3
|
+
字段映射,业务字段-数据库字段对应
|
4
|
+
=end
|
5
|
+
module FieldMapping
|
6
|
+
def self.included(base)
|
7
|
+
#TODO 条件检查
|
8
|
+
base.extend(ClassMethods)
|
9
|
+
end
|
10
|
+
|
11
|
+
def as_json(options={})
|
12
|
+
self.class.buz_hashize(self.attributes)
|
13
|
+
end
|
14
|
+
|
15
|
+
def update_from_buz(params={})
|
16
|
+
update_attributes(self.class.db_hashize(params))
|
17
|
+
end
|
18
|
+
|
19
|
+
module ClassMethods
|
20
|
+
def new_from_buz(params={})
|
21
|
+
new(db_hashize(params))
|
22
|
+
end
|
23
|
+
|
24
|
+
def create_from_buz(params={})
|
25
|
+
create(db_hashize(params))
|
26
|
+
end
|
27
|
+
|
28
|
+
#TODO 在包装类提供此方法,可在include前检查
|
29
|
+
def field_maps
|
30
|
+
raise "Not implemented!"
|
31
|
+
end
|
32
|
+
|
33
|
+
def inspect_fields
|
34
|
+
puts "#buz fields\t\t#db fields\t\t #the rules"
|
35
|
+
field_maps.each do |k, v|
|
36
|
+
puts "#{k}\t\t #{v} "
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_map_value(k, value)
|
41
|
+
#raise "Not implemented!"
|
42
|
+
value
|
43
|
+
end
|
44
|
+
|
45
|
+
#业务层到数据层字段的转换
|
46
|
+
def db_hashize(params={})
|
47
|
+
new_params = params.symbolize_keys
|
48
|
+
common_keys = new_params.keys & field_maps.keys
|
49
|
+
common_keys.inject({}) do |r, e|
|
50
|
+
r[field_maps[e]] = get_map_value(e, new_params[e])
|
51
|
+
r
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
#转成业务层key表示
|
56
|
+
def buz_hashize(attrs={})
|
57
|
+
#return {} if attrs.blank?
|
58
|
+
#获取默认初始值
|
59
|
+
attrs = new.attributes if attrs.blank?
|
60
|
+
new_attrs = attrs.symbolize_keys
|
61
|
+
invert_maps = field_maps.invert
|
62
|
+
common_db_attrs = new_attrs.keys & invert_maps.keys
|
63
|
+
common_db_attrs.inject({}) do |r, da|
|
64
|
+
ba = invert_maps[da]
|
65
|
+
r[ba]=get_map_value(ba, new_attrs[da])
|
66
|
+
r
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#coding: utf-8
|
2
|
+
=begin
|
3
|
+
* 20111115 find bug
|
4
|
+
避免每次重新生成CodeHash的对象
|
5
|
+
* TODO 在项目中要分自己用的还是提供给外边的
|
6
|
+
=end
|
7
|
+
require 'fileutils'
|
8
|
+
module GlobalConst
|
9
|
+
SAMPLE_FILE = "#{NS_GEM_ROOT}/config/code_hashes.yml.sample"
|
10
|
+
APP_CODE_HASHES = "config/code_hashes/"
|
11
|
+
|
12
|
+
mattr_accessor :global_data
|
13
|
+
@@global_data = {}
|
14
|
+
|
15
|
+
def self.method_missing(method_name, *args, &block)
|
16
|
+
ms = method_name.to_sym
|
17
|
+
return @@global_data[ms] if @@global_data.key?(ms)
|
18
|
+
raise "Method name: #{method_name}(#{args.inspect}) is not defined!"
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.load_code_hashes!(hash_or_file = SAMPLE_FILE)
|
22
|
+
if hash_or_file.is_a?(Hash)
|
23
|
+
h = hash_or_file
|
24
|
+
else
|
25
|
+
h = YAML.load(File.open(hash_or_file))
|
26
|
+
end
|
27
|
+
nh = h.symbolize_keys
|
28
|
+
nh.keys.each do |k|
|
29
|
+
if @@global_data.key?(k)
|
30
|
+
puts "==>Warning: new value(#{nh[k]}) is set for key:#{k}!"
|
31
|
+
end
|
32
|
+
@@global_data[k] = CodeHash.new(nh[k])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.load_app_code_hashes!(dir = APP_CODE_HASHES)
|
37
|
+
if defined? Rails
|
38
|
+
target = "#{Rails.root}/#{APP_CODE_HASHES}"
|
39
|
+
if File.directory?(target)
|
40
|
+
hfiles = Dir.glob("#{target}**/*.yml")
|
41
|
+
hfiles.each do |f|
|
42
|
+
puts "==>loading: #{f} ..."
|
43
|
+
load_code_hashes!(f)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
#为引用项目生成样例文件, TODO rake方式生成
|
50
|
+
def self.setup_code_hashes(yml_file = "#{APP_CODE_HASHES}/code_hashes.yml.sample")
|
51
|
+
if defined? Rails
|
52
|
+
target = "#{Rails.root}/#{yml_file}"
|
53
|
+
unless File.exists?(target)
|
54
|
+
path = File.dirname(target)
|
55
|
+
FileUtils.mkpath(path)
|
56
|
+
#默认覆盖已有
|
57
|
+
FileUtils.cp("#{NS_GEM_ROOT}/config/code_hashes.yml.sample", target)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#coding: utf-8
|
2
|
+
=begin
|
3
|
+
Service模块提供的json数据格式封装
|
4
|
+
=end
|
5
|
+
class ResultPacker
|
6
|
+
#自定义打包
|
7
|
+
def self.pack(response_hash={})
|
8
|
+
{:status=>'ok',:msg=>''}.merge!(response_hash)
|
9
|
+
end
|
10
|
+
|
11
|
+
#封装数据
|
12
|
+
def self.data(data_hash={}, msg='通信正常!')
|
13
|
+
{:status=>'ok',:msg=>msg, :data=>data_hash}
|
14
|
+
end
|
15
|
+
|
16
|
+
#前台验证错误
|
17
|
+
def self.help(hint_hash={}, msg='数据逻辑有误,请查看错误提示!')
|
18
|
+
{:status=>'illegal',:msg=>msg, :errors=>hint_hash}
|
19
|
+
end
|
20
|
+
|
21
|
+
#异常错误
|
22
|
+
def self.error(msg='通信异常,请查看出错信息!', error_hash={})
|
23
|
+
{:status=>'error',:msg=>msg, :errors=>error_hash}
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#coding: utf-8
|
2
|
+
NS_GEM_ROOT = File.expand_path('../..', __FILE__)
|
3
|
+
#debug this gem
|
4
|
+
#$LOAD_PATH.unshift("#{NS_GEM_ROOT}/lib")
|
5
|
+
|
6
|
+
require 'fileutils'
|
7
|
+
require 'ns_service_pack/code_hash'
|
8
|
+
require 'ns_service_pack/global_const'
|
9
|
+
require 'ns_service_pack/field_mapping'
|
10
|
+
require 'ns_service_pack/result_packer'
|
11
|
+
require 'ns_service_pack/application_controller_module'
|
12
|
+
|
13
|
+
if defined?(Rails)
|
14
|
+
#TODO 为什么不能像ActiveRecord::Base一样include,到底什么道理呢???
|
15
|
+
class ApplicationController < ActionController::Base
|
16
|
+
include ApplicationControllerModule
|
17
|
+
end
|
18
|
+
if defined?(ActiveRecord::Base)
|
19
|
+
ActiveRecord::Base.send(:include, FieldMapping)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module NsServicePack
|
24
|
+
def self.install
|
25
|
+
#添加一个初始化文件
|
26
|
+
init_file = "#{Rails.root}/config/initializers/ns_service_pack.rb"
|
27
|
+
unless File.exists?(init_file)
|
28
|
+
FileUtils.cp("#{NS_GEM_ROOT}/config/initializers/ns_service_pack.rb", init_file)
|
29
|
+
puts "==>I have installed a intializer file: #{init_file}"
|
30
|
+
GlobalConst.setup_code_hashes
|
31
|
+
puts "==>Now you can config your constants in folder: #{GlobalConst::APP_CODE_HASHES}"
|
32
|
+
else
|
33
|
+
puts "==>It seems you have installed ns service pack, happy with it or bug report to caory!"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
puts "==>NsServicePack has installed into application, ^^caory"
|
@@ -0,0 +1,26 @@
|
|
1
|
+
##TODO
|
2
|
+
#$LOAD_PATH.unshift("#{Dir.pwd}/lib/ns_service_pack/lib")
|
3
|
+
|
4
|
+
require 'ns_service_pack/code_hash.rb'
|
5
|
+
require 'ns_service_pack/result_packer.rb'
|
6
|
+
require 'ns_service_pack/field_mapping.rb'
|
7
|
+
require 'ns_service_pack/application_controller_module.rb'
|
8
|
+
|
9
|
+
#TODO WHY FIXME
|
10
|
+
#if defined?(ActionController::Base)
|
11
|
+
#ActionController::Base.include(ApplicationControllerModule)
|
12
|
+
# ActionController::Base.send(:include, ApplicationControllerModule)
|
13
|
+
#end
|
14
|
+
if defined?(ActiveRecord::Base)
|
15
|
+
ActiveRecord::Base.send(:include, FieldMapping)
|
16
|
+
end
|
17
|
+
|
18
|
+
GlobalConstants = {
|
19
|
+
:genders => CodeHash.new('男'=>0, '女'=>1, '保密'=>2),
|
20
|
+
:trues => CodeHash.new('是'=>true, '否'=>false)
|
21
|
+
}
|
22
|
+
|
23
|
+
#Genders = CodeHash.new('男'=>0, '女'=>1, '保密'=>2)
|
24
|
+
#Trues = CodeHash.new('是'=>true, '否'=>false)
|
25
|
+
|
26
|
+
puts "============ns service pack has installed in your application..."
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require './lib/ns_service_pack/version'
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{ns_service_pack}
|
5
|
+
s.version = NsServicePack::VERSION
|
6
|
+
|
7
|
+
s.authors = %w(Caory Shang Gorgeous)
|
8
|
+
s.date = Time.now.utc.strftime("%Y-%m-%d")
|
9
|
+
s.description = %q{Service package for our service lier}
|
10
|
+
s.email = %q{cao7113@gmail.com}
|
11
|
+
s.files = Dir.glob("lib/**/*") + Dir.glob("config/**/*") + [
|
12
|
+
"Gemfile",
|
13
|
+
"ns_service_pack.gemspec",
|
14
|
+
"Rakefile",
|
15
|
+
"README"
|
16
|
+
]
|
17
|
+
s.homepage = %q{http://weibo.com/cao7113}
|
18
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
s.summary = %q{common package for our service pack}
|
21
|
+
#s.test_files = Dir.glob("test/**/*")
|
22
|
+
#s.add_development_dependency(%q<shoulda>, [">= 0"])
|
23
|
+
s.add_development_dependency(%q<rails>, [">= 3.1.0"])
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ns_service_pack
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Caory
|
9
|
+
- Shang
|
10
|
+
- Gorgeous
|
11
|
+
autorequire:
|
12
|
+
bindir: bin
|
13
|
+
cert_chain: []
|
14
|
+
date: 2011-11-15 00:00:00.000000000Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: rails
|
18
|
+
requirement: &76036470 !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ! '>='
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 3.1.0
|
24
|
+
type: :development
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: *76036470
|
27
|
+
description: Service package for our service lier
|
28
|
+
email: cao7113@gmail.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- lib/ns_service_pack.rb
|
34
|
+
- lib/ns_service_pack/global_const.rb
|
35
|
+
- lib/ns_service_pack/version.rb
|
36
|
+
- lib/ns_service_pack/application_controller_module.rb
|
37
|
+
- lib/ns_service_pack/code_hash.rb~
|
38
|
+
- lib/ns_service_pack/code_hash.rb
|
39
|
+
- lib/ns_service_pack/field_mapping.rb
|
40
|
+
- lib/ns_service_pack/result_packer.rb
|
41
|
+
- lib/ns_service_pack.rb~
|
42
|
+
- config/code_hashes.yml.sample
|
43
|
+
- config/initializers/ns_service_pack.rb
|
44
|
+
- Gemfile
|
45
|
+
- ns_service_pack.gemspec
|
46
|
+
- Rakefile
|
47
|
+
- README
|
48
|
+
homepage: http://weibo.com/cao7113
|
49
|
+
licenses: []
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options:
|
52
|
+
- --charset=UTF-8
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ! '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
requirements: []
|
68
|
+
rubyforge_project:
|
69
|
+
rubygems_version: 1.8.10
|
70
|
+
signing_key:
|
71
|
+
specification_version: 3
|
72
|
+
summary: common package for our service pack
|
73
|
+
test_files: []
|