rails_dictionary 0.2.6 → 0.3.pre.rc1

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
- SHA256:
3
- metadata.gz: ad83ca98316732ec61a94009c4e27fbc1076fa11b09fde448f2e305e3e08779c
4
- data.tar.gz: cf300fbaeeec5d1b982786f0b5bcdc50dc938e5e4e954678b9881bccd56173ed
2
+ SHA1:
3
+ metadata.gz: 309d2e3ca49c9e564523d61307014d44987b7561
4
+ data.tar.gz: e6ea71c9fc377893c23883a0a0f08d001bc2f328
5
5
  SHA512:
6
- metadata.gz: fb40c8172cfe41e4568ffc04efe33ef6a3a3a95d1939969461a1b0b8962319bf21a1963c60fa1c8a84ec8a70d79744870097d3c8340d71d3b0359d1dd95e5dc5
7
- data.tar.gz: 91e2857ceda81421c9462e7201b93b0959e2c0935fe7528053586a27e01bfca15db59a07866131f56b460a2ff393ff9c4fafd0e0228ca681887bddad423128e3
6
+ metadata.gz: 0daca999ef3ad0ff8888e5e2ca7ae85fe81bbc62c5e1a7c696f51f7d904eeb5bb985200a471306efb75f5c4ce3e599b5cd2e57513f07ef7d1a95f26294b0acef
7
+ data.tar.gz: 987fdd01ad2d98bb9a211eda4aed92cedbe9469f4cfaf7a1d6b6803a52f41315ba9c4239e43826a620fb7d289fcc9c53dd206942db0f6f60ccd25ebe206f9d54
data/.gitignore CHANGED
@@ -1,6 +1,6 @@
1
1
  pkg/
2
2
  .git/
