yeshoua_crm 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +11 -0
  3. data/lib/yeshoua_crm.rb +87 -0
  4. data/lib/yeshoua_crm/acts_as_draftable/draft.rb +40 -0
  5. data/lib/yeshoua_crm/acts_as_draftable/rcrm_acts_as_draftable.rb +154 -0
  6. data/lib/yeshoua_crm/acts_as_list/list.rb +282 -0
  7. data/lib/yeshoua_crm/acts_as_taggable/rcrm_acts_as_taggable.rb +350 -0
  8. data/lib/yeshoua_crm/acts_as_taggable/tag.rb +81 -0
  9. data/lib/yeshoua_crm/acts_as_taggable/tag_list.rb +111 -0
  10. data/lib/yeshoua_crm/acts_as_taggable/tagging.rb +16 -0
  11. data/lib/yeshoua_crm/acts_as_viewed/rcrm_acts_as_viewed.rb +274 -0
  12. data/lib/yeshoua_crm/acts_as_votable/rcrm_acts_as_votable.rb +80 -0
  13. data/lib/yeshoua_crm/acts_as_votable/rcrm_acts_as_voter.rb +20 -0
  14. data/lib/yeshoua_crm/acts_as_votable/votable.rb +323 -0
  15. data/lib/yeshoua_crm/acts_as_votable/vote.rb +28 -0
  16. data/lib/yeshoua_crm/acts_as_votable/voter.rb +131 -0
  17. data/lib/yeshoua_crm/assets_manager.rb +43 -0
  18. data/lib/yeshoua_crm/currency.rb +439 -0
  19. data/lib/yeshoua_crm/currency/formatting.rb +224 -0
  20. data/lib/yeshoua_crm/currency/heuristics.rb +151 -0
  21. data/lib/yeshoua_crm/currency/loader.rb +24 -0
  22. data/lib/yeshoua_crm/helpers/external_assets_helper.rb +17 -0
  23. data/lib/yeshoua_crm/helpers/form_tag_helper.rb +123 -0
  24. data/lib/yeshoua_crm/helpers/tags_helper.rb +13 -0
  25. data/lib/yeshoua_crm/helpers/vote_helper.rb +35 -0
  26. data/lib/yeshoua_crm/liquid/drops/cells_drop.rb +86 -0
  27. data/lib/yeshoua_crm/liquid/drops/issues_drop.rb +66 -0
  28. data/lib/yeshoua_crm/liquid/drops/news_drop.rb +54 -0
  29. data/lib/yeshoua_crm/liquid/drops/users_drop.rb +72 -0
  30. data/lib/yeshoua_crm/liquid/filters/arrays.rb +177 -0
  31. data/lib/yeshoua_crm/liquid/filters/base.rb +208 -0
  32. data/lib/yeshoua_crm/money_helper.rb +65 -0
  33. data/lib/yeshoua_crm/version.rb +3 -0
  34. data/test/acts_as_draftable/draft_test.rb +29 -0
  35. data/test/acts_as_draftable/rcrm_acts_as_draftable_test.rb +185 -0
  36. data/test/acts_as_taggable/rcrm_acts_as_taggable_test.rb +345 -0
  37. data/test/acts_as_taggable/tag_list_test.rb +34 -0
  38. data/test/acts_as_taggable/tag_test.rb +72 -0
  39. data/test/acts_as_taggable/tagging_test.rb +15 -0
  40. data/test/acts_as_viewed/rcrm_acts_as_viewed_test.rb +47 -0
  41. data/test/acts_as_votable/rcrm_acts_as_votable_test.rb +19 -0
  42. data/test/acts_as_votable/rcrm_acts_as_voter_test.rb +14 -0
  43. data/test/acts_as_votable/votable_test.rb +507 -0
  44. data/test/acts_as_votable/voter_test.rb +296 -0
  45. data/test/currency_test.rb +292 -0
  46. data/test/liquid/drops/issues_drop_test.rb +34 -0
  47. data/test/liquid/drops/news_drop_test.rb +38 -0
  48. data/test/liquid/drops/projects_drop_test.rb +44 -0
  49. data/test/liquid/drops/uses_drop_test.rb +36 -0
  50. data/test/liquid/filters/arrays_filter_test.rb +24 -0
  51. data/test/liquid/filters/base_filter_test.rb +63 -0
  52. data/test/liquid/liquid_helper.rb +32 -0
  53. data/test/models/issue.rb +14 -0
  54. data/test/models/news.rb +3 -0
  55. data/test/models/project.rb +8 -0
  56. data/test/models/user.rb +11 -0
  57. data/test/models/vote_classes.rb +33 -0
  58. data/test/money_helper_test.rb +12 -0
  59. data/test/schema.rb +121 -0
  60. data/test/tags_helper_test.rb +29 -0
  61. data/test/test_helper.rb +66 -0
  62. data/test/vote_helper_test.rb +28 -0
  63. data/yeshoua_crm.gemspec +28 -0
  64. metadata +206 -0
