{"id":22488625,"url":"https://github.com/mockdeep/better","last_synced_at":"2025-08-02T21:31:35.263Z","repository":{"id":3763464,"uuid":"4839777","full_name":"mockdeep/better","owner":"mockdeep","description":"Open. Democratic. Project management platform.","archived":false,"fork":true,"pushed_at":"2022-06-17T23:41:26.000Z","size":35671,"stargazers_count":51,"open_issues_count":10,"forks_count":19,"subscribers_count":12,"default_branch":"main","last_synced_at":"2023-08-15T20:33:25.655Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"bettermeans.com","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"Bettermeans/bettermeans","license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mockdeep.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-06-30T04:26:19.000Z","updated_at":"2023-05-06T12:20:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mockdeep/better","commit_stats":null,"previous_names":[],"tags_count":0,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mockdeep%2Fbetter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mockdeep%2Fbetter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mockdeep%2Fbetter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mockdeep%2Fbetter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mockdeep","download_url":"https://codeload.github.com/mockdeep/better/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228500219,"owners_count":17930019,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-06T17:18:09.595Z","updated_at":"2025-08-02T21:31:35.234Z","avatar_url":"https://github.com/mockdeep.png","language":"Ruby","funding_links":[],"categories":["Ruby"],"sub_categories":[],"readme":"[![Build Status](https://circleci.com/gh/mockdeep/better.svg?style=svg)](https://circleci.com/gh/mockdeep/better)\n[![Code Climate](https://codeclimate.com/github/mockdeep/better.png)](https://codeclimate.com/github/mockdeep/better)\n[![Dependency Status](https://gemnasium.com/mockdeep/better.png)](https://gemnasium.com/mockdeep/better)\n\nlive server hosted at: https://better.boon.gl\n\n*** Use at your own risk!!! There are likely to be vulnerabilities in this\napp!!! ***\n\nSupport this project\n--------------------\n[![Pledgie](https://pledgie.com/campaigns/27557.png)](https://pledgie.com/campaigns/27557)\n[![Flattr this git repo](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=lobati\u0026url=https://github.com/mockdeep/better\u0026title=Better\u0026language=\u0026tags=github\u0026category=software)\n[![Bountysource](https://www.bountysource.com/badge/tracker?tracker_id=416557)](https://www.bountysource.com/trackers/416557-mockdeep-better?utm_source=416557\u0026utm_medium=shield\u0026utm_campaign=TRACKER_BADGE)\n[![Gratipay](https://img.shields.io/gratipay/mockdeep.svg)](https://www.gratipay.com/mockdeep/)\n\nRoadmap\n-------\n1. get code coverage up to 100% -\u003e currently 48.27%\n  - -\u003e controllers\n  - models\n  - helpers\n  - remove lib code to gems where possible\n  - remove unused lib code where possible\n  - libs\n  - any stragglers\n2. add spec files for every method (use \"spec_me\" tags, 1140 and counting)\n3. mutation test every method (use \"heckle_me\" tags, 1641 left)\n4. upgrade to Ruby 1.9\n5. set up Rubocop and clean up code quality\n6. integration test and move vendored gems to Gemfile\n7. integrate rails_best_practices and clean up code\n8. fix password hashing\n9. run Brakeman and fix vulnerabilities\n10. integrate jshint and clean up javascript\n11. rename all references from Bettermeans to Better\n12. upgrade to Rails 3.0, 3.1, 3.2\n13. upgrade to Ruby 2.0, 2.1\n14. upgrade to Rails 4.0, 4.1, 4.2\n15. begin using and extending...\n\nContributing\n------------\n\nThis project is long out of maintenance. I'm trying to bring it up to snuff in\nmy spare time, but as you can see from the commit history, progress is slow.\nIf you are interested in contributing, we are looking to add contributors to\nthe project. All experience levels are welcome. If you're just getting started\nas a developer, please get in touch and I can help you get up and running.\nCheck the [dev notes](https://github.com/mockdeep/better#dev-notes) below for\ndetails on the biggest area we could use help with: testing.\n\nPre-requisites\n--------------\n\nI recommend using rvm to manage your ruby versions: https://rvm.io/\nFor Ubuntu machines, you can install the repo from here: https://github.com/rvm/ubuntu_rvm\nThe repo provides dependencies for older versions of Ruby, so may be your best option.\n\n```sh\n# install ruby:\nrvm install 1.8.7-p374\n\n# set ruby version:\nrvm use 1.8.7\n\n# set the rubygems version:\nrvm rubygems 1.8.25 --force\n\n# need an older version of bundler for now:\ngem install -v 1.10.6 bundler --no-rdoc --no-ri\n\n# install postgres:\n# mac\nbrew install postgres\n# debian linux\nsudo apt-get install postgresql postgresql-client postgresql-contrib\n\n# You will need PostgresQL version 8.4 or thereabouts\n# You can find repos for Linux here: https://wiki.postgresql.org/wiki/Apt\n\n# NOTE: only do this in development mode, as it puts your database in an\n# insecure state.\n# update the end of /etc/postgresql/9.1/main/pg_hba.conf to look like this:\n# # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD\n# # \"local\" is for Unix domain socket connections only\n# local   all         all                               trust\n# # IPv4 local connections:\n# host    all         all         127.0.0.1/32          trust\n# # IPv6 local connections:\n# host    all         all         ::1/128               trust\n\n# then run:\nsudo /etc/init.d/postgresql restart\n\n# set up a postgres user:\nsudo -u postgres createuser -s $(whoami)\n\n# Imagemagick is also a dependency. You'll need an older version to be\n# compatible with rmagick, which can be a bit of a pain on MacOS. See here for\n# more details: http://stackoverflow.com/a/13967303/372479\n# It's easier on Debian Linux:\nsudo apt-get install imagemagick libmagickwand-dev\n\n# and QT\n# Mac:\nbrew install qt\n# Debian Linux:\nsudo apt-get install libqt4-dev libqtwebkit-dev\n```\n\nGetting started\n---------------\n\nFirst fork the repo using the link above, then:\n\n```sh\n# clone your copy:\ngit clone git@github.com:\u003cyour username\u003e/better.git\ncd better/\n\n# Add this copy as upstream:\ngit remote add upstream https://github.com/mockdeep/better.git\n\n# now install gems:\nbundle install\n\n# set up database config:\nmv config/database.yml.example config/database.yml\n\n# in development mode, for the simplest setup you should be able to remove the\n# username and password options from `config/database.yml` for the development\n# and test group\n\n# You'll need to set up aws access keys in your environment. For testing only,\n# you can set the keys to \"trash\" just to run the specs\nexport BETTER_S3_ACCESS_KEY_ID=trash\nexport BETTER_S3_SECRET_ACCESS_KEY=trash\n\n# set up database:\nrake db:create:all \u0026\u0026 rake db:schema:load\n\n# seed data into the database:\nrake db:seed\n\n# set up the test database:\nrake db:test:prepare\n\n# and run the tests:\nrake spec\n\n# if all passes, then you should be good to go. Please open an issue if you\n# have any problems. You can boot up your server on localhost with:\nscript/server\n```\n\nProduction\n----------\n\nYou'll need to set up the following in order to run on production. If you're\ndeploying to Heroku you can push environment variables using\n`heroku config:add MY_VAR=whatevs`.\n\n* A honeybadger.io API key: `BETTER_HONEYBADGER_API_KEY=\u003cyour key here\u003e`\n* S3 access keys:\n  - `S3_ACCESS_KEY_ID=\u003cyour AWS S3 access key id\u003e`\n  - `S3_SECRET_ACCESS_KEY=\u003cyour AWS S3 secret access key`\n* Sendgrid credentials:\n  - `SENDGRID_DOMAIN=\u003cthe domain of your app\u003e`\n  - `SENDGRID_PASSWORD=\u003cyour sendgrid password\u003e`\n  - `SENDGRID_USERNAME=\u003cyour sendgrid username\u003e`\n\nDev notes\n---------\n\nWe're looking to get spec and mutation coverage up to 100%. You will find\nmethods throughout the code base tagged with `spec_me`, `cover_me`, and\n`heckle_me`.  These tags represent three levels of test quality in order of\nincreasing difficulty. Choose your difficulty level and search through the\ncodebase for places you can help like `git grep spec_me`.\n\nWhen the following conditions are met the tag can be removed:\n\n### spec_me\n\nThis is pretty basic. All we need is a unit test hitting the method. For the\nfollowing method:\n\n```ruby\nclass MyClass\n  attr_accessor :awesome\n\n  def initialize\n    awesome = true\n  end\n\n  def some_method\n    if awesome?\n      'awesome!'\n    else\n      'not awesome :('\n    end\n\n    def awesome?\n      !!awesome\n    end\n  end\nend\n```\n\nYou might write a spec that looks like:\n\n```ruby\ndescribe MyClass, '#some_method' do\n  it 'returns \"awesome!\"' do\n    MyClass.new.some_method.should == 'awesome!'\n  end\nend\n```\n\n### cover_me\n\nFor code coverage you would need to expand the above test to include both\nbranches:\n\n```ruby\ndescribe MyClass, '#some_method' do\n  context 'when awesome' do\n    it 'returns \"awesome!\"' do\n      MyClass.new.some_method.should == 'awesome!'\n    end\n  end\n\n  context 'when not awesome' do\n    it 'returns \"not awesome :(\"' do\n      my_instance = MyClass.new\n      my_instance.awesome = false\n      my_instance.some_method.should == 'not awesome :('\n    end\n  end\nend\n```\n\nYou can check the coverage of tests by running `rake spec:rcov`. It generates\na coverage directory. Open `coverage/index.html` in your browser to view the\noutput and find a class that still needs test coverage.\n\n### heckle_me\n\nHeckle coverage is the hardest. Not only do you need cover the code, you need\nto check for various permutations within it.\n[Heckle](https://github.com/seattlerb/heckle) is a gem that performs mutations\non your code and runs your tests against the mutated code.  If your tests don't\nfail then they still need some work. Heckle lists out the changes it made that\ndid not cause your tests to fail.\n\nYou can run heckle like this:\n\n```sh\nspec spec/models/board/visible_predicate_spec.rb --heckle Board#visible?\n```\n\nTranslating\n-----------\n\nYou can find language specific translation groups at:\nhttps://www.transifex.net/projects/p/better/\n\nKnown issues\n------------\n\nAttachments doesn't work in dev environment\n\nLicense and legalese\n--------------------\n\nThis codebase is based largely on the project Bettermeans, which was itself\nbased on Redmine. Both Bettermeans and Redmine are open source and released\nunder the terms of the GNU General Public License v2 (GPL). Better is also\nGPLv2.\n\nAll Redmine code is Copyright (C) 2006-2011  Jean-Philippe Lang\n\nAll Bettermeans code is Copyright (C) Shereef Bishay\n\nAll Better code is Copyright (C) Robert Fletcher\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmockdeep%2Fbetter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmockdeep%2Fbetter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmockdeep%2Fbetter/lists"}