3
+ .gitignore
4
+ Gemfile.lock
3
5
  tmp/*
4
- .idea/
5
- .byebug_history
6
- log/
6
+ .idea/
data/CHANGELOG CHANGED
@@ -1,5 +1,7 @@
1
- 0.2.4
2
- Support Rails7
1
+ 0.3.1
2
+ Replace rspec with minitest.
3
+ Replace dict_types with STI.
4
+
3
5
  0.2
4
6
  Add Support For Rails4
5
7
 
data/Gemfile CHANGED
@@ -4,8 +4,7 @@ source "http://rubygems.org"
4
4
  gemspec
5
5
 
6
6
  group :development,:test do
7
- gem 'rails', '~> 7.0'
8
- gem 'pry-byebug'
9
- gem "rspec-rails", '5.1.0'
7
+ gem 'minitest'
8
+ gem 'byebug'
10
9
  gem 'sqlite3'
11
10
  end
@@ -1,6 +1,3 @@
1
- = Plan
2
- Working on sti branch will target to 0.3 version which will not compatible with 0.1 and 0.2
3
-
4
1
  = Intro
5
2
  There are always some static data(not static page) in application.For example product type or student diploma type.
6
3
 
@@ -29,7 +26,7 @@ See change log for brief info.
29
26
  == Sample
30
27
  Run following task will give you a simple start.Maybe you should try it in a new application first.
31
28
  rake dicts:generate
32
- rake dicts:sample_slave
29
+ rake dicts:sample_consumer
33
30
  rake db:migrate
34
31
  rake dicts:sample_data
35
32
  These task are just generate table dictionaries,dict_types,students and some sample data.The data should be
@@ -80,7 +77,7 @@ Here is what should be like.Student model can be other models.
80
77
  end
81
78
 
82
79
  class Student < ActiveRecord::Base
83
- # use acts_as_dict_slave when your rails_dictionary version < 0.2
80
+ # use acts_as_dict_consumer when your rails_dictionary version < 0.2
84
81
  acts_as_dict_consumer
85
82
  end
86
83
 
data/Rakefile CHANGED
@@ -5,6 +5,7 @@ task :default => [:test]
5
5
 
6
6
  desc "Running Test"
7
7
  task :test do
8
- # system "ruby -I . test/rails_dictionary_test.rb " # used with version 0.0.8 or before it
9
- system "rspec spec/rails_dictionary_spec.rb"
8
+ system 'ruby test/rails_dictionary_test.rb'
9
+ system 'ruby test/acts_as_consumer_test.rb'
10
+ system 'ruby test/lookup_test.rb'
10
11
  end
data/Readme.md ADDED
@@ -0,0 +1,10 @@
1
+ ## Usage
2
+
3
+ Version 0.3 is not backward compatible!!
4
+ Only for version 0.3.
5
+
6
+ See [README.rdoc](https://github.com/raykin/rails_dictionary/blob/sti/README.v2.0.rdoc) for version 0.2.
7
+
8
+ ### Changes from 0.2 to 0.3
9
+
10
+ Locale feature removed. Please use i18n.
@@ -0,0 +1,38 @@
1
+ module RailsDictionary
2
+ module ActiveRecordExtension
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ end
6
+
7
+ module ClassMethods
8
+
9
+ def acts_as_dictionary
10
+ include ActsAsDictionary
11
+ validates_uniqueness_of :name, scope: [inheritance_column]
12
+ end
13
+
14
+ # Ex: acts_as_dict_consumer on: :city
15
+ #
16
+ # on: - add dict mapping columns, can be string or array of string
17
+ # relation_type: - belongs_to/many_to_many, default is belongs_to. has_many Not supported yet
18
+ # class_name: - Dictionary class name
19
+ # locale: - add and initialize class attribute default_dict_locale
20
+ def acts_as_dict_consumer(opts={})
21
+ include ActsAsDictConsumer
22
+ case opts[:on]
23
+ when Array
24
+ opts[:on].each do |on_value|
25
+ build_dict_relation(opts.merge(on: on_value))
26
+ end
27
+ when String, Symbol
28
+ build_dict_relation(opts)
29
+ else
30
+ raise TypeError, 'Wrong value of params on'
31
+ end
32
+ end
33
+
34
+ end
35
+ end
36
+ end
37
+
38
+ ::ActiveRecord::Base.send :include, RailsDictionary::ActiveRecordExtension
@@ -0,0 +1,77 @@
1
+ module RailsDictionary
2
+ module ActsAsDictConsumer
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ end
6
+
7
+ module ClassMethods
8
+
9
+ # Generate dynamic instance method named_column to consumer model
10
+ # def named_city(locale=nil)
11
+ # locale = locale.presence || default_dict_locale.presence || :en
12
+ # locale = "name_#{locale}"
13
+ # self.send(city_dict).try(:send,locale)
14
+ # end
15
+ # alias_method :city_name, :named_city
16
+ # def named_dict_value(method_name)
17
+ # belongs_to_name="#{method_name}_dict".to_sym
18
+ # origin_method_name = method_name
19
+ # method_name="named_#{method_name}"
20
+ # define_method(method_name) do | locale=nil |
21
+ # locale = locale.presence || default_dict_locale.presence || :en
22
+ # locale = "name_#{locale}"
23
+ # self.send(belongs_to_name).try(:send,locale)
24
+ # end
25
+ # alias_method "#{origin_method_name}_name".to_sym, method_name.to_sym
26
+ # end
27
+
28
+ # Build dynamic method column_name= to the consumer model
29
+ #
30
+ # ex:
31
+ # def city_name=(value, options = {})
32
+ # send "city=", dictionary_obj
33
+ # end
34
+ def dict_name_equal
35
+ relation_name = @dict_relation_name
36
+ relation_type = @dict_relation_type
37
+ method_name = "#{relation_name}_name="
38
+ class_opt = @opt
39
+ define_method(method_name) do |value, options={}|
40
+ dicts = RailsDictionary.dclass.where(name: Array(value), type: class_opt[:class_name])
41
+ if dicts
42
+ if relation_type == :belongs_to
43
+ send "#{relation_name}=", dicts.first
44
+ elsif relation_type == :many_to_many
45
+ send "#{relation_name}=", dicts.map(&:id)
46
+ else
47
+ raise "Wrong relation method name: #{relation_type}"
48
+ end
49
+ else
50
+ # do nothing ?
51
+ end
52
+ end
53
+ end
54
+
55
+ # dont think instance var is a good sollution
56
+ # cause the consumer class will include other lib too
57
+ def build_dict_relation(opt)
58
+ @opt = opt
59
+ @dict_relation_name = @opt.delete :on
60
+ raise 'params on cant be nil' if @dict_relation_name.nil?
61
+ @dict_relation_type = @opt.delete(:relation_type) || :belongs_to
62
+ # @opt[:foreign_key] ||= "#{@dict_relation_name}_id"
63
+ @opt[:class_name] ||= "#{RailsDictionary.config.dictionary_klass}::#{@dict_relation_name.to_s.singularize.camelize}"
64
+ ::RailsDictionary.init_dict_sti_class(@opt[:class_name])
65
+ if @dict_relation_type.to_sym == :belongs_to
66
+ send @dict_relation_type, @dict_relation_name, @opt
67
+ elsif @dict_relation_type.to_sym == :many_to_many
68
+ # no code required?
69
+ # build_many_to_many_dict_relation
70
+ end
71
+ dict_name_equal
72
+ end
73
+
74
+ end # END ClassMethods
75
+
76
+ end
77
+ end
@@ -0,0 +1,27 @@
1
+ module RailsDictionary
2
+ module ActsAsDictionary
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ base.send :include, InstanceMethods
6
+ end
7
+
8
+ module ClassMethods
9
+
10
+ # override to make sure STI class init first
11
+ def new(opts)
12
+ type_opt = opts.with_indifferent_access[inheritance_column]
13
+ RailsDictionary.init_dict_sti_class(type_opt) if type_opt
14
+ super
15
+ end
16
+
17
+ end # End ClassMethods
18
+
19
+ module InstanceMethods
20
+ def type=(name)
21
+ ::RailsDictionary.init_dict_sti_class(name)
22
+ super
23
+ end
24
+ end # End InstanceMethods
25
+
26
+ end
27
+ end
@@ -1,3 +1,3 @@
1
1
  module RailsDictionary
2
- VERSION = "0.2.6"
2
+ VERSION = "0.3-rc1"
3
3
  end
@@ -1,13 +1,33 @@
1
+ require File.join(File.dirname(__FILE__), "rails_dictionary/models/active_record_extension")
2
+ require File.join(File.dirname(__FILE__), "rails_dictionary/models/acts_as_dictionary")
3
+ require File.join(File.dirname(__FILE__), "rails_dictionary/models/acts_as_dict_consumer")
4
+
1
5
  # rake tasks not autoload in Rails4
2
- Dir[File.expand_path('../tasks/**/*.rake',__FILE__)].each { |ext| load ext } if defined?(Rake)
6
+ # todo: may add migration(from 0.2 to 0.3) task
7
+ # Dir[File.expand_path('../tasks/**/*.rake',__FILE__)].each { |ext| load ext } if defined?(Rake)
8
+
9
+ module RailsDictionary
10
+
11
+ def self.config
12
+ Config.instance
13
+ end
14
+
15
+ class Config < Struct.new(:dictionary_klass, :defined_sti_klass)
16
+ include Singleton
17
+ end
3
18
 