@@ -0,0 +1,34 @@
1
+ require File.dirname(__FILE__) + '/../liquid_helper'
2
+ include LiquidHelperMethods
3
+
4
+ module YeshouaCrm
5
+ class IssuesDropTest < ActiveSupport::TestCase
6
+ def setup
7
+ @issue = Issue.first
8
+ @user = User.first
9
+ @liquid_render = LiquidRender.new('user' => Liquid::UserDrop.new(@user),
10
+ 'issue' => Liquid::IssueDrop.new(@issue),
11
+ 'issues' => Liquid::IssuesDrop.new(Issue.all))
12
+ end
13
+
14
+ def test_issues_all
15
+ issues_text = @liquid_render.render('{% for issue in issues.all %} {{issue.subject }} {% endfor %}')
16
+ Issue.all.map(&:subject).each do |subject|
17
+ assert_match subject, issues_text
18
+ end
19
+ end
20
+
21
+ def test_issues_size
22
+ assert_equal '4', @liquid_render.render('{{ issues.size }}')
23
+ end
24
+
25
+ def test_issue_author
26
+ assert_equal @user.name, @liquid_render.render('{{ issue.author.name }}')
27
+ end
28
+
29
+ def test_issue_delegated
30
+ assert_equal [@issue.id, @issue.subject, @issue.description].join('|'),
31
+ @liquid_render.render('{{ issue.id }}|{{ issue.subject }}|{{ issue.description }}')
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,38 @@
1
+ require File.dirname(__FILE__) + '/../liquid_helper'
2
+ include LiquidHelperMethods
3
+
4
+ module YeshouaCrm
5
+ class NewsDropTest < ActiveSupport::TestCase
6
+ def setup
7
+ @news = News.first
8
+ @user = User.first
9
+ @liquid_render = LiquidRender.new('user' => Liquid::UserDrop.new(@user),
10
+ 'news' => Liquid::NewsDrop.new(@news),
11
+ 'newss' => Liquid::NewssDrop.new(News.all))
12
+ end
13
+
14
+ def test_newss_all
15
+ newss_text = @liquid_render.render('{% for news in newss.all %} {{news.title }} {% endfor %}')
16
+ News.all.map(&:title).each do |title|
17
+ assert_match title, newss_text
18
+ end
19
+ end
20
+
21
+ def test_newss_last
22
+ assert_equal News.last.title, @liquid_render.render('{{ newss.last.title }}')
23
+ end
24
+
25
+ def test_newss_size
26
+ assert_equal '2', @liquid_render.render('{{ newss.size }}')
27
+ end
28
+
29
+ def test_news_author
30
+ assert_equal @user.name, @liquid_render.render('{{ news.author.name }}')
31
+ end
32
+
33
+ def test_issue_delegated
34
+ assert_equal [@news.id, @news.title, @news.description].join('|'),
35
+ @liquid_render.render('{{ news.id }}|{{ news.title }}|{{ news.description }}')
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,44 @@
1
+ require File.dirname(__FILE__) + '/../liquid_helper'
2
+ include LiquidHelperMethods
3
+
4
+ module YeshouaCrm
5
+ class CellsDropTest < ActiveSupport::TestCase
6
+ def setup
7
+ @cell = Cell.first
8
+ @user = User.first
9
+ @liquid_render = LiquidRender.new('user' => Liquid::UserDrop.new(@user),
10
+ 'cell' => Liquid::CellDrop.new(@cell),
11
+ 'cells' => Liquid::CellsDrop.new(Cell.all))
12
+ end
13
+
14
+ def test_cells_all
15
+ cells_text = @liquid_render.render('{% for cell in cells.all %} {{cell.identifier }} {% endfor %}')
16
+ Cell.all.map(&:identifier).each do |identifier|
17
+ assert_match identifier, cells_text
18
+ end
19
+ end
20
+
21
+ def test_cells_active
22
+ cells_text = @liquid_render.render('{% for cell in cells.active %} {{cell.identifier }} {% endfor %}')
23
+ Cell.where(:status => 1).map(&:identifier).each do |identifier|
24
+ assert_match identifier, cells_text
25
+ end
26
+ end
27
+
28
+ def test_cells_size
29
+ assert_equal '2', @liquid_render.render('{{ cells.size }}')
30
+ end
31
+
32
+ def test_cell_issues
33
+ issues_text = @liquid_render.render('{% for issue in cell.issues %} {{issue.subject }} {% endfor %}')
34
+ Cell.first.issues.each do |issue|
35
+ assert_match issue.subject, issues_text
36
+ end
37
+ end
38
+
39
+ def test_cell_delegated
40
+ assert_equal [@cell.id, @cell.identifier, @cell.description].join('|'),
41
+ @liquid_render.render('{{ cell.id }}|{{ cell.identifier }}|{{ cell.description }}')
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,36 @@
1
+ require File.dirname(__FILE__) + '/../liquid_helper'
2
+ include LiquidHelperMethods
3
+
4
+ module YeshouaCrm
5
+ class UsersDropTest < ActiveSupport::TestCase
6
+ def setup
7
+ @user = User.first
8
+ @liquid_render = LiquidRender.new('user' => Liquid::UserDrop.new(@user),
9
+ 'users' => Liquid::UsersDrop.new(User.all))
10
+ end
11
+
12
+ def test_users_all
13
+ users_text = @liquid_render.render('{% for user in users.all %} {{user.name }} {% endfor %}')
14
+ User.all.map(&:name).each do |name|
15
+ assert_match name, users_text
16
+ end
17
+ end
18
+
19
+ def test_users_current
20
+ assert_equal User.first.name, @liquid_render.render('{{ users.current.name }}')
21
+ end
22
+
23
+ def test_users_size
24
+ assert_equal '2', @liquid_render.render('{{ users.size }}')
25
+ end
26
+
27
+ def test_user_name
28
+ assert_equal @user.name, @liquid_render.render('{{ user.name }}')
29
+ end
30
+
31
+ def test_user_delegated
32
+ assert_equal [@user.name, @user.language].join('|'),
33
+ @liquid_render.render('{{ user.name }}|{{ user.language }}')
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,24 @@
1
+ require File.dirname(__FILE__) + '/../liquid_helper'
2
+ include LiquidHelperMethods
3
+
4
+ module YeshouaCrm
5
+ class ArraysFilterTest < ActiveSupport::TestCase
6
+ def setup
7
+ @liquid_render = LiquidRender.new
8
+ @array = '6,7,8,9,1,2,3,4,5'
9
+ end
10
+
11
+ def test_first_filter
12
+ assert_match '1', @liquid_render.render("{{ '#{@array}' | split: ',' | first: 5 | last }}")
13
+ end
14
+
15
+ def test_sort_filter
16
+ assert_match '123456789', @liquid_render.render("{{ '#{@array}' | split: ',' | sort }}")
17
+ end
18
+
19
+ def test_where_filter
20
+ assert_match '{"name"=>"two", "value"=>5}', @liquid_render.render("{{ objects_arr | where: 'name', 'two' }}")
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,63 @@
1
+ require File.dirname(__FILE__) + '/../liquid_helper'
2
+ include LiquidHelperMethods
3
+
4
+ module YeshouaCrm
5
+ class BaseFilterTest < ActiveSupport::TestCase
6
+ def setup
7
+ @liquid_render = LiquidRender.new
8
+ end
9
+
10
+ def test_underscore_filter
11
+ assert_match 'some_text', @liquid_render.render("{{ 'some text' | underscore }}")
12
+ end
13
+
14
+ def test_dasherize_filter
15
+ assert_match 'some-text', @liquid_render.render("{{ 'some text' | dasherize }}")
16
+ end
17
+
18
+ def test_random_filter
19
+ assert @liquid_render.render("{{ random: 10 }}").to_i <= 10
20
+ end
21
+
22
+ def test_encode_filter
23
+ assert_equal 'http%3A%3A%2F%2Fwww.test.com%3Fkey%3Dtest+test+test',
24
+ @liquid_render.render("{{ 'http:://www.test.com?key=test test test' | encode }}")
25
+ end
26
+
27
+ def test_plus_days_filter
28
+ assert_match (Date.today + 3.days).strftime(date_format), @liquid_render.render("{{today | plus_days: 3 | date: '#{date_format}'}}")
29
+ end
30
+
31
+ def test_date_range_filter
32
+ assert_equal '10', @liquid_render.render("{{today | date_range: '#{Date.today - 10.days}'}}")
33
+ end
34
+
35
+ def test_today_filter
36
+ assert_match Date.today.strftime(date_format), @liquid_render.render('{{today}}')
37
+ end
38
+
39
+ def test_utc_filter
40
+ assert_match '2017-01-01 10:13:13 UTC', @liquid_render.render("{{'San, 01 Jan 2017 13:13:13 MSK +03:00' | utc}}")
41
+ end
42
+
43
+ def test_modulo_filter
44
+ assert_equal '3', @liquid_render.render("{{24 | modulo: 7}}")
45
+ end
46
+
47
+ def test_round_filter
48
+ assert_equal '24.12', @liquid_render.render("{{24.12345 | round: 2}}")
49
+ end
50
+
51
+ def test_ceil_filter
52
+ assert_equal '25', @liquid_render.render("{{24.11 | ceil }}")
53
+ end
54
+
55
+ def test_floor_filter
56
+ assert_equal '24', @liquid_render.render("{{24.99 | floor }}")
57
+ end
58
+
59
+ def test_currency_filter
60
+ assert_equal '99,99 RUB', @liquid_render.render("{{99.99 | currency: 'RUB' }}")
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,32 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class LiquidRender
4
+
5
+ def initialize(drops = {})
6
+ @objects_hash = [
7
+ {'name' => 'one', "value" => 10},
8
+ {'name' => 'two', "value" => 5},
9
+ {'name' => 'three', "value" => 6}
10
+ ]
11
+ @registers = {}
12
+ @assigns = {}
13
+ @assigns['objects_arr'] = @objects_hash
14
+ @assigns['now'] = Time.now
15
+ @assigns['today'] = Date.today.strftime(date_format)
16
+ drops.each do |key, drop|
17
+ @assigns[key] = drop
18
+ end
19
+ end
20
+
21
+ def render(content)
22
+ ::Liquid::Template.parse(content).render(::Liquid::Context.new({}, @assigns, @registers)).html_safe
23
+ rescue => e
24
+ e.message
25
+ end
26
+ end
27
+
28
+ module LiquidHelperMethods
29
+ def date_format
30
+ '%d.%m.%Y'
31
+ end
32
+ end
@@ -0,0 +1,14 @@
1
+ require_relative 'cell'
2
+ require_relative 'user'
3
+
4
+ class Issue < ActiveRecord::Base
5
+ belongs_to :cell
6
+ belongs_to :user
7
+ belongs_to :author, class_name: 'User'
8
+
9
+ rcrm_acts_as_draftable
10
+ rcrm_acts_as_taggable
11
+ rcrm_acts_as_viewed
12
+
13
+ scope :visible, lambda { where('1=1') }
14
+ end
@@ -0,0 +1,3 @@
1
+ class News < ActiveRecord::Base
2
+ belongs_to :author, :class_name => 'User'
3
+ end
@@ -0,0 +1,8 @@
1
+ class Cell < ActiveRecord::Base
2
+ STATUS_ACTIVE = 1
3
+ has_many :issues, :dependent => :destroy
4
+
5
+ def active?
6
+ status == STATUS_ACTIVE
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ class User < ActiveRecord::Base
2
+ has_many :issues
3
+
4
+ def self.current
5
+ User.first
6
+ end
7
+
8
+ def anonymous?
9
+ false
10
+ end
11
+ end
@@ -0,0 +1,33 @@
1
+ class Voter < ActiveRecord::Base
2
+ rcrm_acts_as_voter
3
+ end
4
+
5
+ class Votable < ActiveRecord::Base
6
+ rcrm_acts_as_votable
7
+ validates_presence_of :name
8
+ end
9
+
10
+ class VotableVoter < ActiveRecord::Base
11
+ rcrm_acts_as_votable
12
+ rcrm_acts_as_voter
13
+ end
14
+
15
+ class StiVotable < ActiveRecord::Base
16
+ rcrm_acts_as_votable
17
+ end
18
+
19
+ class ChildOfStiVotable < StiVotable
20
+ end
21
+
22
+ class StiNotVotable < ActiveRecord::Base
23
+ validates_presence_of :name
24
+ end
25
+
26
+ class VotableChildOfStiNotVotable < StiNotVotable
27
+ rcrm_acts_as_votable
28
+ end
29
+
30
+ class VotableCache < ActiveRecord::Base
31
+ rcrm_acts_as_votable
32
+ validates_presence_of :name
33
+ end
@@ -0,0 +1,12 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class MoneyHelperTest < ActiveSupport::TestCase
4
+ include YeshouaCrm::MoneyHelper
5
+
6
+ def test_price_to_currency
7
+ assert_equal '$3.265,65', price_to_currency(3265.65, 'BRL')
8
+ assert_equal '3.265,65 RUB', price_to_currency(3265.65, 'RUB')
9
+ assert_equal '3.200,0', price_to_currency(3200, '')
10
+ assert_equal '3.200,0', price_to_currency(3200, 'Foo')
11
+ end
12
+ end
data/test/schema.rb ADDED
@@ -0,0 +1,121 @@
1
+ ActiveRecord::Schema.define version: 0 do
2
+
3
+ create_table :drafts, force: true do |t|
4
+ t.string :target_type
5
+ t.references :user
6
+ t.references :parent, polymorphic: true
7
+ t.binary :data
8
+ t.datetime :updated_at
9
+ end
10
+
11
+ create_table "tags", :force => true do |t|
12
+ t.column "name", :string
13
+ end
14
+
15
+ create_table "taggings", :force => true do |t|
16
+ t.column "tag_id", :integer
17
+ t.column "taggable_id", :integer
18
+ t.column "taggable_type", :string
19
+ t.column "created_at", :datetime
20
+ end
21
+
22
+
23
+ create_table "users", :force => true do |t|
24
+ t.column "name", :string
25
+ t.column "language", :string
26
+ end
27
+
28
+ create_table "issues", :force => true do |t|
29
+ t.integer "cell_id"
30
+ t.column "subject", :string
31
+ t.column "description", :string
32
+ t.column "closed", :boolean
33
+ t.column "cached_tag_list", :string
34
+ t.column "user_id", :integer
35
+ t.column "author_id", :integer
36
+ t.column "views", :integer, :default => 0
37
+ t.column "total_views", :integer, :default => 0
38
+ end
39
+
40
+ create_table "votes", :force => true do |t|
41
+ t.references "votable", :polymorphic => true
42
+ t.references "voter", :polymorphic => true
43
+
44
+ t.boolean "vote_flag"
45
+ t.string "vote_scope"
46
+ t.integer "vote_weight"
47
+ t.string "vote_ip"
48
+
49
+ t.timestamps
50
+ end
51
+
52
+ create_table "news", :force => true do |t|
53
+ t.string "title"
54
+ t.text "description"
55
+ t.integer "author_id"
56
+ end
57
+
58
+ create_table "cells", :force => true do |t|
59
+ t.string "name"
60
+ t.text "description"
61
+ t.string "identifier"
62
+ t.integer "status"
63
+ end
64
+
65
+ create_table :voters, :force => true do |t|
66
+ t.string :name
67
+ end
68
+
69
+ create_table :not_voters, :force => true do |t|
70
+ t.string :name
71
+ end
72
+
73
+ create_table :votables, :force => true do |t|
74
+ t.string :name
75
+ end
76
+
77
+ create_table :votable_voters, :force => true do |t|
78
+ t.string :name
79
+ end
80
+
81
+ create_table :sti_votables, :force => true do |t|
82
+ t.string :name
83
+ t.string :type
84
+ end
85
+
86
+ create_table :sti_not_votables, :force => true do |t|
87
+ t.string :name
88
+ t.string :type
89
+ end
90
+
91
+ create_table :not_votables, :force => true do |t|
92
+ t.string :name
93
+ end
94
+
95
+ create_table :votable_caches, :force => true do |t|
96
+ t.string :name
97
+ t.integer :cached_votes_total
98
+ t.integer :cached_votes_score
99
+ t.integer :cached_votes_up
100
+ t.integer :cached_votes_down
101
+ t.integer :cached_weighted_total
102
+ t.integer :cached_weighted_score
103
+ t.float :cached_weighted_average
104
+
105
+ t.integer :cached_scoped_test_votes_total
106
+ t.integer :cached_scoped_test_votes_score
107
+ t.integer :cached_scoped_test_votes_up
108
+ t.integer :cached_scoped_test_votes_down
109
+ t.integer :cached_scoped_weighted_total
110
+ t.integer :cached_scoped_weighted_score
111
+ t.float :cached_scoped_weighted_average
112
+ end
113
+
114
+ create_table :viewings, :force => true do |t|
115
+ t.column :viewer_id, :integer
116
+ t.column :viewed_id, :integer
117
+ t.column :viewed_type, :string
118
+ t.column :ip, :string, :limit => '24'
119
+ t.column :created_at, :datetime
120
+ end
121
+ end