4
- require File.join(File.dirname(__FILE__), "rails_dictionary/array_core_ext")
19
+ config.dictionary_klass = :Dictionary
20
+ config.defined_sti_klass = []
5
21
 
6
- ActiveSupport.on_load :active_record do
7
- require File.join(File.dirname(__FILE__), "rails_dictionary/active_record_extension")
8
- require File.join(File.dirname(__FILE__), "rails_dictionary/acts_as_dict_type")
9
- require File.join(File.dirname(__FILE__), "rails_dictionary/acts_as_dictionary")
10
- require File.join(File.dirname(__FILE__), "rails_dictionary/acts_as_dict_slave")
22
+ def self.dclass
23
+ @dclass ||= config.dictionary_klass.to_s.constantize
24
+ end
11
25
 
12
- ::ActiveRecord::Base.send :include, RailsDictionary::ActiveRecordExtension
26
+ def self.init_dict_sti_class(klass)
27
+ unless config.defined_sti_klass.include?(klass) || Module.const_defined?(klass)
28
+ subklass = klass.sub "#{config.dictionary_klass}::", ''
29
+ dclass.const_set subklass, Class.new(dclass)
30
+ config.defined_sti_klass.push(klass)
31
+ end
32
+ end
13
33
  end
data/lib/tasks/dicts.rake CHANGED
@@ -2,20 +2,22 @@
2
2
  namespace :dicts do
3
3
  desc "Generate dictionary and dict_type model"
4
4
  task :generate do
5
- system "rails g model dictionary name_en:string name_zh:string name_fr:string dict_type_id:integer"
6
- system "rails g model dict_type name:string"
5
+ system "rails g model dictionary name_en name_zh name_fr type"
7
6
  end
7
+
8
8
  desc "Generate student model"
9
- task :sample_slave do
9
+ task :sample_consumer do
10
10
  system "rails g model student email:string city:integer school:integer"
11
11
  end
12
+
12
13
  desc "Generate sample data for rails_dictionary gem"
13
14
  task :sample_data => [:environment] do
14
- @dt_stu_city=DictType.create! :name => "student_city"
15
- @dt_stu_school=DictType.create! :name => "student_school"
16
- @dy_shanghai=Dictionary.create! name_en: "shanghai",name_zh: "上海",name_fr: "shanghai",dict_type_id: @dt_stu_city.id
17
- @dy_beijing=Dictionary.create! name_en: "beijing",name_zh: "北京",name_fr: "Pékin",dict_type_id: @dt_stu_city.id
18
- @stu_beijing=Student.create! email: "beijing@dict.com",city: @dy_beijing.id
19
- @stu_shanghai=Student.create! email: "shanghai@dict.com",city: @dy_shanghai.id
15
+ # @dt_stu_city=DictType.create! name: "student_city"
16
+ # @dt_stu_school=DictType.create! name: "student_school"
17
+ @dy_shanghai=Dictionary.create! name_en: "shanghai", name_zh: "上海", name_fr: "shanghai", dict_type_id: @dt_stu_city.id
18
+ @dy_beijing=Dictionary.create! name_en: "beijing", name_zh: "北京", name_fr: "Pékin", dict_type_id: @dt_stu_city.id
19
+ @stu_beijing=Student.create! email: "beijing@dict.com", city: @dy_beijing.id
20
+ @stu_shanghai=Student.create! email: "shanghai@dict.com", city: @dy_shanghai.id
20
21
  end
22
+
21
23
  end
@@ -7,15 +7,17 @@ Gem::Specification.new do |s|
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ["Raykin Lee"]
9
9
  s.email = ["raykincoldxiao@campus.com"]
10
- s.licenses = ['MIT']
11
10
  s.homepage = "https://github.com/raykin/rails_dictionary"
12
11
  s.summary = %q{dictionary data for web application}
13
12
  s.description = %q{Rails plugin for mapping static data of web application to Dictionary class}
14
13
 
15
- s.add_runtime_dependency 'rails', '> 6.0', '< 7.1'
14
+ s.rubyforge_project = "rails_dictionary"
15
+
16
+ s.add_runtime_dependency 'rails', '> 4.0'
17
+ s.add_runtime_dependency 'database_cleaner'
16
18
 
17
19
  s.files = `git ls-files`.split("\n")
18
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ s.test_files = `git ls-files -- {test}/*`.split("\n")
19
21
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
22
  s.require_paths = ["lib"]
21
23
  end
@@ -0,0 +1,44 @@
1
+ require File.expand_path('test_helper', File.dirname(__FILE__))
2
+
3
+ class TestConsumer < TestSupporter
4
+
5
+ end
6
+
7
+ class TestConsumeOneColumn < TestConsumer
8
+ def setup
9
+ super
10
+ Student.acts_as_dict_consumer on: :city
11
+ end
12
+
13
+ def test_student_should_has_method_city
14
+ assert Student.new.respond_to?(:city), 'student should has method city'
15
+ assert Student.new.respond_to?(:create_city), 'student should has method create_city'
16
+ assert_includes RailsDictionary.config.defined_sti_klass, 'Dictionary::City'
17
+ end
18
+
19
+ def test_dictionary_city_class_exist
20
+ assert Dictionary.const_defined?('City'), 'Dictionary::City should be defined'
21
+ assert_includes RailsDictionary.config.defined_sti_klass, 'Dictionary::City'
22
+ end
23
+ end
24
+
25
+ class TestConsumeMultipleColumns < TestConsumer
26
+
27
+ def setup
28
+ super
29
+ Student.acts_as_dict_consumer on: [:city, :school]
30
+ end
31
+
32
+ def test_student_should_has_method_city
33
+ assert Student.new.respond_to?(:city), 'student should has method city'
34
+ assert Student.new.respond_to?(:create_city), 'student should has method create_city'
35
+ assert Student.new.respond_to?(:school), 'student should has method city'
36
+ assert Student.new.respond_to?(:create_school), 'student should has method city'
37
+ end
38
+
39
+ def test_dictionary_city_and_schoold_exist
40
+ assert Dictionary.const_defined?('City'), 'Dictionary::City should be defined'
41
+ assert Dictionary.const_defined?('School'), 'Dictionary::City should be defined'
42
+ assert_equal(['Dictionary::City', 'Dictionary::School'], RailsDictionary.config.defined_sti_klass)
43
+ end
44
+ end
data/test/fake_app.rb ADDED
@@ -0,0 +1,40 @@
1
+ # database
2
+ ActiveRecord::Base.configurations = {'test' => {:adapter => 'sqlite3', :database => ':memory:'}}
3
+ ActiveRecord::Base.establish_connection(:test)
4
+
5
+ # config
6
+ app = Class.new(Rails::Application)
7
+ app.config.active_support.deprecation = :log
8
+ app.config.eager_load = false
9
+ app.initialize!
10
+
11
+ class Dictionary < ActiveRecord::Base
12
+ acts_as_dictionary
13
+ end
14
+
15
+ class Student < ActiveRecord::Base
16
+ end
17
+
18
+ class Lookup < ActiveRecord::Base
19
+ end
20
+
21
+ #migrations
22
+ class CreateAllTables < ActiveRecord::Migration
23
+ def self.up
24
+ create_table(:dictionaries) {|t| t.string :name; t.string :type}
25
+ create_table(:students) do |t|
26
+ t.string :email
27
+ t.integer :city_id
28
+ t.integer :school_id
29
+ t.text :major_array
30
+ t.text :majors
31
+ end
32
+ create_table(:lookups) { |t| t.string :name; t.string :type }
33
+ end
34
+
35
+ def self.down
36
+ drop_table :dictionaries
37
+ drop_table :students
38
+ drop_table :lookups
39
+ end
40
+ end
@@ -0,0 +1,39 @@
1
+ require File.expand_path('test_helper', File.dirname(__FILE__))
2
+
3
+ module TestLookup
4
+
5
+ class TestAsDictionary < TestSupporter
6
+
7
+ def prepare_data
8
+ @art = Lookup.create!(name: 'art', type: 'Lookup::Major')
9
+ @math = Lookup.create!(name: 'math', type: 'Lookup::Major')
10
+ end
11
+
12
+ def setup
13
+ RailsDictionary.config.dictionary_klass = :Lookup
14
+ Lookup.acts_as_dictionary
15
+ super
16
+ end
17
+
18
+ def test_lookup
19
+ prepare_data
20
+ assert Lookup, Lookup::Major.superclass
21
+ end
22
+
23
+ def test_student_major_array
24
+ Student.acts_as_dict_consumer on: :major_array, relation_type: :many_to_many, class_name: 'Lookup::Major'
25
+ prepare_data
26
+ s = Student.new(major_array_name: ['art', 'math'])
27
+ s.save!; s.reload
28
+ assert_equal([@art.id, @math.id], s.major_array)
29
+ end
30
+
31
+ def test_student_with_majors
32
+ Student.acts_as_dict_consumer on: :majors, relation_type: :many_to_many
33
+ prepare_data
34
+ s = Student.new(majors_name: ['art', 'math'])
35
+ s.save!; s.reload
36
+ assert_equal([@art.id, @math.id], s.majors)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,81 @@
1
+ require File.expand_path('test_helper', File.dirname(__FILE__))
2
+
3
+ class TestRailsDictionary < TestSupporter
4
+
5
+ class TestActiveRecordExtension < TestRailsDictionary
6
+ [:acts_as_dictionary, :acts_as_dict_consumer].each do |method_name|
7
+ define_method "test_#{method_name}_exists_ar" do
8
+ assert_includes ActiveRecord::Base.methods, method_name
9
+ end
10
+ end
11
+ end
12
+
13
+ class PreTestDatabase < TestRailsDictionary
14
+
15
+ def test_no_dictionary_data_exist_before
16
+ assert_equal 0, Dictionary.count, 'dicionaries table should be blank'
17
+ end
18
+ end
19
+
20
+ class TestInitSubDictClass < TestRailsDictionary
21
+ def setup
22
+ super
23
+ if Dictionary.const_defined? 'City'
24
+ Dictionary.send :remove_const, 'City'
25
+ RailsDictionary.config.defined_sti_klass.delete('Dictionary::City')
26
+ end
27
+ end
28
+
29
+ def test_dictionary_city_class_when_create_dictionary
30
+ @shanghai = Dictionary.create!(name: "shanghai", type: 'Dictionary::City')
31
+ assert Dictionary, Dictionary::City.superclass
32
+ end
33
+
34
+ def test_dictionary_city_class_when_assign_type
35
+ beijing = Dictionary.new(name: 'beijing')
36
+ beijing.type = 'Dictionary::City'
37
+ beijing.save!
38
+ assert Dictionary, Dictionary::City.superclass
39
+ end
40
+
41
+ def test_dictionary_city_class_when_assign_type_in_new
42
+ beijing = Dictionary.new(name: 'beijing', type: 'Dictionary::City')
43
+ beijing.save!
44
+ assert Dictionary, Dictionary::City.superclass
45
+ end
46
+
47
+ end
48
+ end
49
+
50
+ class TestWithDB < TestRailsDictionary
51
+ def setup
52
+ super
53
+ Dictionary.acts_as_dictionary
54
+ @beijing, @shanghai = prepare_city_data
55
+
56
+ @stu_beijing = Student.create! email: "beijing@dict.com", city_id: @shanghai.id
57
+ @stu_shanghai = Student.create! email: "shanghai@dict.com", city_id: @shanghai.id
58
+ end
59
+ end
60
+
61
+ class TestStudent < TestWithDB
62
+ def setup
63
+ super
64
+ Student.acts_as_dict_consumer on: [:city]
65
+ end
66
+
67
+ def test_city_name_equal_to_exist_dictionary_name
68
+ assert_equal 1, Dictionary.where(name: "beijing").count
69
+ @stu_shanghai.update_attributes city_name: "beijing"
70
+ assert_equal 'beijing', @stu_shanghai.reload.city.name
71
+ assert_equal 1, Dictionary.where(name: "beijing").count
72
+ end
73
+
74
+ def create_a_student_with_shanghai_city
75
+ s = Student.create(city_name: "shanghai")
76
+ s.reload
77
+ s.city.name.should == "shanghai"
78
+ assert_equal Dictionary.find_by(name: 'shanghai').id, s.city_id
79
+ assert_equal 1, Dictionary.where(name: "shanghai").count
80
+ end
81
+ end
@@ -0,0 +1,36 @@
1
+ # copy and modify the test design of kaminari(a paginate gem for Rails3)
2
+ RAILS_ENV = 'test'
3
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
5
+ require 'byebug'
6
+ require 'rack/test'
7
+ require 'rails'
8
+ require 'active_record'
9
+ require 'rails_dictionary'
10
+
11
+ ActiveRecord::Migration.verbose = false
12
+
13
+ require File.join(File.dirname(__FILE__), 'fake_app')
14
+
15
+ CreateAllTables.up unless ActiveRecord::Base.connection.table_exists? 'dictionaries'
16
+
17
+ Student.serialize :major_array, Array
18
+ Student.serialize :majors, Array
19
+
20
+ require 'minitest/autorun'
21
+ require 'database_cleaner'
22
+
23
+ DatabaseCleaner.strategy = :truncation
24
+
25
+ class TestSupporter < Minitest::Test
26
+ def setup
27
+ DatabaseCleaner.clean
28
+ end
29
+
30
+ def prepare_city_data
31
+ [
32
+ Dictionary.create!(name: 'beijing', type: 'Dictionary::City'),
33
+ Dictionary.create!(name: 'shanghai', type: 'Dictionary::City')
34
+ ]
35
+ end
36
+ end